12/12/2024

Interaction avec la base de données Neo4j

Dans ce chapitre, nous allons nous attarder un peu plus sur la base de données principale de BloodHound : Neo4j. L'interaction avec Neo4j est de moins en moins nécessaire au fur et à mesure des mises à jour et nouvelles fonctionnalités proposées par BloodHound, mais il est toujours intéressant de savoir qu'il est possible d'y accéder pour obtenir des vues ou informations complémentaires de celles proposées par BloodHound.

I. Accéder à l'interface web de Neo4j

Si vous vous souvenez des tout premiers chapitres de ce cours, nous pouvons obtenir le port d'écoute de la base de données Neo4j (si les conteneurs sont actifs) via la commande docker suivante :

docker ps --format "table {{.Image}}\t{{.Ports}}\t{{.Names}}"

Voici le résultat attendu :

Liste des conteneurs BloodHound avec les ports exposés.
Liste des conteneurs BloodHound avec les ports exposés.

Ou dans le fichier "docker-compose.yml" qui nous permet de créer puis gérer l'infrastructure docker de BloodHound :

$ cat docker-compose.yml
graph-db:
  image: docker.io/library/neo4j:4.4
  [...]
  ports:
    - 127.0.0.1:${NEO4J_DB_PORT:-7687}:7687
    - 127.0.0.1:${NEO4J_WEB_PORT:-7474}:7474

Si vous vous rendez avec un navigateur web sur le service http://127.0.0.1:7474, vous aurez accès à l'interface web suivante, appelée "neo4j Browser" :

Page d'authentification de l'interface graphique de neo4j : neo4j Browser.

Pour s'authentifier, il faut utiliser les identifiants paramétrés dans le "docker-compose.yml" :

NEO4J_AUTH=${NEO4J_USER:-neo4j}/${NEO4J_SECRET:-bloodhoundcommunityedition}

Une fois authentifié, nous accédons au Neo4j Browser et pouvons manipuler et visualiser les données importées de notre Active Directory.

II. Visualiser les edges et les nodes dans Neo4j

La première chose à faire est de lister tous les éléments disponibles dans Neo4j. Pour cela, il faut cliquer sur l'icône de base de données en haut à droite de l'interface :

Liste des objets et propriétés d'objet de la base de données importées dans BloodHound.
Liste des objets et propriétés d'objet de la base de données importées dans BloodHound.

Nous avons ici une vue d'ensemble de tous les nodes, edges et propriétés sur lesquels peuvent porter nos requêtes (dans Neo4j, et donc dans BloodHound). Cette visualisation aide aussi à comprendre la puissance de BloodHound et la façon dont nous pouvons construire nos requêtes Cypher.

III. Requêtes Cypher et format de réponse

En cliquant sur l'un de ces éléments, une requête Cypher (limitée à 25 éléments) est exécutée :

Requête Cypher et résultat produits lors de la sélection d'un edge dans l'interface Neo4j Browser.
Requête Cypher et résultat produit lors de la sélection d'un edge dans l'interface Neo4j Browser.

Là aussi, nous voyons que cette interface peut nous aider à mieux comprendre les requêtes Cypher puisqu'elle en produit à partir d'une simple sélection. Lorsque l'on débute en Cypher, cela peut constituer une base de départ intéressante pour construire une requête plus complexe. Egalement, il y a de l’auto-complétion, ce qui est très pratique quand on ne connait pas bien la structure des requêtes. En cliquant sur l'un des nodes, vous aurez accès à droite à l'intégralité des attributs qu'il possède, ce qui vous donnera aussi une meilleure idée des éléments que vos requêtes Cypher dans BloodHound peuvent utiliser :

Visualisation des attributs d'un node Computer dans neo4j Browser.
Visualisation des attributs d'un node "Computer" dans neo4j Browser.

Autre point intéressant, vous pouvez voir à gauche du graphe produit par la requête Cypher plusieurs formats de mise en format : graph, table, text ou code. Je trouve ces différentes options particulièrement intéressantes dans certains cas de figure où l'on cherche simplement une liste d'éléments, sans relations entre ceux-ci.

Exemple, nous souhaitons obtenir la liste des descriptions des utilisateurs pour y rechercher des mots de passe (cas classique d'informations sensibles stockées au mauvais endroit). Je peux tout à fait utiliser la requête Cypher suivante :

MATCH (u:User) WHERE u.description CONTAINS "password" RETURN u.samaccountname,u.description

Ce n'est pas la fonction première de neo4j ou du Cypher de traiter des requêtes qui ne sont pas orientées relations, mais cela fonctionne très bien quand même. Je choisis ici une sortie au format table, qui correspond mieux à l'affichage du résultat de ma requête :

Résultat au format Table de ma requête sur les descriptions utilisateurs.
Résultat au format Table de ma requête sur les descriptions utilisateurs.

Vous notez d'ailleurs que lorsque la requête Cypher n'est pas orientée relation, la vue graphe n'est pas proposée, nous avons ici le choix entre les vues table, text et code. Autre option intéressante, la possibilité d'exporter ces informations en CSV (tableau) ou JSON :

Ces exports sont notamment très utiles pour faire du reporting et avoir rapidement les données sous un format Excel ou interprétables par du code.

Bref, vous l'aurez compris, le neo4j Browser regorge de fonctionnalités intéressantes pour aller encore plus loin dans l'analyse des données de votre Active Directory.

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

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.