
BloodHound Attack Research Kit

BARK steht für BloodHound Attack Research Kit. Es ist ein PowerShell-Skript, das entwickelt wurde, um das BloodHound Enterprise Team bei der Erforschung und kontinuierlichen Validierung von Missbrauchsprimitiven zu unterstützen. BARK konzentriert sich derzeit auf Microsofts Azure-Produktpalette und -Dienste.
BARK benötigt keine Abhängigkeiten von Drittanbietern. Die Funktionen von BARK sind so einfach und wartbar wie möglich gestaltet. Die meisten Funktionen sind sehr einfache Wrapper für Anfragen an verschiedene REST-API-Endpunkte. Die grundlegenden Funktionen von BARK benötigen nicht einmal einander - Sie können fast jede BARK-Funktion aus BARK herausnehmen und sie wird perfekt als eigenständige Funktion in Ihren eigenen Skripten funktionieren.
Hauptautor: Andy Robbins @_wald0
Mitwirkende:
Es gibt viele Möglichkeiten, ein PowerShell-Skript zu importieren. Hier ist eine Möglichkeit:
Laden Sie zuerst BARK.ps1 herunter, indem Sie dieses Repository klonen oder einfach die Rohinhalte von GitHub kopieren und einfügen.
git clone https://github.com/BloodHoundAD/BARK
Wechseln Sie nun mit cd in das Verzeichnis, in dem sich die PS1-Datei befindet:
cd BARK
Schließlich können Sie die PS1-Datei wie folgt dot-importieren:
. .\BARK.ps1
Drücken Sie die Eingabetaste, und Ihre PowerShell-Instanz hat nun Zugriff auf alle Funktionen von BARK.
Mit wenigen Ausnahmen erfordern Azure-API-Endpunkte eine Authentifizierung für die Interaktion. BARK enthält einige Funktionen, die Ihnen helfen, die erforderlichen Token für die Interaktion mit den MS Graph- und Azure-REST-APIs zu erhalten. Jede BARK-Funktion, die mit einer Azure-API interagiert, die eine Authentifizierung erfordert, benötigt die Angabe eines Tokens.
Angenommen, Sie möchten alle Benutzer in einem Entra-ID-Mandanten auflisten. Zuerst müssen Sie ein Token mit MS Graph-Bereich erhalten. Es gibt viele Möglichkeiten, dieses Token zu erhalten:
Wenn Sie eine Benutzername/Kennwort-Kombination für einen Entra-Benutzer in diesem Mandanten haben, können Sie zunächst ein Aktualisierungstoken für den Benutzer mit der Funktion Get-EntraRefreshTokenWithUsernamePassword von BARK abrufen:
$MyRefreshTokenRequest = Get-EntraRefreshTokenWithUsernamePassword -username "[email protected]" -password "MyVeryCoolPassword" -TenantID "contoso.onmicrosoft.com"
Das resultierende Objekt, das Sie gerade erstellt haben, $MyRefreshTokenRequest, wird als Teil davon ein Aktualisierungstoken für Ihren Benutzer enthalten. Sie können nun ein MS Graph-bezogenes Token mit diesem Aktualisierungstoken anfordern:
$MyMSGraphToken = Get-MSGraphTokenWithRefreshToken -RefreshToken $MyRefreshTokenRequest.refresh_token -TenantID "contoso.onmicrosoft.com"
Dieses neue Objekt, $MyMSGraphToken, wird als einen seiner Eigenschaftswerte ein MS Graph-bezogenes JWT für Ihren Benutzer enthalten. Sie sind nun bereit, dieses Token zu verwenden, um alle Benutzer im Entra-Mandanten aufzulisten:
$MyUsers = Get-AllEntraUsers -Token $MyMSGraphToken.access_token -ShowProgress
Nach Abschluss 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 als Ressource/Zielgruppe angegeben wird, unter Verwendung einer Client-ID und eines Geheimnisses.Get-AzureKeyVaultTokenWithUsernamePassword fordert ein Token von STS an, wobei Azure Vault als Ressource/Zielgruppe angegeben wird, unter Verwendung eines benutzerbereitgestellten Benutzernamens und Kennworts.Get-AzurePortalTokenWithRefreshToken fordert ein Azure-Portal-Authentifizierungs-Aktualisierungstoken mit einem benutzerbereitgestellten Aktualisierungstoken an.Get-AzureRMTokenWithClientCredentials fordert ein AzureRM-bezogenes JWT mit einer Client-ID und einem Geheimnis an. Nützlich zur Authentifizierung als Entra-Dienstprinzipal.Get-AzureRMTokenWithPortalAuthRefreshToken fordert ein AzureRM-bezogenes JWT mit einem benutzerbereitgestellten Azure-Portal-Authentifizierungs-Aktualisierungstoken an.Get-AzureRMTokenWithRefreshToken fordert ein AzureRM-bezogenes JWT mit einem benutzerbereitgestellten Aktualisierungstoken an.Get-AzureRMTokenWithUsernamePassword fordert ein AzureRM-bezogenes JWT mit einem benutzerbereitgestellten Benutzernamen und Kennwort an.Get-EntraRefreshTokenWithUsernamePassword fordert eine Sammlung von Token, einschließlich eines Aktualisierungstokens, von login.microsoftonline.com mit einem benutzerbereitgestellten Benutzernamen und Kennwort an. Dies schlägt fehl, wenn der Benutzer Multi-Faktor-Authentifizierungsanforderungen hat oder von einer Richtlinie für bedingten Zugriff betroffen ist.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 sammelt einen Entra-Dienstprinzipal.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 unter einem Abonnement.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-IntuneManagedDevices sammelt 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, einen neuen Besitzer zu einer Entra-App hinzuzufügen.New-EntraAppRoleAssignment versucht, einem Dienstprinzipal eine App-Rolle zu gewähren. Sie können dies beispielsweise verwenden, um einem Dienstprinzipal die App-Rolle RoleManagement.ReadWrite.Directory zu gewähren.New-EntraAppSecret versucht, ein neues Geheimnis für eine vorhandene Entra-App-Registrierung zu erstellen.New-EntraGroupOwner versucht, einen neuen Besitzer zu einer Entra-Gruppe hinzuzufügen.New-EntraRoleAssignment versucht, einem angegebenen Prinzipal eine Entra-Administratorrolle zuzuweisen.New-EntraServicePrincipalOwner versucht, einen neuen Besitzer zu einem Entra-Dienstprinzipal hinzuzufügen.New-EntraServicePrincipalSecret versucht, ein neues Geheimnis für einen vorhandenen Entra-Dienstprinzipal zu erstellen.Reset-EntraUserPassword versucht, das Kennwort eines anderen Benutzers zurückzusetzen. Bei Erfolg enthält die Ausgabe das neue, von Azure generierte Kennwort des Benutzers.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 in einem Web-App-Container auszuführen.Invoke-AzureVMScaleSetVMRunCommand versucht, einen Befehl auf einer VM-Skalierungsgruppen-VM auszuführen.New-AzureAutomationAccountRunBook versucht, ein Runbook zu einem Automatisierungskonto hinzuzufügen.New-AzureKeyVaultAccessPolicy versucht, einem Prinzipal 'Get'- und 'List'-Berechtigungen für die Geheimnisse, Schlüssel und Zertifikate eines Schlüsseltresors zu gewähren.New-AzureRMRoleAssignment versucht, eine benutzerdefinierte AzureRM-Rollenzuweisung an einen bestimmten Prinzipal über einen bestimmten Bereich zu gewähren.New-PowerShellFunctionAppFunction versucht, eine neue PowerShell-Funktion in einer Funktions-App zu erstellen.ConvertTo-Markdown wird verwendet, um die Ausgabe der Invoke-Tests-Funktionen für die Verwendung auf einer anderen Plattform aufzubereiten.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, welche AzureRM-Rollen die Fähigkeit zur Durchführung jedes Missbrauchs gewährt haben.Invoke-AllEntraAbuseTests führt alle Missbrauchsvalidierungstests durch, die von Prinzipalen mit Entra-Administratorrollen ausgeführt werden können. 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 gewährt jedem Dienstprinzipal die entsprechende Rolle. Gibt die im Klartext erstellten Anmeldeinformationen für jeden Dienstprinzipal zurück.New-EntraIDAbuseTestUsers erstellt einen neuen Benutzer pro aktiver Entra-Administratorrolle und gewährt jedem Benutzer die entsprechende Rolle. Gibt die im Klartext erstellten Anmeldeinformationen für jeden Benutzer zurück.New-IntuneAbuseTestUsers erstellt einen neuen Benutzer pro Intune-Rolle und gewährt jedem Benutzer die entsprechende Rolle. Gibt die im Klartext erstellten Anmeldeinformationen für jeden Benutzer zurück.Get-MSGraphTokenWithClientCredentials fordert ein MS Graph-bezogenes JWT mit einer Client-ID und einem Geheimnis an. Nützlich zur Authentifizierung als Entra-Dienstprinzipal.Get-MSGraphTokenWithPortalAuthRefreshToken fordert ein MS Graph-bezogenes JWT mit einem benutzerbereitgestellten Azure-Portal-Authentifizierungs-Aktualisierungstoken an.Get-MSGraphTokenWithRefreshToken fordert ein MS Graph-bezogenes JWT mit einem benutzerbereitgestellten Aktualisierungstoken an.Get-MSGraphTokenWithUsernamePassword fordert ein MS Graph-bezogenes JWT mit einem benutzerbereitgestellten Benutzernamen und Kennwort an.Parse-JWTToken nimmt ein Base64-kodiertes JWT als Eingabe und parst es für Sie. Nützlich zur Überprüfung der korrekten Token-Zielgruppe und -Ansprüche.Get-EntraServicePrincipalOwner sammelt Besitzer eines Entra-Dienstprinzipals.Get-EntraTierZeroServicePrincipals sammelt Entra-Dienstprinzipale, die eine Tier-Zero-Entra-Administratorrolle oder eine Tier-Zero-MS-Graph-App-Rollenzuweisung haben.Get-MGAppRoles sammelt die von der MS Graph-Dienstprinzipal verfügbar gemachten App-Rollen.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 Masterschlüssel unter einer Funktions-App.Get-AzureFunctionOutput führt eine Funktions-App-Funktion aus und ruft deren Ausgabe ab.Get-AzureRMKeyVaultSecretValue sammelt einen Schlüsseltresor-Geheimniswert.Get-AzureRMKeyVaultSecretVersions sammelt alle Versionen eines Schlüsseltresor-Geheimnisses.Get-AzureRMKeyVaultSecrets sammelt alle Geheimnisse unter einem Schlüsseltresor.Get-AzureRMRoleAssignments sammelt alle Rollenzuweisungen für ein Objekt.Get-AzureRMRoleDefinitions sammelt alle Rollendefinitionen, die im Abonnementbereich beschrieben sind, einschließlich benutzerdefinierter Rollen.Get-AzureRMWebApp sammelt eine Web-App.Set-EntraUserPassword versucht, das Kennwort eines anderen Benutzers auf einen neuen, vom Benutzer bereitgestellten Wert zu setzen.New-MSGraphAppRoleTestSPs erstellt einen neuen Dienstprinzipal pro MS Graph-App-Rolle und gewährt jedem Dienstprinzipal die entsprechende Rolle. Gibt die im Klartext erstellten Anmeldeinformationen für jeden Dienstprinzipal zurück.New-TestAppReg erstellt ein Anwendungsregistrierungsobjekt zum expliziten Zweck der Missbrauchsvalidierungstests.New-TestSP erstellt einen neuen Dienstprinzipal und verknüpft ihn mit der von der obigen Funktion erstellten App.Remove-AbuseTestAzureRMRoles ist eine Bereinigungsfunktion zum Entfernen von während der Tests erstellten AzureRM-Administratorrollen.Remove-AbuseTestServicePrincipals bereinigt Missbrauchstests, indem die während der Tests erstellten Dienstprinzipale entfernt werden.Test-AzureRMAddSelfToAzureRMRole wird in Missbrauchsvalidierungstests verwendet, um festzustellen, ob ein Dienstprinzipal mit bestimmten Rechten sich selbst die Rolle 'Benutzerzugriffsadministrator' über ein Abonnement gewähren kann.Test-AzureRMCreateFunction wird in 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 zu 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 zu einer nicht rollenberechtigten Gruppe hinzufügen kann.Test-MGAddMemberToRoleEligibleGroup wird verwendet, um zu testen, ob der Dienstprinzipal sich selbst zu einer rollenberechtigten Gruppe hinzufügen kann.Test-MGAddOwnerToNonRoleEligibleGroup wird verwendet, um zu testen, ob ein Dienstprinzipal sich selbst expliziten Besitz einer nicht rollenberechtigten Gruppe gewähren kann.Test-MGAddOwnerToRoleEligibleGroup wird verwendet, um zu testen, ob ein Dienstprinzipal sich selbst expliziten Besitz einer rollenberechtigten Gruppe gewähren kann.Test-MGAddRootCACert wird verwendet, um zu testen, ob ein Dienstprinzipal ein neues Stammzertifikat der Zertifizierungsstelle zum Mandanten 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 in Missbrauchsvalidierungstests verwendet, um festzustellen, ob ein Dienstprinzipal mit einer bestimmten Berechtigung sich selbst Besitz einer vorhandenen Entra-App gewähren kann.Test-MGAddSelfAsOwnerOfSP wird in Missbrauchsvalidierungstests verwendet, um festzustellen, ob ein Dienstprinzipal mit einer bestimmten Berechtigung sich selbst Besitz eines vorhandenen Entra-Dienstprinzipals gewähren kann.Test-MGAddSelfToEntraRole wird in Missbrauchsvalidierungstests verwendet, um festzustellen, ob ein Dienstprinzipal mit einer bestimmten Berechtigung sich selbst zu einer Entra-Administratorrolle hinzufügen kann – z. B. Globaler Administrator.Test-MGAddSelfToMGAppRole wird in Missbrauchsvalidierungstests verwendet, um festzustellen, ob ein Dienstprinzipal mit einer bestimmten Berechtigung sich selbst eine bestimmte MS Graph-App-Rolle ohne Administratorzustimmung gewähren kann.