Consulting, services, computer engineering. Implementation of technology solutions and support for businesses.

Star InactiveStar InactiveStar InactiveStar InactiveStar Inactive
 

    © 2019. Tous droits réservés.

    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 . 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 , et , dont j’ai parlé dans l’article sur les . 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 est membre du groupe , l’utilisateur sera lié par la relation 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 fait partie du groupe , donc par héritage, le compte est un administrateur de domaine.

    Et en fait, ce n’est pas tout, si on demande de lister l’ensemble des groupes auxquels appartient , 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 , , ou encore .

    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 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 , 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 , voici le chemin le plus court pour atteindre le groupe .

    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 . Un exemple de sortie de cette commande est la suivante :

    Cette commande permet de savoir que l’utilisateur a demandé une ressource sur depuis le host . Cette information permet d’affirmer que a en ce moment une session active sur . C’est une information importante puisqu’elle indique que le secret d’authentification de est présent dans la mémoire de lsass sur la machine .

    Ces différentes informations (non exhaustives) sont récoltées via le collecteur , et sont enregistrées sous un format 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 : a écrit l’article 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 appelé 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 :

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

    La première partie 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 de type ayant une relation de type vers un noeud de type . Le contenu entre accolades permet d’appliquer un filtre, ici un filtre sur le nom .

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

    La deuxième partie 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 .

    Nous aurions pu décider de seulement lister les groupes, sans lister les relations. Pour cela, il suffit de seulement retourner les noeuds .

    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 ?

    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.

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

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