Microsoft Cloud Access Tokens
Marius Elmiger
Die potenziellen Risiken, die von fremden Workloadidentitäten ausgehen
In diesem Artikel wird ein Beispiel präsentiert, wie Microsoft Entra Workload-Identitäten versehentlich die Sicherheitsgrenze eines Entra-Tenants auf einen fremden Tenant ausweiten können.
Eine Security Boundary ist die Definition einer logischen oder physischen Grenze, die IT-Umgebungen oder -Lösungen voneinander trennen soll. Bei einer neuen Active Directory Installation ist die Security Boundary der Forest. Für Entra ID wäre es der Tenant. Die Security Boundary kann absichtlich oder unabsichtlich erweitert werden, indem Beziehungen zu anderen IT-Lösungen hergestellt werden, die nicht Teil der ursprünglichen Implementierung sind. Regelmässige Audits, robuste Protokolle und Sicherheitstools können helfen, die Integrität dieser Grenzen zu wahren. Letztendlich geht es darum, ein Gleichgewicht zwischen Zugänglichkeit und Sicherheit zu finden und sicherzustellen, dass die richtige Entität zur richtigen Zeit den richtigen Zugriff hat. Weitere Beispiele für Beziehungen, die die Security Boundary erweitern können, sind im Artikel Attack Path Analysis beschrieben.
Workload-Identitäten in der Microsoft Cloud beschreiben nicht persönliche Konten, die einem Workload wie einer Anwendung, einem Dienst, einer virtuellen Maschine, einem Skript oder einem Container zugeordnet sind, um sich zu authentifizieren und auf andere Dienste und Ressourcen zuzugreifen. Microsoft beschreibt drei Arten von Workload-Identitäten im Artikel Workload-Identitäten.
Der Zugriff für Service Principals auf Ressourcen kann mit Delegations- oder Application-API-Berechtigungen zugewiesen werden und erfordert die Zustimmung des Administrators oder des Benutzers.
API-Berechtigungen ermöglichen den Service Principal der Anwendung, andere öffentliche APIs aufzurufen, wenn die Benutzer oder Administratoren dem zugestimmt haben. API-Berechtigungen werden oft im Resource.Operation.Constraint
scope format angegeben. Zum Beispiel bedeutet Directory.Read.All
, dass der Service Principal, dem diese Berechtigung erteilt wurde, Daten im Tenant lesen kann, z. B. Benutzer, Gruppen und Apps.
App-Rollen definieren Zugriffsdefinitionen für die Anwendung. Eine Rolle kann mehrere Berechtigungen beinhalten. Für Microsoft Graph existieren zum Beispiel mehrere Anwendungsrollen. Directory.Read.All
ist eine von ihnen. Der einfachste Weg, die detaillierten API-Berechtigungen zu überprüfen, die zum Beispiel von der Anwendungsrolle Directory.Read.All
gewährt werden, ist der Besuch der Website Microsoft Graph Permission Explorer von Merill Fernando.
Nach einer kurzen Einführung, was Security Boundaries, Entra Applications und Entra Service Principals sind, wird im nächsten Kapitel anhand eines sehr praktischen Beispiels gezeigt, wie eine multi-tenant Anwendung eine Security Boundary Erweiterung zur Folge haben kann. Falls die obigen Erklärungen zu kurz waren, erklärt der Artikel von Thomas Naunheim Entra Workload Identities im Detail. Andy Robbins von SpecterOps hat ausserdem einen Artikel über den jüngsten Microsoft-Entra-Breach Was ist passiert? What should Azure Admins do? veröffentlicht, in dem er sehr detailliert erklärt, wie externe multi-tenant Anwendungen während des Angriffs genutzt wurden. Beide Artikel sind sehr lesenswert.
Der Tenant-Administrator von mytenant.onmicrosoft.com
registriert eine multi-tenant Anwendung vom Tenant foreigntenant.onmicrosoft.com
. Die Anwendung verspricht ein reibungsloses Entra-Rollenmanagement. Nachdem der globale Administrator die Anwendung mit den Geltungsbereichen RoleManagement.ReadWrite.Directory
und Directory.Read.All
akzeptiert hat, wird im mytenant.onmicrosoft.com
Tenant automatisch ein Service Principal als lokale Repräsentation der Anwendung erstellt. Durch diese Aktion wurde die Security Boundary versehentlich auf den nicht vertrauenswürdigen Tenant foreigntenant.onmicrosoft.com
ausgeweitet.
Der folgende Schritt-für-Schritt-POC untersucht die in der obigen Abbildung dargestellten Auswirkungen im Detail.
mytenant.onmicrosoft.com
und foreigntenant.onmicrosoft.com
)foreigntenant.onmicrosoft.com
unter https://portal.azure.com.Microsoft Entra ID
App-Registrierungen
Neue Registrierung
Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant)
Daemon application
Node.js console
standard user
. Die URL wird später für Schritt 1 benötigtCertificates & secrets
navigierenAPI permissions
navigierenAdd a permission
Microsoft Graph
auswählenApplication permissions
auswählenRoleManagement.ReadWrite.Directory
und Directory.Read.All
Add permissions
auswählen für beide App rolesNachdem Schritt 0 abgeschlossen ist, kann die foreignApp Anwendung im mytenant.onmicrosoft.com
Tenant registriert werden. Die gesamte Einrichtung könnte noch verbessert werden, indem eine Webanwendung erstellt und eine Antwortadresse konfiguriert wird. Für den POC ist dies jedoch optional.
mytenant.onmicrosoft.com
Tenant über https://porta.azure.comhttps://login.microsoftonline.com/organizations/adminconsent?client_id=e037294a-d64a-4242-977a-3868012d69a5
mytenant.onmicrosoft.com
erfolgreich an die Organisation foreignapp.onmicrosoft.com
übergeben. Wer auch immer das ist (?) Einige öffentlich zugängliche Informationen können mit dem praktischen OSINT-Tool für Tenant-Informationen von DrAzureAD überprüft werden. Aber was ist eigentlich im Hintergrund passiert? Übrigens, der Fehler: Keine Antwortadresse für die Anwendung registriert
kann ignoriert werden, da alles auch ohne Antwortadresse funktioniert hat.mytenant.onmicrosoft.com
nun im Azure-Portal zu Enterprise Applications
wechseln. Ein Service Principal mit dem Namen foreignApp
wurde erfolgreich erstellt, um die multi-tenant Anwendung zu repräsentieren. Die Application ID kann mit der Application (Client) ID aus Schritt 0 verglichen werden. Diese sind identisch.foreignApp
und zu Permissions
navigieren. Nun kann man die zuvor genehmigten Berechtigungen einschliesslich des Genehmigungsstatus des Administrators sehen.Ok, das Szenario ist vorbereitet, jetzt kommt der interessante Teil.
Die nächsten Schritte werden per Skript ausgeführt, da dies die einzige Möglichkeit ist, sich mit einem Service Principal anzumelden. Das Skript heisst consentIsTheMindkiller.ps1 und ist im Gist-Repository zu finden.
$myTenantId = "cdfdd915-..." # Der Tenant, der die Anwendung nutzen möchte (Source: My Tenant) $foreignTenantId = "d2a16643-37f9-..." # Der Tenant, welcher die Anwendung betreibt (Source: Foreign Tenant) $spPassword = "1N98Q~qo7oKGhA3L~t~OgQKVDPL.iasdas32" # Das client secret von der Anwendung (Source: Foreign Tenant) $appName = "foreignApp" # Der Anwendungsname (Source: Foreign Tenant)
foreignapp.onmicrosoft.com
, um die Anwendungs-ID abzufragen.$foreignApp = Get-MgServicePrincipal -All -Filter $appFilter
mytenant.onmicrosoft.com
, um sich mit den Anmeldedaten von foreignapp.onmicrosoft.com
beim Tenant mytenant.onmicrosoft.com
anzumelden.$spPwd= ConvertTo-SecureString $spPassword -AsPlainText -Force $psCred = New-Object System.Management.Automation.PSCredential($foreignApp.AppId, $spPwd) Connect-MgGraph -TenantId $myTenantId -ClientSecretCredential $psCred -NoWelcome
RoleManagement.ReadWrite.Directory
fügt das Skript den Service Principal der foreignapp der Rolle Global Administrator hinzu.$globalAdmin = Get-MgDirectoryRole | Where-Object { $_.DisplayName -eq "Global Administrator" } New-MgDirectoryRoleMemberByRef -DirectoryRoleId $globalAdmin.Id -BodyParameter @{"@odata.id" = "https://graph.microsoft.com/v1.0/directoryObjects/$($foreignsp.id)"}
Bei der Genehmigung von Rechten zu fremden Applikationen, kann die Security Boundary auf den Tenant der fremden Applikation ausgeweitet werden. Schliesslich funktioniert SaaS auf diese Weise. Jedoch haben wir keine Möglichkeit gefunden, auf dem fremden Tenant über das Azure-Portal oder die Graph-API abzufragen wer die multi-tenant Anwendung nun schlussendlich verwendet. Das wäre aber natürlich möglich, wenn der fremde Tenant eine Website hosten würde, die den Administrator zur Registrierung und schliesslich zur Nutzung der Anwendung leitet. Aber wenn man in einem Tenant landen und viele multi-tenant Apps findet, wäre es momentan nicht trivial, einen Ziel-Tenant zu evaluieren, um das oben beschriebene Szenario zu missbrauchen. Es sei denn, es handelt sich um eine bekannte Anwendung.
Was kann dagegen gemacht werden? Zunächst einmal ist es wichtig, jede fremde SaaS-Anwendung zu überprüfen, bevor Anwendungsberechtigungen oder Delegationen erteilt werden. Danach sollte der folgende Schritt 3 dabei helfen, bestehende foreign Service Principals in einem Tenant zu überprüfen.
In diesem Schritt sind wir der Administrator des Tenants mytenant.onmicrosoft.com
, der zuvor die Anwendungsberechtigungen akzeptiert hat.
mytenant.onmicrosoft.com
anzumelden, der berechtigt ist, Service Principal Informationen zu lesen.mytenant.onmicrosoft.com
haben, und zwar über das Attribut AppOwnerOrganisationId
. Das Ergebnis wird in der Befehlszeile und in der PowerShell-Grid-Ansicht angezeigt.$foreignsp = Get-MgServicePrincipal -All | Where-Object { $_.AppOwnerOrganizationId -ne $myTenantId -and $_.AppOwnerOrganizationId -ne $null }
approleValue
und appDisplayname
sind die App-Rollen, die der resourceDisplayName
zugewiesen wurden.In einem produktiven Tenant ist Schritt 3 eine wichtige Prüfungsaufgabe, um die Berechtigungen der Foreign Service Principals zu überprüfen. Schritt 3 ist auch als separates Skript verfügbar. Das Skript heisst checkForForeignServicePrincipals.ps1 und ist im Gist-Repository zu finden.
Eine der vielen Herausforderungen in jeder IT-Umgebung und insbesondere in der Cloud besteht darin, die Security Boundary nicht versehentlich auf eine unbekannte, nicht vertrauenswürdige Entität auszuweiten. In einem Microsoft-Cloud-Tenant gibt es verschiedene Möglichkeiten, dies zu tun, z. B. über Azure Lighthouse, granulare delegierte Administratorrechte (GDAP), multi-tenant Anwendungen, Lösungen von Drittanbietern, die nur Cloud-Konten unterstützen, Agenten von Drittanbietern für IaaS-Workloads und DevOps-Lösungen. In einer Active Directory-Umgebung existieren ähnliche Herausforderungen, obwohl die Cloud eine gefährlichere Angriffsfläche bietet. Wie das obige Beispiel zeigt, genügt ein einziger Klick eines privilegierten Administrators, um die Security Boundary zu einem fremden Tenant zu erweitern. Umso wichtiger ist es, die Security Boundary eines Tenants zu kennen und neue Funktionen in einem nicht produktiven Tenant zu testen. IT-Administratoren sollten ausreichend geschult sein, um über das Wissen zum Betrieb einer Cloud-Umgebung zu verfügen. Bei unseren Prüfungen stellen wir oft fest, dass Workload Identities und ihre Möglichkeiten nicht vollständig verstanden werden, weshalb sie in unseren Top 10 Riskiest Cloud Configurations aufgeführt sind. Microsoft macht es ausserdem nicht einfach, Workload Identities und ihre Berechtigungen zu verwalten und zu überprüfen. Tools wie ROADTools, BloodHound, Skripte wie Export-MsIdAppConsentGrantReport oder die automatische Überwachung von Workload Identities-Berechtigungen und -Änderungen, wie zum Beispiel in Hunting Service Principals with Microsoft Sentinal beschrieben, können helfen, Workload Identities unter Kontrolle zu bekommen.
Lassen Sie durch uns einen Social Engineering Test durchführen!
Marius Elmiger
Marius Elmiger
Marius Elmiger
Marius Elmiger
Unsere Spezialisten kontaktieren Sie gern!