20/09/2024

BloodHound : utiliser le langage Cypher

I. Cypher : utiliser les requêtes pré-enregistrées dans BloodHound

Nous allons à présent effleurer le sujet du Cypher, le langage de base de données utilisé par BloodHound lorsqu'il requête la base de données Neo4j. Il s'agit d'un langage dont la syntaxe s'éloigne un peu des langages très démocratisés comme le SQL. Voici un exemple de requête Cypher :

MATCH p=(m:Group)-[:AdminTo]->(n:Computer) WHERE m.objectid ENDS WITH "-513" RETURN p

Cette requête permet de retrouver et d'afficher tous les nodes ordinateur pour lesquels le groupe "utilisateurs du domaine" a des droits d'administration locale. Nous sommes d'accord, ce n'est pas le langage le plus explicite qui soit, c'est notamment parce qu'il s'agit d'un langage orienté relation. On peut tout de même reconnaitre la recherche d'une relation entre "m" (un groupe), et "n" (un ordinateur) de nature "AdminTo", le tout dans un sens bien précis (regardez l'orientation de la flèche). Nous trouvons ensuite des filtres appliqués sur toutes les relations retournées par le "MATCH". Ici, il faut que l'attribut "objectID" (SID) du groupe termine par "-513" (SID du groupe local "Utilisateurs" sur un système Windows).

Voici autre requête Cypher pour l'exemple :

MATCH p=shortestPath((n)-[:Owns|GenericAll|GenericWrite|WriteOwner|WriteDacl|MemberOf|ForceChangePassword|AllExtendedRights|AddMember|HasSession|Contains|GPLink|AllowedToDelegate|TrustedBy|AllowedToAct|AdminTo|CanPSRemote|CanRDP|ExecuteDCOM|HasSIDHistory|AddSelf|DCSync|ReadLAPSPassword|ReadGMSAPassword|DumpSMSAPassword|SQLAdmin|AddAllowedToAct|WriteSPN|AddKeyCredentialLink|SyncLAPSPassword|WriteAccountRestrictions|GoldenCert|ADCSESC1|ADCSESC3|ADCSESC4|ADCSESC5|ADCSESC6|ADCSESC7*1..]->(g:Group))
WHERE g.objectid ENDS WITH "-512" AND n<>g
RETURN p

Un peu plus conséquente, cette requête utilise de multiples edges dans sa recherche ("Owns", "GenericAll", "AdminTo", etc.). Elle fait également appel à la fonction shortestPath. Il s'agit d'une fonction intégrée à Neo4j qui permet de chercher le chemin le plus court entre deux nodes (avec le plus faible nombre de relations entre les deux). C'est l'une des nombreuses forces de Neo4j (et donc de BloodHound) qui permet aux attaquants de trouver facilement la voie la plus rapide pour compromettre un domaine. Ainsi, si la requête "MATCH" et les filtres appliqués par la clause "WHERE" retournent de multiples résultats, celui avec le plus faible nombre de relations sera affiché, pas les autres.

Enfin, notez le "*1.. ", qui permet de spécifier que l’on cherche un chemin (un nombre de relations variable). Nous pourrons alors avoir des résultats comportant une seule ou plusieurs relations chainées entre un objet "n" à un objet "g" de type "Groupe".

Nous venons de revoir l'intérêt de comprendre le fonctionnement de ces outils, des requêtes Cypher et des filtres d'exclusion. Le risque est sinon de penser qu'il n'existe qu'un seul chemin d'attaque et de passer à côté de tous les autres.

L'apprentissage et la maitrise du langage Cypher nécessiterait un cours à lui seul. Mais heureusement, les créateurs de BloodHound ainsi que la communauté nous ont mis à disposition des requêtes pré-enregistrées que l'on peut trouver dans l'onglet "Cypher" :

Accès aux requêtes Cypher pré-enregistrées.
Accès aux requêtes Cypher pré-enregistrées.

