#Collecter
# Linux, sans toucher aux DC (LDAP + SMB)
bloodhound-python -u user -p 'Password' -d domain.local \
-ns 10.10.10.10 -c All --zip
# Avec hash
bloodhound-python -u user --hashes :NTHASH -d domain.local -ns 10.10.10.10 -c All
# Windows : SharpHound
SharpHound.exe -c All --zipfilename bh.zip
SharpHound.exe -c All,GPOLocalGroup --LdapUsername user --LdapPassword Password
| Méthode | Bruit | Remarque |
|---|---|---|
-c All |
Élevé | Sessions, ACL, trusts, GPO |
-c DCOnly |
Faible | LDAP uniquement, pas de sessions |
-c Session |
Moyen | Sessions locales |
-c ACL |
Faible | Relations ACL |
#Importer
1. Démarrer neo4j : neo4j console
2. Lancer BloodHound et se connecter (bolt://localhost:7687)
3. Upload Data → sélectionner le zip ou les JSON
4. Attendre la fin de l'ingestion
#Requêtes intégrées
- Shortest Paths to Domain Admins — le chemin le plus court.
- Kerberoastable Users — comptes avec SPN.
- AS-REP Roastable Users — comptes sans pré-auth.
- Unconstrained Delegation — machines et comptes dangereux.
- Find Principals with DCSync Rights — droits de réplication.
- Shortest Path from Owned Principals — depuis les comptes compromis.
#Cypher utiles
// Utilisateurs Kerberoastables
MATCH (u:User {hasspn:true})
RETURN u.name, u.displayname, u.serviceprincipalnames
// Admins locaux d'une machine
MATCH p=(u:User)-[:AdminTo]->(c:Computer {name:"DC01.DOMAIN.LOCAL"})
RETURN p
// Chemins depuis un compte possédé
MATCH p=shortestPath((u:User {owned:true})-[*1..]->(g:Group {name:"DOMAIN ADMINS@DOMAIN.LOCAL"}))
RETURN p
// ACL exploitables
MATCH p=(u:User)-[r:GenericAll|WriteDacl|ForceChangePassword|AddMember]->(t)
RETURN p, type(r)
#Opsec
Sessioninterroge les machines via SMB : très visible et peut déclencher les alertes.DCOnlysuffit pour les ACL et Kerberos, sans toucher aux postes.- Les requêtes LDAP massives sont journalisées (Event 4662 côté DC).
- Évite de collecter depuis un compte à privilèges si un compte utilisateur suffit.