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 dot 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 du 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 généré par Azure de l’utilisateur.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 à un 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.