
Kit de recherche d'attaques BloodHound

BARK signifie BloodHound Attack Research Kit. C'est un script PowerShell conçu pour aider l'équipe BloodHound Enterprise à rechercher et valider en continu les primitives d'abus. BARK se concentre actuellement sur la suite de produits et services Microsoft Azure.
BARK ne nécessite aucune dépendance tierce. Les fonctions de BARK sont conçues pour être aussi simples et maintenables que possible. La plupart des fonctions sont de simples wrappers pour effectuer des requêtes vers divers points de terminaison d'API REST. Les fonctions de base de BARK n'ont même pas besoin les unes des autres - vous pouvez extraire presque n'importe quelle fonction de BARK et elle fonctionnera parfaitement comme fonction autonome dans vos propres scripts.
Auteur principal : Andy Robbins @_wald0
Contributeurs :
Il existe de nombreuses façons d'importer un script PowerShell. En voici une :
Tout d'abord, téléchargez BARK.ps1 en clonant ce dépôt ou en copiant-collant simplement son contenu brut depuis GitHub.
git clone https://github.com/BloodHoundAD/BARK
Maintenant, placez-vous dans le répertoire où se trouve le PS1 :
cd BARK
Enfin, vous pouvez importer le script avec un point de cette manière :
. .\BARK.ps1
Appuyez sur Entrée, et votre instance PowerShell aura désormais accès à toutes les fonctions de BARK.
À quelques exceptions près, les points de terminaison de l'API Azure nécessitent une authentification pour interagir. BARK inclut quelques fonctions qui vous aideront à acquérir les jetons nécessaires pour interagir avec les API MS Graph et Azure REST. Toute fonction BARK qui interagit avec une API Azure nécessitant une authentification vous demandera de fournir un jeton.
Supposons que vous souhaitiez lister tous les utilisateurs d'un locataire Entra ID. Vous devez d'abord obtenir un jeton avec une portée pour MS Graph. Il existe plusieurs façons d'obtenir ce jeton :
Si vous disposez d'une combinaison nom d'utilisateur/mot de passe pour un utilisateur Entra dans ce locataire, vous pouvez d'abord acquérir un jeton d'actualisation pour l'utilisateur en utilisant la fonction Get-EntraRefreshTokenWithUsernamePassword de BARK :
$MyRefreshTokenRequest = Get-EntraRefreshTokenWithUsernamePassword -username "[email protected]" -password "MyVeryCoolPassword" -TenantID "contoso.onmicrosoft.com"
L'objet résultant que vous venez de créer, $MyRefreshTokenRequest, contiendra un jeton d'actualisation pour votre utilisateur. Vous pouvez maintenant demander un jeton avec une portée MS Graph en utilisant ce jeton d'actualisation :
$MyMSGraphToken = Get-MSGraphTokenWithRefreshToken -RefreshToken $MyRefreshTokenRequest.refresh_token -TenantID "contoso.onmicrosoft.com"
Maintenant, ce nouvel objet, $MyMSGraphToken, aura comme l'une de ses propriétés un JWT avec une portée MS Graph pour votre utilisateur. Vous êtes maintenant prêt à utiliser ce jeton pour lister tous les utilisateurs du locataire Entra :
$MyUsers = Get-AllEntraUsers -Token $MyMSGraphToken.access_token -ShowProgress
Une fois terminé, la variable $MyEntraUsers sera remplie d'objets représentant tous les utilisateurs de votre locataire Entra.
Get-AzureKeyVaultTokenWithClientCredentials demande un jeton à STS avec Azure Vault spécifié comme ressource/public cible en utilisant un ID client et un secret.Get-AzureKeyVaultTokenWithUsernamePassword demande un jeton à STS avec Azure Vault spécifié comme ressource/public cible en utilisant un nom d'utilisateur et un mot de passe fournis par l'utilisateur.Get-AzurePortalTokenWithRefreshToken demande un jeton d'actualisation d'authentification du portail Azure avec un jeton d'actualisation fourni par l'utilisateur.Get-AzureRMTokenWithClientCredentials demande un JWT avec une portée AzureRM en utilisant un ID client et un secret. Utile pour s'authentifier en tant que principal de service Entra.Get-AzureRMTokenWithPortalAuthRefreshToken demande un JWT avec une portée AzureRM en utilisant un jeton d'actualisation d'authentification du portail Azure fourni par l'utilisateur.Get-AzureRMTokenWithRefreshToken demande un JWT avec une portée AzureRM en utilisant un jeton d'actualisation fourni par l'utilisateur.Get-AzureRMTokenWithUsernamePassword demande un JWT avec une portée AzureRM en utilisant un nom d'utilisateur et un mot de passe fournis par l'utilisateur.Get-EntraRefreshTokenWithUsernamePassword demande une collection de jetons, y compris un jeton d'actualisation, à login.microsoftonline.com avec un nom d'utilisateur et un mot de passe fournis par l'utilisateur. Cela échouera si l'utilisateur a des exigences d'authentification multifacteur ou est affecté par une stratégie d'accès conditionnel.Les fonctions basées sur les jetons d'actualisation dans BARK sont basées sur les fonctions de TokenTactics par Steve Borosh.
Get-AllEntraApps collecte tous les objets d'enregistrement d'application Entra.Get-AllEntraGroups collecte tous les groupes Entra.Get-AllEntraRoles collecte tous les rôles d'administration Entra.Get-AllEntraServicePrincipals collecte tous les objets principal de service Entra.Get-AllEntraUsers collecte tous les utilisateurs Entra.Get-EntraAppOwner collecte les propriétaires d'un enregistrement d'application Entra.Get-EntraDeviceRegisteredUsers collecte les utilisateurs d'un appareil Entra.Get-EntraGroupMembers collecte les membres d'un groupe Entra.Get-EntraGroupOwner collecte les propriétaires d'un groupe Entra.Get-EntraRoleTemplates collecte les modèles de rôles d'administration Entra.Get-EntraServicePrincipal collecte un principal de service Entra.Get-AllAzureManagedIdentityAssignments collecte toutes les attributions d'identité managée.Get-AllAzureRMAKSClusters collecte tous les clusters de services Kubernetes sous un abonnement.Get-AllAzureRMAutomationAccounts collecte tous les comptes d'automatisation sous un abonnement.Get-AllAzureRMAzureContainerRegistries collecte tous les registres de conteneurs sous un abonnement.Get-AllAzureRMFunctionApps collecte toutes les applications de fonctions sous un abonnement.Get-AllAzureRMKeyVaults collecte tous les coffres de clés sous un abonnement.Get-AllAzureRMLogicApps collecte toutes les applications logiques sous un abonnement.Get-AllAzureRMResourceGroups collecte tous les groupes de ressources sous un abonnement.Get-AllAzureRMSubscriptions collecte tous les abonnements AzureRM.Get-AllAzureRMVMScaleSetsVMs collecte toutes les machines virtuelles sous un groupe de mise à l'échelle de machines virtuelles.Get-IntuneManagedDevices collecte les appareils gérés par Intune.Get-IntuneRoleDefinitions collecte les définitions de rôles Intune disponibles.Add-MemberToEntraGroup tente d'ajouter un principal à un groupe Entra.Enable-EntraRole tente d'activer (ou « activer ») le rôle Entra.New-EntraAppOwner tente d'ajouter un nouveau propriétaire à une application Entra.New-EntraAppRoleAssignment tente d'accorder un rôle d'application à un principal de service. Par exemple, vous pouvez l'utiliser pour accorder au principal de service le rôle d'application RoleManagement.ReadWrite.Directory.New-EntraAppSecret tente de créer un nouveau secret pour un enregistrement d'application Entra existant.New-EntraGroupOwner tente d'ajouter un nouveau propriétaire à un groupe Entra.New-EntraRoleAssignment tente d'attribuer un rôle d'administration Entra à un principal spécifié.New-EntraServicePrincipalOwner tente d'ajouter un nouveau propriétaire à un principal de service Entra.New-EntraServicePrincipalSecret tente de créer un nouveau secret pour un principal de service Entra existant.Reset-EntraUserPassword tente de réinitialiser le mot de passe d'un autre utilisateur. En cas de succès, la sortie contiendra le nouveau mot de passe généré par Azure de l'utilisateur.Invoke-AzureRMAKSRunCommand demande au cluster AKS d'exécuter une commande.Invoke-AzureRMVMRunCommand tente d'exécuter une commande sur une machine virtuelle.Invoke-AzureRMWebAppShellCommand tente d'exécuter une commande sur un conteneur d'application web.Invoke-AzureVMScaleSetVMRunCommand tente d'exécuter une commande sur une machine virtuelle d'un groupe de mise à l'échelle de machines virtuelles.New-AzureAutomationAccountRunBook tente d'ajouter un runbook à un compte d'automatisation.New-AzureKeyVaultAccessPolicy tente d'accorder à un principal les autorisations « Get » et « List » sur les secrets, clés et certificats d'un coffre de clés.New-AzureRMRoleAssignment tente d'accorder une attribution de rôle AzureRM spécifiée par l'utilisateur à un principal particulier sur une certaine portée.New-PowerShellFunctionAppFunction tente de créer une nouvelle fonction PowerShell dans une application de fonctions.ConvertTo-Markdown est utilisé pour remanier la sortie des fonctions Invoke-Tests en vue d'une utilisation sur une autre plateforme.Invoke-AllAzureMGAbuseTests effectue tous les tests de validation d'abus qui peuvent être exécutés en détenant un rôle d'application MS Graph. Renvoie un objet décrivant quels privilèges ont réussi à effectuer chaque test d'abus.Invoke-AllAzureRMAbuseTests effectue tous les tests de validation d'abus AzureRM et génère un objet décrivant quels rôles AzureRM ont accordé la capacité d'effectuer chaque abus.Invoke-AllEntraAbuseTests effectue tous les tests de validation d'abus qui peuvent être exécutés par des principaux auxquels des rôles d'administration Entra ont été attribués. Renvoie un objet décrivant quels privilèges ont réussi à effectuer chaque test d'abus.New-EntraIDAbuseTestSPs crée un nouveau principal de service par rôle d'administration Entra actif et attribue à chaque principal de service le rôle approprié. Renvoie les informations d'identification en texte clair créées pour chaque principal de service.New-EntraIDAbuseTestUsers crée un nouvel utilisateur par rôle d'administration Entra actif et attribue à chaque utilisateur le rôle approprié. Renvoie les informations d'identification en texte clair créées pour chaque utilisateur.New-IntuneAbuseTestUsers crée un nouvel utilisateur par rôle Intune et attribue à chaque utilisateur le rôle approprié. Renvoie les informations d'identification en texte clair créées pour chaque utilisateur.New-MSGraphAppRoleTestSPs crée un nouveau principal de service par rôle d'application MS Graph et attribue à chaque principal de service le rôle approprié. Renvoie les informations d'identification en texte clair créées pour chaque principal de service.Get-MSGraphTokenWithClientCredentials demande un JWT avec une portée MS Graph en utilisant un ID client et un secret. Utile pour s'authentifier en tant que principal de service Entra.Get-MSGraphTokenWithPortalAuthRefreshToken demande un JWT avec une portée MS Graph en utilisant un jeton d'actualisation d'authentification du portail Azure fourni par l'utilisateur.Get-MSGraphTokenWithRefreshToken demande un JWT avec une portée MS Graph en utilisant un jeton d'actualisation fourni par l'utilisateur.Get-MSGraphTokenWithUsernamePassword demande un JWT avec une portée MS Graph en utilisant un nom d'utilisateur et un mot de passe fournis par l'utilisateur.Parse-JWTToken prend un JWT encodé en Base64 en entrée et le parse pour vous. Utile pour vérifier l'audience et les revendications correctes du jeton.Get-EntraServicePrincipalOwner collecte les propriétaires d'un principal de service Entra.Get-EntraTierZeroServicePrincipals collecte les principaux de service Entra qui ont une attribution de rôle d'administration Entra de niveau zéro ou d'attribution de rôle d'application MS Graph de niveau zéro.Get-MGAppRoles collecte les rôles d'application rendus disponibles par le principal de service MS Graph.Get-AllAzureRMVMScaleSets collecte tous les groupes de mise à l'échelle de machines virtuelles sous un abonnement.Get-AllAzureRMVirtualMachines collecte toutes les machines virtuelles sous un abonnement.Get-AllAzureRMWebApps collecte toutes les applications web sous un abonnement.Get-AzureAutomationAccountRunBookOutput exécute un runbook de compte d'automatisation et récupère sa sortie.Get-AzureFunctionAppFunctionFile collecte le fichier brut (généralement le code source) d'une fonction d'application de fonctions.Get-AzureFunctionAppFunctions collecte toutes les fonctions sous une application de fonctions.Get-AzureFunctionAppMasterKeys collecte toutes les clés maîtresses sous une application de fonctions.Get-AzureFunctionOutput exécute une fonction d'application de fonctions et récupère sa sortie.Get-AzureRMKeyVaultSecretValue collecte la valeur d'un secret de coffre de clés.Get-AzureRMKeyVaultSecretVersions collecte toutes les versions d'un secret de coffre de clés.Get-AzureRMKeyVaultSecrets collecte tous les secrets sous un coffre de clés.Get-AzureRMRoleAssignments collecte toutes les attributions de rôles sur un objet.Get-AzureRMRoleDefinitions collecte toutes les définitions de rôles décrites au niveau d'un abonnement, y compris les rôles personnalisés.Get-AzureRMWebApp collecte une application web.Set-EntraUserPassword tente de définir le mot de passe d'un autre utilisateur sur une nouvelle valeur fournie par l'utilisateur.New-TestAppReg crée un objet d'enregistrement d'application dans le but explicite de tester la validation d'abus.New-TestSP crée un nouveau principal de service et l'associe à l'application créée par la fonction ci-dessus.Remove-AbuseTestAzureRMRoles est une fonction de nettoyage pour supprimer les rôles d'administration AzureRM créés pendant les tests.Remove-AbuseTestServicePrincipals nettoie les tests d'abus en supprimant les principaux de service créés pendant les tests.Test-AzureRMAddSelfToAzureRMRole utilisé dans les tests de validation d'abus pour déterminer si un principal de service avec certains droits peut s'attribuer le rôle d'administrateur d'accès utilisateur sur un abonnement.Test-AzureRMCreateFunction utilisé dans les tests de validation d'abus pour tester si un principal de service peut ajouter une nouvelle fonction à une application de fonctions existante.Test-AzureRMPublishAutomationAccountRunBook utilisé pour tester si un principal de service peut publier un nouveau runbook dans un compte d'automatisation existant.Test-AzureRMVMRunCommand utilisé pour tester si un principal peut exécuter une commande sur une machine virtuelle existante.Test-MGAddMemberToNonRoleEligibleGroup utilisé pour tester si le principal de service peut s'ajouter à un groupe non éligible aux rôles.Test-MGAddMemberToRoleEligibleGroup utilisé pour tester si le principal de service peut s'ajouter à un groupe éligible aux rôles.Test-MGAddOwnerToNonRoleEligibleGroup utilisé pour tester si un principal de service peut s'attribuer la propriété explicite d'un groupe non éligible aux rôles.Test-MGAddOwnerToRoleEligibleGroup utilisé pour tester si un principal de service peut s'attribuer la propriété explicite d'un groupe éligible aux rôles.Test-MGAddRootCACert utilisé pour tester si un principal de service peut ajouter un nouveau certificat d'autorité de certification racine au locataire.Test-MGAddSecretToApp utilisé pour tester si le principal de service peut ajouter un nouveau secret à une application existante.Test-MGAddSecretToSP utilisé pour tester si le principal de service peut ajouter un nouveau secret à un principal de service existant.Test-MGAddSelfAsOwnerOfApp utilisé dans les tests de validation d'abus pour déterminer si un principal de service avec un privilège particulier peut s'attribuer la propriété d'une application Entra existante.Test-MGAddSelfAsOwnerOfSP utilisé dans les tests de validation d'abus pour déterminer si un principal de service avec un privilège particulier peut s'attribuer la propriété d'un principal de service Entra existant.Test-MGAddSelfToEntraRole utilisé dans les tests de validation d'abus pour déterminer si un principal de service avec un privilège particulier peut s'ajouter à un rôle d'administration Entra - Administrateur général, par exemple.Test-MGAddSelfToMGAppRole utilisé dans les tests de validation d'abus pour déterminer si un principal de service avec un privilège particulier peut s'attribuer un rôle d'application MS Graph spécifique sans consentement administrateur.