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. Sie können jetzt mit diesem Aktualisierungstoken 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. Sie können damit beispielsweise 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 für die 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 erteilt 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.