root@sparrow:~/writeups$ cat bloodhound.md
// Active Directory
BloodHound
21 Jul 2026
· 6 min read
BloodHound is an Active Directory analysis tool that maps users, groups, computers, and permissions as a graph. Its value lies in surfacing hidden relationships that open privilege escalation paths up to Domain Admin. Data is collected withSharpHound(Windows) orbloodhound-python(Linux) and loaded into aNeo4jdatabase.
What really matters isn't collecting data but understanding that BloodHound models AD as directed relationships: each edge (MemberOf, AdminTo, HasSession…) is a concrete attack step. The collectors (-c All, DCOnly, Session) determine which edges you obtain and how much noise you generate, and Cypher queries let you interrogate the graph beyond the predefined paths.
1. Beginner level — collection with SharpHound

| Command | What it does |
|---|---|
bloodhound-python -u u -p p -d dom -c All | Collects full domain data |
SharpHound.exe -c All | Collects full data (from Windows) |
bloodhound-python -u u -p p -d dom -c DCOnly | Collects only from the DC (stealthier) |
bloodhound-python -u u -p p -d dom -ns <ip> | Specifies the DNS/DC server to use |
SharpHound.exe -c Group,LocalAdmin | Collects only groups and local admins |
bloodhound-python -u u -p p -d dom -c Session | Collects only active sessions |
neo4j start | Starts the Neo4j database |
bloodhound | Launches the BloodHound graphical interface |
bloodhound-python -u u -p p -d dom --zip | Compresses the results into a ZIP |
SharpHound.exe -c All --zipfilename out.zip | Names the output ZIP file |
bloodhound-python -u u -p p -d dom -c All -v | Verbose mode |
bloodhound-python --hashes LM:NT u@dom -c All | Authenticates using an NTLM hash |
SharpHound.exe --help | Shows SharpHound help |
bloodhound-python -u u -p p -d dom --dns-tcp | Forces DNS resolution over TCP |
2. Advanced level — stealth and Cypher queries

| Command | What it does |
|---|---|
SharpHound.exe -c All --Stealth | Collection in stealth mode (less noise) |
SharpHound.exe -c All --ExcludeDCs | Excludes the DCs from collection |
bloodhound-python -c All --disable-autogc | Disables the automatic garbage collector |
bloodhound-python -u u -p p -d dom -c LoggedOn | Collects logged-on users |
SharpHound.exe -c All -d otro.local | Collects against a trusted domain |
bloodhound-python -u u -p p -d dom --kerberos | Authenticates using Kerberos instead of NTLM |
MATCH p=shortestPath((u:User)-[*]->(d:Domain)) RETURN p | Cypher: shortest path to Domain Admin |
MATCH (u:User {owned:true}) RETURN u | Cypher: lists the nodes marked "owned" |
MATCH (n) WHERE n.admincount=true RETURN n | Cypher: users with AdminCount enabled |
SharpHound.exe -c All --LdapUsername u --LdapPassword p | Collects with alternate LDAP credentials |
bloodhound-python -u u -p p -d dom -c ObjectProps | Collects extended object properties |
SharpHound.exe -c All --SearchForest | Extends collection to the whole AD forest |
bloodhound-python -u u -p p -d dom --throttle 1000 | Adds delay between requests (ms) |
SharpHound.exe -c All --CacheFilename cache.bin | Sets a custom cache file |
3. Details people miss
- BloodHound needs a running
Neo4jdatabase before loading data: startneo4j startand confirm it answers onbolt://localhost:7687before launching the GUI. - The
-c Allcollector is the most complete but also the noisiest: in monitored environments useDCOnlyor--Stealthto cut down requests and host connections. bloodhound-pythonrelies on correct DNS resolution toward the DC; if it fails, use-ns <ip>to pin the DNS server or--dns-tcpwhen UDP is blocked.- Watch version compatibility: the SharpHound data format must match the BloodHound version importing the ZIP, or ingestion will fail silently.
- Mark the nodes you already control as owned in the interface: many attack-path queries (and Cypher ones using
owned:true) build on that state to compute realistic paths.
Responsible use
These commands are for systems you own or have explicit written authorisation to test (labs, CTFs, contracted engagements). Using them against third-party infrastructure without permission is illegal in most countries.
BloodHound es una herramienta de análisis de Active Directory que representa usuarios, grupos, equipos y permisos como un grafo. Su valor está en revelar relaciones ocultas que abren caminos de privilege escalation hasta Domain Admin. Los datos se recolectan conSharpHound(Windows) obloodhound-python(Linux) y se cargan en una baseNeo4j.
Lo que de verdad importa no es recolectar datos, sino entender que BloodHound modela AD como relaciones dirigidas: cada arista (MemberOf, AdminTo, HasSession…) es un paso de ataque concreto. Los colectores (-c All, DCOnly, Session) determinan qué aristas obtienes y cuánto ruido generas, y las consultas Cypher te dejan interrogar el grafo más allá de las rutas predefinidas.
1. Nivel principiante — recolección con SharpHound

