30/12/2024

Active DirectoryCybersécurité

Populer un Active Directory vulnérable rapidement avec BadBlood

I. Présentation

Dans cet article, nous allons voir comment automatiquement populer (= fournir des informations à une base de données) un Active Directory en intégrant des vulnérabilités. Cela peut être utile dans le cadre de formation ou pour apprendre à manipuler des outils offensifs ou défensifs autour de l'Active Directory.

II. Précautions d'emploi

Le script que nous allons utiliser doit être exécuté en tant qu'administrateur du domaine. En effet, son rôle est d'ajouter différents objets et relations entre ces objets au sein de l'Active Directory. Il va également installer des fonctionnalités comme LAPS qui peuvent être utiles au déploiement de vulnérabilités spécifiques.

Il va de soi qu'il ne faut absolument pas utiliser cet outil dans un environnement Active Directory de production. Veillez donc bien à n'être en aucun cas en possibilité de communiquer avec votre Active Directory de production lors de son exécution.

Pour ma part, j'ai installé un Active Directory sur une VM Windows de test, dans un réseau local dédié de mon VirtualBox. Mon objectif premier est d'étudier le comportement du script et de voir s'il permet d'introduire des vulnérabilités visibles par les outils comme Bloodhound, PingCastle, etc.

III. Utilisation de BadBlood

L'outil BadBlood est composé d'un script principal (Invoke-Badblood.ps1) ainsi que de plusieurs dossiers stockant des fichiers PS1, ADMX, MSI (par exemple pour installer et configurer LAPS.) Ainsi que de différentes listes de mots permettant de générer des objets aux noms aléatoires.

Il faut noter qu'à chaque exécution, BadBlood générera des objets AD différents, les noms et natures des relations entre les objets sont générés de façon aléatoire.

Le script PowerShell Invoke-Badblood.ps1 obtenu doit seulement être exécuté, pas besoin d'import-module. L'idée est donc de créer une population dans notre Active Directory contenant :

  • des utilisateurs,
  • des groupes/OU,
  • des postes de travail,
  • des relations de tout type entre ces différents objets.

Voici le compte des objets utilisateurs, ordinateurs et groupes avant exécution du script :

Compte des objets avant exécution de BadBlood (AD fraîchement installé)
Compte des objets avant exécution de BadBlood (AD fraîchement installé)

Après avoir téléchargé le contenu du dépôt Github en local, L'exécution du script se fait via les commandes PowerShell suivantes :

Set-ExecutionPolicy bypass
.\Invoke-BadBlood.ps1

Comme c'est une VM utilisée pour des tests, on peut se permettre de passer la politique d'exécution en "Bypass". Lors de l'exécution, les actions réalisées sont détaillées dans la sortie du terminal. Attention, certains messages d'erreurs peuvent apparaître : 

Retour terminal de l'exécution de BadBlood
Retour terminal de l'exécution de BadBlood

Il semble qu'en fonction de votre version de PowerShell, de votre environnement AD ou des commandes ADSI installées, certaines commandes ne soient pas accessibles. Dans les différents tests que j'ai pu faire, cela n'a pas vraiment eu d'impact sur le résultat final.

Voici les mêmes comptes après l'exécution du script :

Observation du nombre d'objets créés par BadBlood dans un Active DIrectory
Observation du nombre d'objets créés par BadBlood dans un Active DIrectory

On peut voir que plus de 2400 utilisateurs, 500 groupes et 100 ordinateurs ont été créés sur mon Active Directory, le tout en quelques minutes. Si l'on regarde avec attention le contenu du script principal, on remarque la possibilité de lui indiquer le nombre d'objets à créer pour chaque catégorie, il faut pour cela utiliser la position du paramètre souhaité :

param
(
[Parameter(Mandatory = $false,
Position = 1,
HelpMessage = 'Supply a count for user creation default 2500')]
[Int32]$UserCount = 2500,
[Parameter(Mandatory = $false,
Position = 2,
HelpMessage = 'Supply a count for user creation default 500')]
[int32]$GroupCount = 500,
[Parameter(Mandatory = $false,
Position = 3,
HelpMessage = 'Supply the script directory for where this script is stored')]
[int32]$ComputerCount = 100,
[Parameter(Mandatory = $false,
Position = 4,
HelpMessage = 'Skip the OU creation if you already have done it')]
[switch]$SkipOuCreation,
[Parameter(Mandatory = $false,
Position = 5,
HelpMessage = 'Skip the LAPS deployment if you already have done it')]
[switch]$SkipLapsInstall,
[Parameter(Mandatory = $false,
Position = 6,
HelpMessage = 'Make non-interactive for automation')]
[switch]$NonInteractive
)

IV. Exemple de résultat

À la suite de l'exécution du script, j'ai cherché à découvrir des vulnérabilités rapidement grâce à l'outil Bloodhound. Celui-ci permet de découvrir des chemins d'attaque complexes via les différentes relations pouvant exister entre les objets de l'AD :

Exemples de chemins d'attaque dans un AD populé via BadBlood
Exemples de chemins d'attaque dans un AD populé via BadBlood
Exemples de chemins d'attaque dans un AD populé via BadBlood
Exemples de chemins d'attaque dans un AD populé via BadBlood

J'ai rapidement constaté que de nombreux chemins d'attaque étaient présents, ce qui était largement suffisant pour confirmer le bon fonctionnement de cet outil :). J'ai également fait une analyse à l'aide de PingCastle :

Résultat d'une analyse PingCastle après exécution de Badblood
Résultat d'une analyse PingCastle après exécution de Badblood

Là aussi, plusieurs vulnérabilités sont remontées.

Badblood est selon moi de l'un des outils les plus rapide et simple d'utilisation pour le déploiement de vulnérabilités autour de l'Active Directory (en omettant le temps d'installation de la VM/du service ADDS). Parfait pour s’entraîner à utiliser des outils comme BloodHound :).

author avatar
Mickael Dorigny Co-founder
Co-fondateur d'IT-Connect.fr. Auditeur/Pentester chez Orange Cyberdéfense.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

1 commentaire sur “Populer un Active Directory vulnérable rapidement avec BadBlood

  • Hello,

    Est-ce qu’on ne dirait pas « peupler » plutôt que « populer » qui semble être une mauvaise traduction de l’anglais « populate » ?

    Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.