BARK signifie BloodHound Attack Research Kit. Il s'agit d'un script PowerShell conçu pour aider l'équipe BloodHound Enterprise à rechercher et à valider en permanence les primitives d'abus. BARK se concentre actuellement sur la suite de produits et services Azure de Microsoft.
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 des wrappers très simples permettant d'envoyer des requêtes à divers points de terminaison de l'API REST. Les fonctions de base de BARK ne nécessitent même pas les unes des autres - vous pouvez extraire presque toutes les fonctions BARK de BARK et elles fonctionneront parfaitement en tant que fonction autonome dans vos propres scripts.
Auteur principal : Andy Robbins @_wald0
Contributeurs :
Il existe de nombreuses façons d'importer un script PowerShell. Voici une façon :
Tout d'abord, téléchargez BARK.ps1 en clonant ce dépôt ou simplement en copiant/collant son contenu brut depuis GitHub.
git clone https://github.com/BloodHoundAD/BARK
Maintenant, cd dans le répertoire où se trouve la PS1 :
cd BARK
Enfin, vous pouvez importer la PS1 comme ceci :
. .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 est livré avec 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 répertorier tous les utilisateurs d'un locataire Entra ID. Vous devez d’abord obtenir un jeton adapté à MS Graph. Il existe de nombreuses 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 à l'aide de 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 désormais demander un jeton de portée MS Graph à l'aide de ce jeton d'actualisation :
$MyMSGraphToken = Get-MSGraphTokenWithRefreshToken -RefreshToken $MyRefreshTokenRequest.refresh_token -TenantID "contoso.onmicrosoft.com"
Désormais, ce nouvel objet, $MyMSGraphToken
, aura comme l'une de ses valeurs de propriété un JWT de portée MS Graph pour votre utilisateur. Vous êtes maintenant prêt à utiliser ce jeton pour répertorier tous les utilisateurs du locataire Entra :
$MyUsers = Get-AllEntraUsers -Token $MyMSGraphToken.access_token -ShowProgress
Une fois terminé, la variable $MyEntraUsers
sera renseignée par des objets représentant tous les utilisateurs de votre locataire Entra.
Get-AzureKeyVaultTokenWithClientCredentials
demande un jeton à STS avec Azure Vault spécifié comme ressource/audience prévue à l'aide d'un ID client et d'un secret.Get-AzureKeyVaultTokenWithUsernamePassword
demande un jeton à STS avec Azure Vault spécifié comme ressource/audience prévue à l'aide d'un nom d'utilisateur et d'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 de portée AzureRM avec un ID client et un secret. Utile pour s'authentifier en tant que principal du service Entra.Get-AzureRMTokenWithPortalAuthRefreshToken
demande un JWT de portée AzureRM avec un jeton d'actualisation d'authentification du portail Azure fourni par l'utilisateur.Get-AzureRMTokenWithRefreshToken
demande un JWT de portée AzureRM avec un jeton d'actualisation fourni par l'utilisateur.Get-AzureRMTokenWithUsernamePassword
demande un JWT de portée AzureRM avec 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, à partir de 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 politique d'accès conditionnel.Get-MSGraphTokenWithClientCredentials
demande un JWT de portée MS Graph avec un ID client et un secret. Utile pour s'authentifier en tant que principal du service Entra.Get-MSGraphTokenWithPortalAuthRefreshToken
demande un JWT de portée MS Graph avec un jeton d'actualisation d'authentification du portail Azure fourni par l'utilisateur.Get-MSGraphTokenWithRefreshToken
demande un JWT de portée MS Graph avec un jeton d'actualisation fourni par l'utilisateur.Get-MSGraphTokenWithUsernamePassword
demande un JWT de portée MS Graph avec un nom d'utilisateur et un mot de passe fournis par l'utilisateur.Parse-JWTToken
prendra un JWT encodé en Base64 comme entrée et l'analysera pour vous. Utile pour vérifier l’audience et les revendications correctes des jetons.Les fonctions basées sur les jetons d'actualisation dans BARK sont basées sur les fonctions de TokenTactics de Steve Borosh.
Get-AllEntraApps
collecte tous les objets d'enregistrement de l'application Entra.Get-AllEntraGroups
collecte tous les groupes Entra.Get-AllEntraRoles
collecte tous les rôles d'administrateur Entra.Get-AllEntraServicePrincipals
collecte tous les objets principaux du 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'administrateur Entra.Get-EntraServicePrincipal
collecte un principal de service Entra.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'administrateur Entra de niveau zéro ou de rôle d'application MS Graph de niveau zéro.Get-MGAppRoles
collecte les rôles d'application mis à disposition par le principal du service MS Graph. Get-AllAzureManagedIdentityAssignments
collecte toutes les attributions d’identités gérées.Get-AllAzureRMAKSClusters
collecte tous les clusters de services Kubernetes dans le cadre d'un abonnement.Get-AllAzureRMAutomationAccounts
collecte tous les comptes d'automatisation sous un abonnement.Get-AllAzureRMAzureContainerRegistries
collecte tous les registres de conteneurs dans le cadre d'un abonnement.Get-AllAzureRMFunctionApps
collecte toutes les applications de fonction 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 machines virtuelles identiques.Get-AllAzureRMVMScaleSets
collecte tous les groupes de machines virtuelles identiques dans le cadre d’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 fonction.Get-AzureFunctionAppFunctions
collecte toutes les fonctions sous une application de fonction.Get-AzureFunctionAppMasterKeys
collecte toutes les clés principales sous une application de fonction.Get-AzureFunctionOutput
exécute une fonction d'application de fonction et récupère sa sortie.Get-AzureRMKeyVaultSecretValue
collecte une valeur secrète 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 dans 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'une étendue d'abonnement, y compris les rôles personnalisés.Get-AzureRMWebApp
collecte une application web. Get-IntuneManagedDevices
collecte les appareils gérés par Intune.Get-IntuneRoleDefinitions
collecte les définitions de rôle Intune disponibles. Add-MemberToEntraGroup
tentera d'ajouter un principal à un groupe Entra.Enable-EntraRole
tentera d'activer (ou "d'activer") le rôle Entra.New-EntraAppOwner
tentera d'ajouter un nouveau propriétaire à une application Entra.New-EntraAppRoleAssignment
tentera d’accorder un rôle d’application à un principal de service. Par exemple, vous pouvez l’utiliser pour accorder à un principal de service le rôle d’application RoleManagement.ReadWrite.Directory.New-EntraAppSecret
tentera de créer un nouveau secret pour un enregistrement d'application Entra existant.New-EntraGroupOwner
tentera d'ajouter un nouveau propriétaire à un groupe Entra.New-EntraRoleAssignment
tentera d'attribuer un rôle d'administrateur Entra à un principal spécifié.New-EntraServicePrincipalOwner
tentera d'ajouter un nouveau propriétaire à un principal de service Entra.New-EntraServicePrincipalSecret
tentera de créer un nouveau secret pour un principal de service Entra existant.Reset-EntraUserPassword
tentera de réinitialiser le mot de passe d'un autre utilisateur. En cas de succès, la sortie contiendra le nouveau mot de passe de l’utilisateur généré par Azure.Set-EntraUserPassword
tentera de définir le mot de passe d'un autre utilisateur sur une nouvelle valeur fournie par l'utilisateur. Invoke-AzureRMAKSRunCommand
demandera au cluster AKS d'exécuter une commande.Invoke-AzureRMVMRunCommand
tentera d'exécuter une commande sur une machine virtuelle.Invoke-AzureRMWebAppShellCommand
tentera d'exécuter une commande sur un conteneur d'application Web.Invoke-AzureVMScaleSetVMRunCommand
tentera d’exécuter une commande sur une VM Scale Set VM.New-AzureAutomationAccountRunBook
tentera d’ajouter un runbook à un compte d’automatisation.New-AzureKeyVaultAccessPolicy
tentera d'accorder à un principal les autorisations « Obtenir » et « Liste » sur les secrets, les clés et les certificats d'un coffre de clés.New-AzureRMRoleAssignment
tentera d’accorder une attribution de rôle AzureRM spécifiée par l’utilisateur à un mandataire particulier sur une certaine étendue.New-PowerShellFunctionAppFunction
tentera de créer une nouvelle fonction PowerShell dans une application de fonction. ConvertTo-Markdown
est utilisé pour masser la sortie des fonctions Invoke-Tests pour une utilisation sur une autre plate-forme.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 les privilèges qui ont réussi à effectuer chaque test d'abus.Invoke-AllAzureRMAbuseTests
effectue tous les tests de validation des abus AzureRM et génère un objet résultant qui décrit les rôles AzureRM autorisés à effectuer chaque abus.Invoke-AllEntraAbuseTests
effectue tous les tests de validation d'abus qui peuvent être exécutés par les principaux disposant de rôles d'administrateur Entra. Renvoie un objet décrivant les privilèges qui ont réussi à effectuer chaque test d'abus.New-EntraIDAbuseTestSPs
crée un nouveau principal de service par rôle d'administrateur Entra actif et accorde à chaque principal de service le rôle approprié. Renvoie les informations d'identification en texte brut créées pour chaque principe de service.New-EntraIDAbuseTestUsers
crée un nouvel utilisateur par rôle d'administrateur Entra actif et accorde à chaque utilisateur le rôle approprié. Renvoie les informations d'identification en texte brut créées pour chaque utilisateur.New-IntuneAbuseTestUsers
crée un nouvel utilisateur par rôle Intune et accorde à chaque utilisateur le rôle approprié. Renvoie les informations d'identification en texte brut créées pour chaque utilisateur.New-MSGraphAppRoleTestSPs
crée un nouveau principal de service par rôle d'application MS Graph et accorde à chaque principal de service le rôle approprié. Renvoie les informations d'identification en texte brut créées pour chaque principe de service.New-TestAppReg
crée un objet d'enregistrement d'application dans le but explicite de tester la validation des 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 permettant de supprimer les rôles d'administrateur AzureRM créés lors des tests.Remove-AbuseTestServicePrincipals
nettoie les tests abusifs en supprimant les principaux de service créés lors des tests.Test-AzureRMAddSelfToAzureRMRole
utilisé dans les tests de validation des abus pour déterminer si un principal de service disposant de certains droits peut s'accorder le rôle d'administrateur d'accès utilisateur sur un abonnement.Test-AzureRMCreateFunction
utilisé dans les tests de validation des abus pour tester si un principal de service peut ajouter une nouvelle fonction à une application de fonction existante.Test-AzureRMPublishAutomationAccountRunBook
est utilisé pour tester si un principal de service peut publier un nouveau runbook sur un compte d'automatisation existant.Test-AzureRMVMRunCommand
est utilisé pour tester si un mandataire peut exécuter une commande sur une machine virtuelle existante.Test-MGAddMemberToNonRoleEligibleGroup
est utilisé pour tester si le principal du service peut s'ajouter à un groupe non éligible au rôle.Test-MGAddMemberToRoleEligibleGroup
est utilisé pour tester si le principal du service peut s'ajouter à un groupe éligible au rôle.Test-MGAddOwnerToNonRoleEligibleGroup
est utilisé pour tester si un principal de service peut s'accorder la propriété explicite d'un groupe non éligible au rôle.Test-MGAddOwnerToRoleEligibleGroup
est utilisé pour tester si un principal de service peut s'accorder la propriété explicite d'un groupe éligible à un rôle.Test-MGAddRootCACert
est utilisé pour tester si un principal de service peut ajouter un nouveau certificat Root CA au locataire.Test-MGAddSecretToApp
est utilisé pour tester si le principal du service peut ajouter un nouveau secret à une application existante.Test-MGAddSecretToSP
est utilisé pour tester si le principal de service peut ajouter un nouveau secret à un principal de service existant.Test-MGAddSelfAsOwnerOfApp
est utilisé dans les tests de validation d'abus pour déterminer si un principal de service doté d'un privilège particulier peut s'accorder la propriété d'une application Entra existante.Test-MGAddSelfAsOwnerOfSP
est utilisé dans les tests de validation d'abus pour déterminer si un principal de service doté d'un privilège particulier peut s'accorder la propriété d'un principal de service Entra existant.Test-MGAddSelfToEntraRole
est utilisé dans les tests de validation d'abus pour déterminer si un principal de service doté d'un privilège particulier peut s'ajouter à un rôle d'administrateur Entra - Administrateur global, par exemple.Test-MGAddSelfToMGAppRole
est utilisé dans les tests de validation d'abus pour déterminer si un principal de service doté d'un privilège particulier peut s'accorder un rôle d'application MS Graph particulier sans le consentement de l'administrateur.