Vous êtes sur la page 1sur 17

Menu

BloodHound
30 Jul 2019 · 14 min Auteur : Pixis

Active Directory Windows

Dans cet article


» Active Directory
» BloodHound
» Théorie des graphes
» Fonctionnement
» Requêtes
» Tips & tricks
» Aller plus loin
» Conclusion

BloodHound est un outil permettant de cartographier un environnement Active Directory en le


représentant sous forme de graphe. Cette représentation offre alors toute la puissance de la
théorie des graphes pour découvrir des chemins d’attaque qui auraient été autrement
difficiles voire impossibles à détecter.

Active Directory
En environnement Active Directory, la gestion des droits est complexe, très complexe. Il n’est
pas rare qu’un utilisateur fasse partie d’un groupe, qui fait partie de 10 groupes, et que l’un
des groupes ait le droit de modifier une GPO qui s’applique à une OU, dans laquelle se trouve
des utilisateurs avec des droits d’administration sur un groupe de machines, etc. On pourrait
trouver des déclinaisons de droits à l’infini.

Le soucis, c’est qu’en tant qu’administrateur d’un système d’information complexe, ces
délégations de droits sont extrêmement complexes à détecter. En effet, l’administrateur
regarde les listes de droits qu’a un utilisateur ou un groupe sur un objet en particulier. Il existe
parfois plusieurs dizaines de droits différents qui peuvent être appliqués sur un objet.

Voici un exemple d’une liste d’ACE (Access Control Entry) que l’on peut trouver sur un objet
“GPO”.
La barre de défilement à droite montre que le nombre d’entrées possibles est très important.
Imaginez alors qu’il y a des entrées comme celles-ci sur tous les objets de l’Active Directory,
que certains droits peuvent s’appliquer via délégation, qu’il y a des groupes inclus dans
d’autres groupes, héritant des droits des groupes parents, etc.

C’est là qu’entre en jeu l’outil BloodHound. Quand la vision en mode liste des droits est un
calvaire, la vision en mode graphe apporte quant à elle une clarté et un recul extrêmement
valorisants.

BloodHound
BloodHound est un outil développé par @wald0, @Harmj0y et @CptJesus, dont j’ai parlé dans
l’article sur les GPO. L’idée de cet outil est d’analyser un environnement Active Directory en
énumérant les différents objets de l’environnement, et en les liant avec des relations. Par
exemple, si un utilisateur support-account est membre du groupe support , l’utilisateur sera
lié par la relation MemberOf au groupe.

C’est une visualisation assez claire d’une appartenance, mais l’outil ne s’arrête pas là. Il
permet de voir également que le groupe support fait partie du groupe DOMAIN ADMINS , donc
par héritage, le compte support est un administrateur de domaine.
Et en fait, ce n’est pas tout, si on demande de lister l’ensemble des groupes auxquels
appartient support , on se rend compte qu’il appartient finalement à beaucoup d’autres
groupes !

Bien entendu, il existe bien d’autres “relations” entre les objets. A l’heure de cet article, voici
la liste des relations disponibles.
On notera par exemple AdminTo , HasSession , GenericAll ou encore AddAllowedToAct .

Nous avons donc un ensemble d’objets liés entre eux par des relations. Il est alors possible de
trouver des chemins en utilisant la théorie des graphes.

Théorie des graphes


La théorie de graphes s’appuie sur une représentation “graphe” des données. C’est un
modèle constitué de noeuds (ici les objets de l’Active Directory) et d’arêtes (ici les relations
entre les objets).

Les arêtes peuvent être orientées ou non. Dans le cas de BloodHound, elles le sont toujours.
Cela signifie que pour aller d’un noeud A à un noeud B, il faut qu’ils soient reliés par une arête
allant de A vers B. L’autre sens ne fonctionne pas.
Une fois que nous avons ces noeuds reliés par des arêtes, nous pouvons chercher des
chemins particuliers pour partir d’un noeud de départ et arriver à un noeud de destination, en
passant par tout un ensemble de noeuds. Il existe souvent plusieurs chemins possibles, et la
théorie des graphes permet de trouver les chemins les plus courts pour relier deux points
particuliers.

Ainsi, le graphe suivant est constitué de 7 noeuds et 9 arêtes.

Si nous avons réussi à prendre la main sur le noeud le plus à gauche, et que nous souhaitons
atteindre le noeud le plus à droite, car c’est le noeud Administrateur de domaine , la théorie
des graphes permet de trouver le chemin le plus court entre les deux.
Un attaquant ayant cette information saura comment se déplacer dans le réseau pour
atteindre son objectif en un minimum d’étapes.

Prenons comme exemple un environnement Active Directory. Il est composé d’un grand
nombre de noeuds.

Si nous compromettons l’utilisateur JDOE , voici le chemin le plus court pour atteindre le
groupe DOMAIN ADMINS .
Comme on peut le voir, le chemin “le plus court” est finalement long, ce qui laisse présager
une grande complexité des droits dans ce système d’information. Utiliser BloodHound permet,
malgré cette complexité, d’extraire simplement et clairement un chemin d’attaque depuis un
utilisateur qui à priori n’avait pas de droits particuliers.

Pour pouvoir traiter ces informations en mode graphe, BloodHound utilise la base de données
“Neo4j”, orientée graphe pour stocker les informations récoltées.

Fonctionnement
L’outil BloodHound manipule plusieurs données, récoltées par différentes techniques.

D’abord, afin de récolter les informations relatives à l’annuaire, il est nécessaire de les
demander à un contrôleur de domaine. En effet, si nous sommes en possession d’un compte
de domaine, même s’il n’a aucun droit particuliers, nous pouvons parcourir l’ensemble des
utilisateurs, des machines, des GPO, lire les ACL, et d’autres informations.

Par ailleurs, jusqu’à récemment, il était possible de demander aux différentes machines la
liste de leurs groupes locaux, ce qui permettait de savoir qui était administrateur local de
quelle machine en corrélant cette information avec l’appartenance des utilisateurs aux
différents groupes.

Ensuite, nous sommes en mesure d’énumérer les sessions distantes sur les machines via la
commande net session \\computer . Un exemple de sortie de cette commande est la suivante
:

net session \\computer

Computer User name Client type Opens Idle time


---------------------------------------------------------------------
\\SOURCE SUPPORT-ACCOUNT Windows 7 1 00:00:13

Cette commande permet de savoir que l’utilisateur SUPPORT-ACCOUNT a demandé une


ressource sur computer depuis le host SOURCE . Cette information permet d’affirmer que
SUPPORT-ACCOUNT a en ce moment une session active sur SOURCE . C’est une information
importante puisqu’elle indique que le secret d’authentification de support-account est présent
dans la mémoire de lsass sur la machine SOURCE .

Ces différentes informations (non exhaustives) sont récoltées via le collecteur SharpHound, et
sont enregistrées sous un format json dans différents fichiers.

Ces fichiers sont ensuite importés dans BloodHound qui les stocke dans la base de données
Neo4j. Une fois l’import terminé, l’interface graphique BloodHound permet de visualiser
rapidement ces données via des requêtes préparées ou des requêtes personnalisées.

Il est également possible de directement envoyer les requêtes dans l’interface de Neo4j, ce
qui peut être utile pour extraire des données sous forme de tableau, par exemple.
Requêtes
Au dela des requêtes proposées par BloodHound, il est possible d’écrire ses propres requêtes.
Je ne vais pas écrire ici un tutoriel à ce sujet, pour la raison suivante : CptJesus a écrit l’article
BloodHound: Intro to Cypher dans lequel il décrit en détail le fonctionnement des requêtes
dans BloodHound et dans Neo4j. Elles sont appelées “Cypher Queries”.

Vous pouvez également aller lire le papier de SadProcessor appelé The Dog Whisperer’s
Handbook qui présente BloodHound et introduit le langage de requête.

Je vous laisse ainsi le soin d’aller lire ces articles afin de comprendre le fonctionnement de ce
langage.

Sachez cependant qu’il est possible d’activer le mode “debug” dans BloodHound permettant
d’afficher les requêtes effectuées lorsque vous cliquez sur un bouton dans l’interface
graphique.

Cette requête peut ensuite être rejouée dans Neo4j si besoin.

Pour tout de même montrer un exemple de requête, voici à quoi ça ressemble :

MATCH p=(n:User {name:"SUPPORT-ACCOUNT@ADSEC.LOCAL"})-[r:MemberOf*1..]->(g:Group) RETURN p

Cette requête permet de lister la hiérarchie des groupes auxquels appartient l’utilisateur
support-account . Pour cela, elle peut être découpée en 2 parties.

La première partie MATCH indique ce que l’on recherche. Ce qu’on trouve entre parenthèse
indique les noeuds, et entre crochets les relations.

Nous cherchons donc un noeud n de type User ayant une relation r de type MemberOf vers
un noeud g de type Group . Le contenu entre accolades permet d’appliquer un filtre, ici un
filtre sur le nom SUPPORT-ACCOUNT@ADSEC.LOCAL .

Dans la partie relation entre crochets, nous indiquons que cette relation doit être présente
une ou plusieurs fois ( *1.. ).

La deuxième partie RETURN indique ce que nous souhaitons retourner suite à la recheche. Ici,
nous souhaitons retourner la relation dans son ensemble, que nous avons assignée à la
variable p .
Nous aurions pu décider de seulement lister les groupes, sans lister les relations. Pour cela, il
suffit de seulement retourner les noeuds g .

Pour des requêtes plus complexes, les liens donnés précédemment vous permettront de
creuser le sujet.

Tips & tricks


Voici une liste de quelques petites astuces ou informations qui peuvent être importantes ou
utiles.

Dark mode
La première, et de loin la plus importante, c’est le mode sombre de l’interface graphique !

Ce mode permet d’avoir une interface sombre et classe, ce qui est super agréable. Voilà, c’est
beau, mais c’est tout.