| Comando | Qué hace |
|---|---|
bloodhound-python -u u -p p -d dom -c All | Recolecta datos completos del dominio |
SharpHound.exe -c All | Recolecta datos completos (desde Windows) |
bloodhound-python -u u -p p -d dom -c DCOnly | Recolecta solo desde el DC (más sigiloso) |
bloodhound-python -u u -p p -d dom -ns <ip> | Especifica el servidor DNS/DC a usar |
SharpHound.exe -c Group,LocalAdmin | Recolecta solo grupos y admins locales |
bloodhound-python -u u -p p -d dom -c Session | Recolecta solo sesiones activas |
neo4j start | Inicia la base de datos Neo4j |
bloodhound | Lanza la interfaz gráfica de BloodHound |
bloodhound-python -u u -p p -d dom --zip | Comprime los resultados en un ZIP |
SharpHound.exe -c All --zipfilename out.zip | Nombra el archivo ZIP de salida |
bloodhound-python -u u -p p -d dom -c All -v | Modo detallado (verbose) |
bloodhound-python --hashes LM:NT u@dom -c All | Autentica usando hash NTLM |
SharpHound.exe --help | Muestra la ayuda de SharpHound |
bloodhound-python -u u -p p -d dom --dns-tcp | Fuerza la resolución DNS por TCP |
2. Nivel avanzado — sigilo y consultas Cypher

| Comando | Qué hace |
|---|---|
SharpHound.exe -c All --Stealth | Recolección en modo sigiloso (menos ruido) |
SharpHound.exe -c All --ExcludeDCs | Excluye los DCs de la recolección |
bloodhound-python -c All --disable-autogc | Deshabilita el garbage collector automático |
bloodhound-python -u u -p p -d dom -c LoggedOn | Recolecta usuarios con sesión iniciada |
SharpHound.exe -c All -d otro.local | Recolecta contra un dominio de confianza |
bloodhound-python -u u -p p -d dom --kerberos | Autentica usando Kerberos en vez de NTLM |
MATCH p=shortestPath((u:User)-[*]->(d:Domain)) RETURN p | Cypher: camino más corto a Domain Admin |
MATCH (u:User {owned:true}) RETURN u | Cypher: lista los nodos marcados "owned" |
MATCH (n) WHERE n.admincount=true RETURN n | Cypher: usuarios con AdminCount activo |
SharpHound.exe -c All --LdapUsername u --LdapPassword p | Recolecta con credenciales LDAP alternativas |
bloodhound-python -u u -p p -d dom -c ObjectProps | Recolecta propiedades extendidas de objetos |
SharpHound.exe -c All --SearchForest | Extiende la recolección a todo el bosque AD |
bloodhound-python -u u -p p -d dom --throttle 1000 | Añade retraso entre peticiones (ms) |
SharpHound.exe -c All --CacheFilename cache.bin | Define un archivo de caché personalizado |
3. Detalles que se pasan por alto
- BloodHound necesita una base
Neo4jcorriendo antes de cargar datos: arrancaneo4j starty verifica que responde enbolt://localhost:7687antes de lanzar la GUI. - El colector
-c Alles el más completo pero también el más ruidoso: en entornos monitorizados usaDCOnlyo--Stealthpara reducir las peticiones y las conexiones a hosts. bloodhound-pythondepende de una resolución DNS correcta hacia el DC; si falla, usa-ns <ip>para fijar el servidor DNS o--dns-tcpcuando UDP esté bloqueado.- Ojo con la compatibilidad de versiones: el formato de datos de SharpHound debe coincidir con la versión de BloodHound que importa el ZIP, o la ingesta fallará silenciosamente.
- Marca los nodos que ya controlas como owned en la interfaz: muchas consultas de rutas de ataque (y las Cypher con
owned:true) parten de ese estado para calcular caminos realistas.
Uso responsable
Estos comandos son para entornos propios o con autorización explícita por escrito (laboratorios, CTF, auditorías contratadas). Usarlos contra infraestructura ajena sin permiso es ilegal en la mayoría de países.