Les Pre-built Searchs sont accessibles en cliquant sur l'icône du dossier. Elles sont rangées sous trois catégories : Active Directory, Azure et Custom searches. Il nous est en effet possible d'enregistrer nos propres requêtes Cypher pour les réutiliser plus tard.

Dans la catégorie Active Directory, prenons par exemple la première requête proposée : "All Domain Admins" :

Sélection et exécution de la requête Cypher "All Domains Admins".
Sélection et exécution de la requête Cypher "All Domains Admins".

Vous le voyez, cliquer sur la requête l'exécute directement et nous avons en retour l'affichage de son résultat par BloodHound. Ici, BloodHound nous retourne tous les utilisateurs qui sont administrateurs du domaine, soit par appartenance directe à des groupes (utilisateur "ADMINISTRATEUR"), soit de façon indirecte au travers plusieurs edges (l'utilisateur "MMARTIN").

II. Cypher : utiliser des requêtes custom dans BloodHound

Lors de la manipulation précédente, vous aurez remarqué que la requête Cypher elle-même s'affiche dans l'encart en haut à gauche. Il nous est donc possible de comprendre en détail cette requête et son résultat, mais aussi de la modifier.

Par exemple, maintenant que nous avons cette requête sous la main, nous pouvons effectuer la même non pas avec le groupe "ADMINS DU DOMAINE" (SID finissant par "-512") spécifié dans la requête, mais le groupe "ADMINISTRATEURS DU SCHEMA" (SID finissant par "-518") :

Création d'une nouvelle requête Cypher et exécution.
Création d'une nouvelle requête Cypher et exécution.

Vous trouverez sur cette documentation Microsoft la liste des SID connus et communs à tous environnements Windows : Microsoft - Well-Known SID Structures

Cette requête permettant de lister les administrateurs du schéma n'existe pas dans les requêtes pré-enregistrées, mais nous venons de la créer en nous basant sur une requête pré-enregistrée.

Le fait de se baser sur les SID des groupes "par défaut" permet notamment aux requêtes Cypher de fonctionner quelle que soit la langue de l'Active Directory cible, ce qui est plutôt pratique. Pensez-y lorsque vous utiliserez des requêtes Cypher récupérées depuis d'autres sources ou provenant de la communauté, les filtres appliqués peuvent parfois être dans une autre langue et porter sur les noms des groupes/nodes.

Maintenant que nous avons une nouvelle requête, profitons-en pour l'enregistrer. Nous pourrons nous en resservir plus tard, pourquoi pas avec les données d'un autre Active Directory :

Enregistrement d'une nouvelle requête Cypher.
Enregistrement d'une nouvelle requête Cypher.

Mine de rien, nous venons de faire notre première requête Cypher ! Une fois enregistrée, nous pourrons retrouver celle-ci dans la catégorie "Custom Searches" :

Réutilisation d'une requête Cypher custom.

Vous pourrez trouver de nombreuses Cypher custom sur Internet. Mais le point le plus important est de pouvoir créer des requêtes qui correspondent aux besoins de sécurité de votre environnement Active Directory. Vous ne trouverez notamment aucune requête pré-enregistrée listant les chemins d'attaque en direction du groupe "PDG", "Usine Dijon" ou ciblant des nodes qui, dans votre contexte, sont sensibles et importants. C'est à vous de les créer en fonctions de vos besoins.

Voilà, nous avons vu un aperçu des requêtes Cypher qu'utilise BloodHound pour rechercher, filtrer et dessiner ses graphes. N'hésitez pas à parcourir et utiliser toutes les requêtes pré-enregistrées afin de vous familiariser avec l'outil.

Pour en apprendre plus sur le langage Cypher, je vous oriente vers les ressources suivantes :

Les deux prochains chapitres vous donneront des éléments de compréhension supplémentaires sur le fonctionnement et la création de requêtes Cypher.

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.