Clic droit
Lorsqu’il y a une relation entre deux noeuds, vous pouvez faire un “clic droit” sur la relation,
et une pop-up vous affichera un grand nombre d’informations extrêmement utiles.

Vous ne savez pas comment exploiter le lien GenericAll ?

Pas de problème, un clic droit sur le lien permet d’afficher la bulle d’aide.
Elle contient toutes les informations nécessaires pour prendre la main sur la machine de
destination.

Owned
Lors de l’avancement de votre test d’intrusion, vous allez compromettre des machines, des
utilisateurs, des groupes. Afin de ne pas perdre le fil, vous pouvez marquer les objets comme
“owned” après un clic droit sur ceux-ci.

Une icône marquera ces objets par la suite.


Si vous tentez de compromettre un objet en particulier, vous pouvez maintenant demander le
chemin d’attaque le plus court depuis vos cibles déjà compromises.

Filtres
Si vous ne voulez pas afficher certains chemins parce qu’il y a des relations que vous ne savez
pas exploiter, ou parce que vous n’avez pas le temps, ou toutes autres raisons, vous pouvez
décider de décocher les relations pour qu’elles n’apparaissent plus dans vos requêtes. Pour
cela, il suffit de cliquer sur le bouton de filtre, à droite de la barre de recherche, et de cocher
et décocher les éléments qui vous intéressent.
Raccourcis
Il existe quelques raccourcis qui peuvent être utiles lors de l’utilisation de BloodHound. Si vous
en connaissez d’autres, n’hésitez pas à les partager.

CTRL : Permet de changer le mode d’affichage du nom des noeuds. En appuyant sur la
touche, soit vous afficherez toujours les noeuds, soit vous les afficherez lorsqu’il n’y en a
pas trop (la limite peut être définie dans les réglages), soit vous les cachez en
permanence, ce qui peut être utile pour anonymiser les captures d’écran.
CTRL+SHIFT+I : Affiche les outils développeurs. Si vous avez un bug dans l’interface, la
console javascript permettra souvent de comprendre l’origine du problème.
CTRL+R : Recharge l’affichage.

Edition
Lors de la collecte, votre machine a été collectée et vous ne souhaitez pas la voir apparaitre ?
Vous vous êtes connecté sur une machine, mais le lien “HasSession” de l’administrateur de
domaine n’est plus effectif puisque cette machine a redémarré, effaçant les identifiants tant
attendus ? Au contraire, un autre utilisateur s’est connecté sur cette machine ?

Une fois que les données ont été importées dans BloodHound, elles ne sont pas figées. Vous
pouvez les modifier à votre guise, soit via un clic droit sur un objet ou une relation pour les
supprimer, soit via un clic droit dans l’arrière plan pour ajouter un noeud ou une relation.
Notes & Captures d’écran
De la même manière, vous pouvez sauvegarder des informations sur des objets de l’Active
Directory en cliquant sur ceux-ci et en allant dans la section “Notes” dans l’interface de
BloodHound.

BloodHound Analytics
Enfin, la même équipe qui a développé BloodHound a également mis à disposition des outils
permettant de faire des statistiques sur une extraction BloodHound. Ils sont disponibles sur
leur Github, notamment le template bloodhoundanalytics.pbix qui utilise PowerBI .

Voici un exemple pris du tweet de Wald0, qui montre un tableau PowerBI en utilisant le
template fourni sur le Github.

Le résultat est superbe, et très explicite pour le management.

Aller plus loin


Une présentation a été faite à la BSides par les trois auteurs en 2016 pour présenter
BloodHound.

Les auteurs de l’outil sont également présents sur le Slack dédié. Il y a une grande
communauté présente sur ce Slack prête à vous accueillir et à répondre à vos questions. Il y a
même un channel #french !

BloodHound n’est pas le seul outil dans son genre. Nous avons un outil franco-français appelé
AD Control Paths développé par l’ANSSI. Une présentation a été faite au SSTIC à ce sujet et le
PDF associé est très intéressant. Je vous invite vivement à la lire.

Conclusion
Tant que les équipes de défense réfléchiront en mode liste et les attaquants en mode graphe,
ces derniers auront une longueur d’avance. C’est pourquoi BloodHound peut également être
utilisé en tant qu’outil de défense. Il suffit de lancer une collecte d’information régulièrement
et de préparer quelques requêtes pour vérifier l’état de l’Active Directory et pour monitorer
son évolution.

BloodHound présente finalement une nouvelle approche pour visualiser les données dans un
environnement Active Directory. La modélisation en mode graphe permet de comprendre les
relations et intrications complexes des objets et relations dans le système d’information, pour
en ressortir des chemins d’attaque ou des comportement anormaux.

Active Directory Windows


Articles similaires
Relai NTLM 01 Apr 2020
Pass the Hash 17 Dec 2019
Extraction des secrets de lsass à distance 28 Nov 2019

Vous aimerez peut-être aussi