BARK steht für BloodHound Attack Research Kit. Es handelt sich um ein PowerShell-Skript, das das BloodHound Enterprise-Team bei der Recherche und kontinuierlichen Validierung von Missbrauchsprimitiven unterstützen soll. BARK konzentriert sich derzeit auf die Azure-Produkt- und Service-Suite von Microsoft.
BARK erfordert keine Abhängigkeiten von Dritten. Die Funktionen von BARK sind so einfach und wartbar wie möglich gestaltet. Die meisten Funktionen sind sehr einfache Wrapper zum Senden von Anfragen an verschiedene REST-API-Endpunkte. Die Grundfunktionen von BARK erfordern nicht einmal einander – Sie können fast jede BARK-Funktion aus BARK ziehen und sie funktioniert perfekt als eigenständige Funktion in Ihren eigenen Skripten.
Hauptautor: Andy Robbins @_wald0
Mitwirkende:
Es gibt viele Möglichkeiten, ein PowerShell-Skript zu importieren. Hier ist eine Möglichkeit:
Laden Sie zunächst BARK.ps1 herunter, indem Sie dieses Repo klonen oder einfach seinen Rohinhalt von GitHub kopieren/einfügen.
git clone https://github.com/BloodHoundAD/BARK
Wechseln Sie nun mit der CD in das Verzeichnis, in dem sich die PS1 befindet:
cd BARK
Schließlich können Sie die PS1 wie folgt punktimportieren:
. .BARK.ps1
Drücken Sie die Eingabetaste und Ihre PowerShell-Instanz hat nun Zugriff auf alle Funktionen von BARK.
Mit sehr wenigen Ausnahmen ist für die Interaktion mit Azure-API-Endpunkten eine Authentifizierung erforderlich. BARK verfügt über einige Funktionen, die Ihnen dabei helfen, die notwendigen Token für die Interaktion mit den MS Graph- und Azure REST-APIs zu erwerben. Für jede BARK-Funktion, die mit einer Azure-API interagiert, die eine Authentifizierung erfordert, müssen Sie ein Token angeben.
Angenommen, Sie möchten alle Benutzer in einem Entra ID-Mandanten auflisten. Sie müssen zunächst ein für MS Graph gültiges Token erhalten. Es gibt viele Möglichkeiten, dieses Token zu erhalten:
Wenn Sie über eine Kombination aus Benutzername und Passwort für einen Entra-Benutzer in diesem Mandanten verfügen, können Sie zunächst mit der Funktion Get-EntraRefreshTokenWithUsernamePassword
von BARK ein Aktualisierungstoken für den Benutzer erwerben:
$MyRefreshTokenRequest = Get-EntraRefreshTokenWithUsernamePassword -username "[email protected]" -password "MyVeryCoolPassword" -TenantID "contoso.onmicrosoft.com"
Das resultierende Objekt, das Sie gerade erstellt haben, $MyRefreshTokenRequest
, enthält als Teil ein Aktualisierungstoken für Ihren Benutzer. Mit diesem Aktualisierungstoken können Sie jetzt ein MS Graph-Token anfordern:
$MyMSGraphToken = Get-MSGraphTokenWithRefreshToken -RefreshToken $MyRefreshTokenRequest.refresh_token -TenantID "contoso.onmicrosoft.com"
Jetzt verfügt dieses neue Objekt, $MyMSGraphToken
, als einen seiner Eigenschaftswerte über ein JWT im MS Graph-Bereich für Ihren Benutzer. Sie können nun dieses Token verwenden, um alle Benutzer im Entra-Mandanten aufzulisten:
$MyUsers = Get-AllEntraUsers -Token $MyMSGraphToken.access_token -ShowProgress
Sobald Sie fertig sind, wird die Variable $MyEntraUsers
mit Objekten gefüllt, die alle Benutzer in Ihrem Entra-Mandanten repräsentieren.
Get-AzureKeyVaultTokenWithClientCredentials
fordert ein Token von STS an, wobei Azure Vault mithilfe einer Client-ID und eines Geheimnisses als Ressource/beabsichtigte Zielgruppe angegeben wird.Get-AzureKeyVaultTokenWithUsernamePassword
fordert unter Verwendung eines vom Benutzer bereitgestellten Benutzernamens und Kennworts ein Token von STS an, wobei Azure Vault als Ressource/beabsichtigte Zielgruppe angegeben wird.Get-AzurePortalTokenWithRefreshToken
fordert ein Azure Portal Auth Refresh-Token mit einem vom Benutzer bereitgestellten Aktualisierungstoken an.Get-AzureRMTokenWithClientCredentials
fordert ein AzureRM-bezogenes JWT mit einer Client-ID und einem Geheimnis an. Nützlich für die Authentifizierung als Entra-Dienstprinzipal.Get-AzureRMTokenWithPortalAuthRefreshToken
fordert ein AzureRM-bezogenes JWT mit einem vom Benutzer bereitgestellten Azure Portal Auth Refresh-Token an.Get-AzureRMTokenWithRefreshToken
fordert ein AzureRM-bezogenes JWT mit einem vom Benutzer bereitgestellten Aktualisierungstoken an.Get-AzureRMTokenWithUsernamePassword
fordert ein AzureRM-bezogenes JWT mit einem vom Benutzer bereitgestellten Benutzernamen und Kennwort an.Get-EntraRefreshTokenWithUsernamePassword
fordert eine Sammlung von Token, einschließlich eines Aktualisierungstokens, von login.microsoftonline.com mit einem vom Benutzer bereitgestellten Benutzernamen und Kennwort an. Dies schlägt fehl, wenn der Benutzer Anforderungen an die Multi-Faktor-Authentifizierung hat oder von einer Richtlinie für bedingten Zugriff betroffen ist.Get-MSGraphTokenWithClientCredentials
fordert ein JWT im MS Graph-Bereich mit einer Client-ID und einem Geheimnis an. Nützlich für die Authentifizierung als Entra-Dienstprinzipal.Get-MSGraphTokenWithPortalAuthRefreshToken
fordert ein JWT im MS Graph-Bereich mit einem vom Benutzer bereitgestellten Azure Portal Auth Refresh-Token an.Get-MSGraphTokenWithRefreshToken
fordert ein JWT im MS Graph-Bereich mit einem vom Benutzer bereitgestellten Aktualisierungstoken an.Get-MSGraphTokenWithUsernamePassword
fordert ein JWT im MS Graph-Bereich mit einem vom Benutzer bereitgestellten Benutzernamen und Kennwort an.Parse-JWTToken
nimmt ein Base64-codiertes JWT als Eingabe und analysiert es für Sie. Nützlich zur Überprüfung der korrekten Token-Zielgruppe und -Ansprüche.Die auf Aktualisierungstoken basierenden Funktionen in BARK basieren auf Funktionen in TokenTactics von Steve Borosh.
Get-AllEntraApps
sammelt alle Entra-Anwendungsregistrierungsobjekte.Get-AllEntraGroups
sammelt alle Entra-Gruppen.Get-AllEntraRoles
sammelt alle Entra-Administratorrollen.Get-AllEntraServicePrincipals
sammelt alle Entra-Dienstprinzipalobjekte.Get-AllEntraUsers
sammelt alle Entra-Benutzer.Get-EntraAppOwner
sammelt Besitzer einer Entra-App-Registrierung.Get-EntraDeviceRegisteredUsers
sammelt Benutzer eines Entra-Geräts.Get-EntraGroupMembers
sammelt Mitglieder einer Entra-Gruppe.Get-EntraGroupOwner
sammelt Besitzer einer Entra-Gruppe.Get-EntraRoleTemplates
sammelt Entra-Administratorrollenvorlagen.Get-EntraServicePrincipal
erfasst einen Entra-Dienstprinzipal.Get-EntraServicePrincipalOwner
sammelt Besitzer eines Entra-Dienstprinzipals.Get-EntraTierZeroServicePrincipals
sammelt Entra-Dienstprinzipale, die über eine Tier-Zero-Entra-Administratorrolle oder eine Tier-Zero-MS-Graph-App-Rolle verfügen.Get-MGAppRoles
sammelt die App-Rollen, die vom MS Graph-Dienstprinzipal zur Verfügung gestellt werden. Get-AllAzureManagedIdentityAssignments
sammelt alle verwalteten Identitätszuweisungen.Get-AllAzureRMAKSClusters
sammelt alle Kubernetes-Dienstcluster unter einem Abonnement.Get-AllAzureRMAutomationAccounts
sammelt alle Automatisierungskonten unter einem Abonnement.Get-AllAzureRMAzureContainerRegistries
sammelt alle Containerregistrierungen unter einem Abonnement.Get-AllAzureRMFunctionApps
sammelt alle Funktions-Apps unter einem Abonnement.Get-AllAzureRMKeyVaults
sammelt alle Schlüsseltresore im Rahmen eines Abonnements.Get-AllAzureRMLogicApps
sammelt alle Logik-Apps unter einem Abonnement.Get-AllAzureRMResourceGroups
sammelt alle Ressourcengruppen unter einem Abonnement.Get-AllAzureRMSubscriptions
sammelt alle AzureRM-Abonnements.Get-AllAzureRMVMScaleSetsVMs
sammelt alle virtuellen Maschinen unter einer VM-Skalierungsgruppe.Get-AllAzureRMVMScaleSets
sammelt alle VM-Skalierungsgruppen unter einem Abonnement.Get-AllAzureRMVirtualMachines
sammelt alle virtuellen Maschinen unter einem Abonnement.Get-AllAzureRMWebApps
sammelt alle Web-Apps unter einem Abonnement.Get-AzureAutomationAccountRunBookOutput
führt ein Automatisierungskonto-Runbook aus und ruft dessen Ausgabe ab.Get-AzureFunctionAppFunctionFile
sammelt die Rohdatei (normalerweise Quellcode) einer Funktions-App-Funktion.Get-AzureFunctionAppFunctions
sammelt alle Funktionen unter einer Funktions-App.Get-AzureFunctionAppMasterKeys
sammelt alle Hauptschlüssel unter einer Funktions-App.Get-AzureFunctionOutput
führt eine Funktions-App-Funktion aus und ruft deren Ausgabe ab.Get-AzureRMKeyVaultSecretValue
erfasst einen Schlüsseltresor-Geheimniswert.Get-AzureRMKeyVaultSecretVersions
sammelt alle Versionen eines Schlüsseltresorgeheimnisses.Get-AzureRMKeyVaultSecrets
sammelt alle Geheimnisse unter einem Schlüsseltresor.Get-AzureRMRoleAssignments
sammelt alle Rollenzuweisungen für ein Objekt.Get-AzureRMRoleDefinitions
sammelt alle im Abonnementbereich beschriebenen Rollendefinitionen, einschließlich benutzerdefinierter Rollen.Get-AzureRMWebApp
sammelt eine Web-App. Get-IntuneManagedDevices
sammelt von Intune verwaltete Geräte.Get-IntuneRoleDefinitions
sammelt verfügbare Intune-Rollendefinitionen. Add-MemberToEntraGroup
versucht, einen Prinzipal zu einer Entra-Gruppe hinzuzufügen.Enable-EntraRole
versucht, die Entra-Rolle zu aktivieren (oder zu „aktivieren“).New-EntraAppOwner
versucht, einer Entra-App einen neuen Besitzer hinzuzufügen.New-EntraAppRoleAssignment
versucht, einem Dienstprinzipal eine App-Rolle zuzuweisen. Beispielsweise können Sie damit einem Dienstprinzipal die App-Rolle RoleManagement.ReadWrite.Directory zuweisen.New-EntraAppSecret
versucht, ein neues Geheimnis für eine bestehende Entra-App-Registrierung zu erstellen.New-EntraGroupOwner
versucht, einer Entra-Gruppe einen neuen Besitzer hinzuzufügen.New-EntraRoleAssignment
versucht, einem angegebenen Prinzipal eine Entra-Administratorrolle zuzuweisen.New-EntraServicePrincipalOwner
versucht, einem Entra-Dienstprinzipal einen neuen Besitzer hinzuzufügen.New-EntraServicePrincipalSecret
versucht, ein neues Geheimnis für einen vorhandenen Entra-Dienstprinzipal zu erstellen.Reset-EntraUserPassword
versucht, das Passwort eines anderen Benutzers zurückzusetzen. Bei Erfolg enthält die Ausgabe das neue, von Azure generierte Kennwort des Benutzers.Set-EntraUserPassword
versucht, das Passwort eines anderen Benutzers auf einen neuen, vom Benutzer bereitgestellten Wert festzulegen. Invoke-AzureRMAKSRunCommand
weist den AKS-Cluster an, einen Befehl auszuführen.Invoke-AzureRMVMRunCommand
versucht, einen Befehl auf einer VM auszuführen.Invoke-AzureRMWebAppShellCommand
versucht, einen Befehl für einen Web-App-Container auszuführen.Invoke-AzureVMScaleSetVMRunCommand
versucht, einen Befehl auf einer VM-Skalierungssatz-VM auszuführen.New-AzureAutomationAccountRunBook
versucht, einem Automatisierungskonto ein Runbook hinzuzufügen.New-AzureKeyVaultAccessPolicy
versucht, einem Prinzipal die Berechtigungen „Get“ und „List“ für die Geheimnisse, Schlüssel und Zertifikate eines Schlüsseltresors zu erteilen.New-AzureRMRoleAssignment
versucht, einem bestimmten Prinzipal über einen bestimmten Bereich eine vom Benutzer angegebene AzureRM-Rollenzuweisung zu erteilen.New-PowerShellFunctionAppFunction
versucht, eine neue PowerShell-Funktion in einer Funktions-App zu erstellen. ConvertTo-Markdown
wird zum Massieren der Ausgabe der Invoke-Tests-Funktionen zur Verwendung auf einer anderen Plattform verwendet.Invoke-AllAzureMGAbuseTests
führt alle Missbrauchsvalidierungstests durch, die durch das Halten einer MS Graph-App-Rolle ausgeführt werden können. Gibt ein Objekt zurück, das beschreibt, welche Berechtigungen bei der Durchführung jedes Missbrauchstests erfolgreich waren.Invoke-AllAzureRMAbuseTests
führt alle AzureRM-Missbrauchsvalidierungstests durch und gibt ein resultierendes Objekt aus, das beschreibt, welchen AzureRM-Rollen die Berechtigung zum Ausführen jedes Missbrauchs gewährt wurde.Invoke-AllEntraAbuseTests
führt alle Missbrauchsvalidierungstests durch, die von Prinzipalen ausgeführt werden können, denen Entra-Administratorrollen zugewiesen wurden. Gibt ein Objekt zurück, das beschreibt, welche Berechtigungen bei der Durchführung jedes Missbrauchstests erfolgreich waren.New-EntraIDAbuseTestSPs
erstellt einen neuen Dienstprinzipal pro aktiver Entra-Administratorrolle und weist jedem Dienstprinzipal die entsprechende Rolle zu. Gibt Klartext-Anmeldeinformationen zurück, die für jeden Dienstprinzipal erstellt wurden.New-EntraIDAbuseTestUsers
erstellt einen neuen Benutzer pro aktiver Entra-Administratorrolle und weist jedem Benutzer die entsprechende Rolle zu. Gibt die für jeden Benutzer erstellten Nur-Text-Anmeldeinformationen zurück.New-IntuneAbuseTestUsers
erstellt einen neuen Benutzer pro Intune-Rolle und weist jedem Benutzer die entsprechende Rolle zu. Gibt die für jeden Benutzer erstellten Nur-Text-Anmeldeinformationen zurück.New-MSGraphAppRoleTestSPs
erstellt einen neuen Dienstprinzipal pro MS Graph-App-Rolle und weist jedem Dienstprinzipal die entsprechende Rolle zu. Gibt Klartext-Anmeldeinformationen zurück, die für jeden Dienstprinzipal erstellt wurden.New-TestAppReg
erstellt ein Anwendungsregistrierungsobjekt für den expliziten Zweck des Missbrauchsvalidierungstests.New-TestSP
erstellt einen neuen Dienstprinzipal und ordnet ihn der durch die obige Funktion erstellten App zu.Remove-AbuseTestAzureRMRoles
ist eine Bereinigungsfunktion zum Entfernen von AzureRM-Administratorrollen, die während des Tests erstellt wurden.Remove-AbuseTestServicePrincipals
bereinigt Missbrauchstests, indem es die Dienstprinzipale entfernt, die während des Tests erstellt wurden.Test-AzureRMAddSelfToAzureRMRole
wird bei Missbrauchsvalidierungstests verwendet, um zu bestimmen, ob ein Dienstprinzipal mit bestimmten Rechten sich selbst die Rolle „Benutzerzugriffsadministrator“ über ein Abonnement gewähren kann.Test-AzureRMCreateFunction
wird bei Missbrauchsvalidierungstests verwendet, um zu testen, ob ein Dienstprinzipal einer vorhandenen Funktions-App eine neue Funktion hinzufügen kann.Test-AzureRMPublishAutomationAccountRunBook
wird verwendet, um zu testen, ob ein Dienstprinzipal ein neues Runbook in einem vorhandenen Automatisierungskonto veröffentlichen kann.Test-AzureRMVMRunCommand
wird verwendet, um zu testen, ob ein Prinzipal einen Befehl auf einer vorhandenen VM ausführen kann.Test-MGAddMemberToNonRoleEligibleGroup
wird verwendet, um zu testen, ob der Dienstprinzipal sich selbst einer nicht rollenberechtigten Gruppe hinzufügen kann.Test-MGAddMemberToRoleEligibleGroup
wird verwendet, um zu testen, ob der Dienstprinzipal sich selbst einer rollenberechtigten Gruppe hinzufügen kann.Test-MGAddOwnerToNonRoleEligibleGroup
wird verwendet, um zu testen, ob ein Dienstprinzipal sich explizit den Besitz einer nicht rollenberechtigten Gruppe gewähren kann.Test-MGAddOwnerToRoleEligibleGroup
wird verwendet, um zu testen, ob ein Dienstprinzipal sich explizit den Besitz einer rollenberechtigten Gruppe gewähren kann.Test-MGAddRootCACert
wird verwendet, um zu testen, ob ein Dienstprinzipal dem Mandanten ein neues Root-CA-Zertifikat hinzufügen kann.Test-MGAddSecretToApp
wird verwendet, um zu testen, ob der Dienstprinzipal einer vorhandenen App ein neues Geheimnis hinzufügen kann.Test-MGAddSecretToSP
wird verwendet, um zu testen, ob der Dienstprinzipal einem vorhandenen Dienstprinzipal ein neues Geheimnis hinzufügen kann.Test-MGAddSelfAsOwnerOfApp
wird bei Missbrauchsvalidierungstests verwendet, um zu bestimmen, ob ein Dienstprinzipal mit einer bestimmten Berechtigung sich selbst den Besitz einer vorhandenen Entra-App gewähren kann.Test-MGAddSelfAsOwnerOfSP
wird bei Missbrauchsvalidierungstests verwendet, um zu bestimmen, ob ein Dienstprinzipal mit einer bestimmten Berechtigung sich selbst den Besitz eines vorhandenen Entra-Dienstprinzipals gewähren kann.Test-MGAddSelfToEntraRole
wird bei Missbrauchsvalidierungstests verwendet, um zu bestimmen, ob ein Dienstprinzipal mit einer bestimmten Berechtigung sich selbst zu einer Entra-Administratorrolle hinzufügen kann – beispielsweise „Global Admin“.Test-MGAddSelfToMGAppRole
wird bei Missbrauchsvalidierungstests verwendet, um zu bestimmen, ob ein Dienstprinzipal mit einer bestimmten Berechtigung sich selbst eine bestimmte MS Graph-App-Rolle ohne Zustimmung des Administrators gewähren kann.