BloodHound est un outil d’analyse graphique des environnements Active Directory. Il modélise les relations entre objets AD (utilisateurs, groupes, ordinateurs, GPO) et identifie automatiquement les chemins d’attaque vers des cibles à hauts privilèges (Domain Admins, DC).
Architecture§
SharpHound / BloodHound.py → Collecte des données AD
↓
Données JSON
↓
Neo4j (base de graphes) ← BloodHound GUI (React)
↓
Requêtes Cypher → Chemins d'attaque visualisés
Collecte avec SharpHound§
# Télécharger SharpHound sur la machine compromise
# https://github.com/BloodHoundAD/SharpHound
# Collecte standard (la plus complète)
.\SharpHound.exe -c All
# Collecte ciblée — seulement les sessions actives
.\SharpHound.exe -c Session
# Collecte silencieuse (LDAP uniquement, moins bruyante)
.\SharpHound.exe -c DCOnly
# Collecte depuis une autre session (pass-the-hash)
.\SharpHound.exe --ldapusername alice --ldappassword password
# Avec un DC spécifique
.\SharpHound.exe -d domaine.local --domaincontroller 192.168.1.10
# Sortie : archive ZIP contenant des fichiers JSON
# computers.json, users.json, groups.json, sessions.json, domains.json...
Collecte avec BloodHound.py (sans accès local à la machine Windows)§
# Depuis Kali/Linux avec des credentials
bloodhound-python -u alice -p password -d domaine.local -dc dc01.domaine.local -c All
# Avec pass-the-hash
bloodhound-python -u alice --hashes :ntlm_hash -d domaine.local -ns 192.168.1.10 -c All
# Collecte DNS-less
bloodhound-python -u alice -p password -d domaine.local -ns 192.168.1.10 -c All --dns-timeout 5
Importation et interface§
# 1. Démarrer Neo4j
sudo neo4j start
# Interface : http://localhost:7474 (défaut : neo4j/neo4j → changer au 1er login)
# 2. Démarrer BloodHound GUI
bloodhound
# 3. Importer les données
# Menu → Upload Data → sélectionner le ZIP ou les JSON
# Ou glisser-déposer les fichiers
Requêtes pré-construites (GUI)§
BloodHound propose des requêtes prêtes à l’emploi :
Analysis → Pre-Built Analytics Queries :
"Find all Domain Admins"
→ Liste tous les Domain Admins
"Find Shortest Paths to Domain Admins"
→ Chemin d'attaque le plus court depuis n'importe quel utilisateur
"Find Principals with DCSync Rights"
→ Qui peut effectuer un DCSync ?
"Find Computers where Domain Users are Local Admin"
→ Tous les postes où les utilisateurs du domaine ont admin local
"Shortest Paths to Unconstrained Delegation Systems"
→ Délégation Kerberos non contrainte (vecteur d'escalade)
"Find AS-REP Roastable Users"
→ Comptes sans pré-authentification Kerberos
"Find Kerberoastable Users"
→ Comptes avec SPN (cibles du Kerberoasting)
Requêtes Cypher personnalisées§
BloodHound utilise le langage de requête Neo4j Cypher.
// Trouver tous les chemins d'attaque depuis "alice" vers "Domain Admins"
MATCH p=shortestPath(
(n:User {name:"[email protected]"})-[*1..]->(m:Group {name:"DOMAIN [email protected]"})
)
RETURN p
// Trouver les utilisateurs qui ont GenericAll sur un autre objet
MATCH (n)-[r:GenericAll]->(m)
WHERE n.name <> m.name
RETURN n.name, m.name, type(r)
// Ordinateurs avec délégation non contrainte (sauf les DC)
MATCH (c:Computer {unconstraineddelegation:true})
WHERE NOT c.name CONTAINS "DC"
RETURN c.name
// Utilisateurs membres de groupes imbriqués menant à Domain Admins
MATCH (u:User)-[:MemberOf*1..]->(g:Group {name:"DOMAIN [email protected]"})
RETURN u.name
// Sessions actives sur les DC
MATCH (u:User)-[:HasSession]->(c:Computer {domain:"DOMAINE.LOCAL"})
WHERE c.name CONTAINS "DC"
RETURN u.name, c.name
// Comptes avec des droits sur les GPO
MATCH (n)-[r:GPLink|WriteGPLink|AllExtendedRights|GenericAll|GenericWrite]->(g:GPO)
RETURN n.name, type(r), g.name
// High value targets qui sont atteignables
MATCH (n {highvalue:true})
RETURN n.name, labels(n)
// Tous les chemins depuis les utilisateurs du groupe "IT" vers Domain Admins
MATCH p=shortestPath(
(g:Group {name:"[email protected]"})-[*1..]->(m:Group {name:"DOMAIN [email protected]"})
)
RETURN p
Edges (relations) exploitables§
| Edge | Description | Exploitation |
|---|---|---|
MemberOf | Appartenance à un groupe | Héritage des droits du groupe |
AdminTo | Admin local sur un ordinateur | psexec, WMI, DCOM |
HasSession | Session active d’un utilisateur | Vol de token, dump LSASS |
GenericAll | Contrôle total d’un objet | Modifier le mot de passe, ajouter aux groupes |
GenericWrite | Écriture sur un objet | Modifier des attributs (scriptPath, servicePrincipalName) |
WriteOwner | Changer le propriétaire | S’attribuer GenericAll |
WriteDACL | Modifier la liste d’accès | S’accorder n’importe quel droit |
ForceChangePassword | Forcer le changement de MDP | Changer le mot de passe sans le connaître |
DCSync | GetChangesAll sur le domaine | Dump de tous les hashes |
AllowedToDelegate | Délégation Kerberos contrainte | Impersonate n’importe quel utilisateur |
AllowedToAct | RBCD (Resource-Based Constrained Delegation) | Escalade via délégation basée sur les ressources |
AddMember | Ajouter des membres à un groupe | S’ajouter à Domain Admins |
GPLink | Lien vers une GPO | Si écriture sur GPO → exécution de code sur les objets liés |
Marquer les assets et construire une stratégie§
Dans l'interface :
1. Clic droit sur un utilisateur/ordinateur → "Mark as Owned" (objectif compromis)
2. Clic droit sur un groupe → "Mark as High Value" (cible)
→ BloodHound montre automatiquement les chemins depuis les "Owned" vers les "High Value"
Workflow typique :
1. Importer les données
2. Marquer le compte compromis initial comme "Owned"
3. "Find Shortest Paths to Domain Admins" → voir le chemin graphique
4. Identifier la relation exploitable suivante (GenericAll, AdminTo, etc.)
5. Exploiter cette relation → marquer le prochain objet comme Owned
6. Répéter jusqu'à Domain Admin
Contre-mesures (détection et hardening)§
Détection de la collecte BloodHound :
- Volume anormal de requêtes LDAP (SharpHound → beaucoup de requêtes)
- Requêtes LDAP avec de nombreux attributs (objectClass, adminCount, etc.)
- Connexions SMB anormales (pour la collecte des sessions)
- Outil : Purple Knight, PingCastle (audit AD)
Hardening des chemins d'attaque :
- Réduire le nombre d'AdminTo (pas d'admin local pour les utilisateurs normaux)
- Tier Model (Admin Tier 0/1/2 — séparation des comptes par criticité)
- Nettoyer les ACL excessives (GenericAll, WriteDACL sur des objets sensibles)
- Activer la pré-authentification Kerberos sur tous les comptes
- Supprimer les SPN inutiles
- Protected Users Security Group pour les comptes sensibles
Pièges courants§
- Collecte partielle = chemins manquants :
SharpHound -c Defaultne ramasse pas les sessions ni les LocalGroup. Toujours-c All(plus lent, mais complet). Sans sessions, “Find Shortest Path to Domain Admins” rate des chemins critiques. - SharpHound vs bloodhound.py — données différentes : SharpHound (Windows) collecte plus que bloodhound.py (Linux) sur les sessions. Si possible, faire les deux et fusionner.
- Cache stale : BloodHound interroge un cache local. Si on importe de nouvelles données sans clear, les chemins sont obsolètes. Toujours “Clear database” entre deux engagements.
- Edge “HasSession” éphémère : une session BloodHound = un user était connecté à un moment. Six heures après, le user n’est probablement plus là. Recoller la collecte avant exploitation.
- Custom queries vs canned queries : les requêtes prédéfinies couvrent les cas classiques. Les chemins exotiques (cross-trust, ACL chains avec 6+ étapes) demandent du Cypher manuel.
AdminTovsCanRDP: AdminTo = admin local sur la machine (exécution code SYSTEM). CanRDP = peut se connecter en RDP mais pas forcément admin. Bien lire le edge type.DCSyncpeut être trompeur : BloodHound annonce DCSync via les permissions ACL classiques (Replicating Directory Changes,Replicating Directory Changes All). Mais il manque parfois des chemins indirects via ACL groupes/OUs imbriqués.- GenericAll sur ordinateur ≠ admin local : GenericAll dans AD = modifier l’objet AD. Pour devenir admin local, il faut combiner avec RBCD ou Shadow Credentials. BloodHound montre
GenericAll → ResourceBasedConstrainedDelegation → AdminTo. - Volume de données pour grands AD : sur un AD avec 50000 users, SharpHound peut prendre 30+ minutes et générer des Go. Filtrer par OU ou domain si possible.
- AzureHound pour Entra ID : BloodHound on-prem ne couvre PAS Azure AD / Entra ID. Pour le cloud, utiliser AzureHound. Les graphes peuvent être merged dans BloodHound Community Edition.
Commentaires