Consulenza, servizi, ingegneria informatica. Implementazione di soluzioni tecnologiche e di sostegno alle imprese.

Valutazione attuale: 5 / 5

Stella attivaStella attivaStella attivaStella attivaStella attiva
 
 
 

 

Active Directory : securité avec BloodHound en pentest

 

 

 

BloodHound est un outil développé par @wald0, @Harmj0y et @CptJesus . 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. 

 

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 . 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.

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.

 

BloodHound et la théorie des graphes

 

La 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.

Si nous avons réussi à prendre la main sur un noeud, 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, hacker, 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, on peut trouver le chemin le plus court pour atteindre le groupe DOMAIN ADMINS.

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.

 

 

BloodHound, son 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 \\computerComputer 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 , 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ée 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 dans BloodHound

 

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 https://blog.cptjesus.com/posts/introtocypher 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 https://www.ernw.de/download/BloodHoundWorkshop/ERNW_DogWhispererHandbook.pdf 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 Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo..

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 de BloodHound

 

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 , notamment le template bloodhoundanalytics.pbix qui utilise PowerBI.

Voici un exemple pris du 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 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é 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.

 

 

 

 

Cet article reflète exclusivement l'opinion de ses auteurs et n’engage en aucune façon Consultingit. J'espère que ça vous a plu. Vos commentaires/remarques sont les bienvenus. Remplissez ce formulaire ou envoyez une mail sur damien @consultingit.fr ou lghm @consultingit.fr: