BloodHound mapea las relaciones de Active Directory y encuentra rutas de ataque que son invisibles a la enumeración manual. En Forest, reveló una cadena a través de 5 grupos anidados hasta WriteDACL sobre el dominio. Nunca habría encontrado eso a mano. Nunca.
Así es como lo configuro, recolecto datos, los importo, y encuentro las rutas que importan.
Setup — BloodHound CE en Kali
BloodHound CE (Community Edition) reemplazó al viejo BloodHound. Corre como un container Docker con una web UI.
Instalar e Iniciar
# Pull e iniciar BloodHound CE
curl -L https://ghst.ly/getbhce | docker compose -f - up
# La primera corrida tarda unos minutos en bajar las imágenes
# Web UI: http://localhost:8080
Primer Login — La Trampa de la Password de neo4j
En el primer inicio, BloodHound CE genera una password de admin aleatoria. Se imprime en los Docker logs y es fácil pasarla por alto.
# Encontrar la password inicial
docker compose logs | grep "Initial Password"
# o revisar el scrollback de los logs buscando las credenciales generadas
El gotcha que me pasó en Active: No podía encontrar la password en la salida de terminal porque se había scrolleado. Tuve que buscar en los Docker logs. Guardarla la primera vez.
Las credenciales por defecto son generalmente admin / <random>. Te va a obligar a cambiar la password en el primer login.
Verificar que Está Corriendo
Navegar a http://localhost:8080. Deberías ver la página de login de BloodHound CE. Loguearse con las creds iniciales y setear una nueva password.
Recolección de Datos — bloodhound-python
bloodhound-python es el collector para Linux. Hace queries al DC remotamente — no hay necesidad de correr nada en el target.
El Comando que Uso Cada Vez
bloodhound-python -u 'USERNAME' -p 'PASSWORD' -ns $ip -d DOMAIN.local -c All
Desglose de Flags
| Flag | Qué hace |
|---|---|
-u | Username |
-p | Password |
-ns | Nameserver (IP del DC) — crítico, le dice dónde resolver DNS |
-d | Nombre de dominio |
-c All | Recolectar todo — usuarios, grupos, sesiones, ACLs, trusts, containers, GPOs |
Output
Crea varios archivos JSON en el directorio actual:
20260324_computers.json
20260324_domains.json
20260324_groups.json
20260324_users.json
Ejemplos Reales de Mis Boxes
# Active — creds de GPP
bloodhound-python -u 'SVC_TGS' -p 'GPPstillStandingStrong2k18' -ns 10.129.3.112 -d active.htb -c All
# Forest — creds de AS-REP
bloodhound-python -u 'svc-alfresco' -p 's3rvice' -ns 10.129.95.210 -d htb.local -c All
# Blackfield — creds de AS-REP
bloodhound-python -u 'support' -p '#00^BlackKnight' -ns $ip -d BLACKFIELD.local -c All
Cosas a Tener en Cuenta
-nsno es opcional en la práctica. Sin el, la resolución DNS falla porque tu Kali no sabe cómo resolver el dominio. Siempre setearlo a la IP del DC.-c Alles el default correcto. Algunas guías dicen usar-c DCOnlypara sigilo. Para boxes CTF y OSCP, solo agarrar todo.- El nombre de dominio importa. Algunas boxes usan
domain.htb, otras usandomain.htb.local, otras usandomain.local. Sacarlo del output de nmap LDAP o del output denxc smb. Nombre de dominio incorrecto = recolección falla silenciosamente o retorna datos incompletos. - Si las passwords tienen caracteres especiales (
$,!,#), usar comillas simples en bash.
Importar Datos a BloodHound CE
- Loguearse a BloodHound CE en
http://localhost:8080 - Click en el botón Upload (arriba a la derecha, icono de flecha)
- Seleccionar todos los archivos JSON de bloodhound-python
- Esperar a que complete la ingestion
Eso es todo. La base de datos de grafos está poblada. Hora de hacer queries.
Queries que Importan
Estas son las queries que realmente corro. En orden.
1. Camino Más Corto a Domain Admin
Esto es lo primero que reviso. Cada vez.
En BloodHound CE:
- Ir a Explore → Pathfinding
- Start node: tu usuario owned
- End node: DOMAIN [email protected]
- Darle a buscar
En Forest, esto mostro:
svc-alfresco → Service Accounts → Privileged IT Accounts → Account Operators
→ GenericAll sobre Exchange Windows Permissions
→ WriteDACL sobre dominio HTB.LOCAL
Cinco grupos de profundidad. Invisible sin BloodHound.
2. Usuarios Kerberoasteables
MATCH (u:User) WHERE u.hasspn=true RETURN u
O usar la query pre-armada “List all Kerberoastable Users” en la pestaña Analysis.
En Active, esto mostró que la cuenta Administrator tenía SPN active/CIFS:445. Eso es inusual — normalmente hacés Kerberoast a service accounts, no al Administrator real. Pero el SPN estaba ahí, y la password era débil.
3. Usuarios AS-REP Roasteables
MATCH (u:User) WHERE u.dontreqpreauth=true RETURN u
O la query pre-armada “List all AS-REP Roastable Users”.
Encontré svc-alfresco en Forest y support en Blackfield de esta forma.
4. Usuarios con Derechos DCSync
MATCH p=(u)-[:MemberOf|GetChanges|GetChangesAll*1..]->(d:Domain) RETURN p
Muestra quién puede hacer DCSync ya sin ninguna escalada de privilegios. Si tenés una de estas cuentas, directo a impacket-secretsdump.
5. Encontrar Principals con Derechos Peligrosos
Mirar la pestaña Analysis para queries pre-armadas:
- Shortest path from owned principals
- Find all paths to Domain Admins
- Users with local admin rights
- Group memberships for a specific user
Entendiendo el Grafo — Tipos de Edge que Importan
Cuando ves una ruta en BloodHound, los edges (flechas entre nodos) te dicen qué tipo de acceso tenés. Estos son los que he explotado realmente:
GenericAll
Control total sobre el objeto target. Podés:
- Resetear su password
- Agregarlos a grupos
- Modificar sus atributos
- Ponerles un SPN (targeted Kerberoasting)
En Forest, la cadena de grupos de svc-alfresco dio GenericAll sobre Exchange Windows Permissions. Eso significaba que podía agregarme a ese grupo.
WriteDACL
Puede modificar la access control list del objeto target. Esta es la grande. WriteDACL sobre un objeto de dominio significa que podés darte cualquier permiso — incluyendo derechos DCSync.
En Forest, Exchange Windows Permissions tenía WriteDACL sobre el dominio HTB.LOCAL. Después de agregarme a ese grupo, usé PowerView para otorgar derechos DCSync:
Add-DomainObjectAcl -TargetIdentity "DC=htb,DC=local" -PrincipalIdentity svc-alfresco -Rights DCSync
Después impacket-secretsdump sacó cada hash del dominio.
ForceChangePassword
Puede cambiar la password del usuario target sin conocer la actual. Se hace vía rpcclient:
rpcclient -U 'support%#00^BlackKnight' $ip
rpcclient $> setuserinfo2 audit2020 23 'Password@1234'
En Blackfield, support tenía ForceChangePassword sobre audit2020. Cambié la password, usé el acceso de audit2020 al share forensic, agarré el LSASS dump.
Otros Edges que Vale la Pena Conocer
| Edge | Qué Significa | Explotación |
|---|---|---|
| GenericWrite | Puede modificar atributos | Poner SPN → Kerberoast, o setear logon script |
| WriteOwner | Puede tomar ownership | Tomar ownership → darse GenericAll |
| AddMember | Puede agregar usuarios al grupo | Agregarte a vos o un usuario comprometido |
| ReadLAPSPassword | Puede leer passwords de LAPS | Obtener password de local admin para esa maquina |
| AllowedToDelegate | Kerberos delegation | Ataques de constrained/unconstrained delegation |
Rutas de Ataque que He Visto
Ruta 1: Abuso de Grupos Anidados → DCSync (Forest)
Usuario Owned → Grupo → Grupo → Grupo → GenericAll → Grupo Target → WriteDACL → Dominio
La jugada: Agregarte al grupo que tiene WriteDACL. Usar WriteDACL para otorgarte derechos DCSync. Correr secretsdump.
Ruta 2: ForceChangePassword → Lateral Movement (Blackfield)
Usuario Owned → ForceChangePassword → Usuario Target → Acceso a nuevos recursos
La jugada: Cambiar la password del target. Loguearse como él. Ver a qué tiene acceso que vos no tenías.
Ruta 3: Kerberoasting Directo (Active)
Usuario Owned → GetUserSPNs → Administrator tiene SPN → Crackear TGS → Domain Admin
La jugada: BloodHound muestra qué cuentas de alto valor tienen SPNs. Si Administrator u otra cuenta DA tiene uno, hacerle Kerberoast.
Mi Workflow de BloodHound
Cada box de AD, mismo proceso:
- Conseguir cualquier cred válida — null session, AS-REP Roast, creds en archivos, password spray, lo que sea
- Correr bloodhound-python con
-c All - Subir archivos JSON a BloodHound CE
- Marcar tu usuario como owned — click derecho → Mark as Owned
- Correr pathfinding — usuario owned → Domain Admins
- Revisar queries pre-armadas — Kerberoastable, AS-REP Roastable, DCSync rights
- Caminar la ruta que BloodHound te muestra
El paso 5 es donde pasa la magia. BloodHound hace el graph traversal a través de cada membresia de grupo, ACL, y delegation en el dominio. Encuentra rutas que nunca encontrarías manualmente.
La verdad: Nunca he resuelto una box de AD sin que BloodHound me mostrara algo que me perdí. En Forest, la ruta era a través de 5 grupos anidados. En Blackfield, mostró el edge ForceChangePassword. En Active, confirmó el SPN de Administrator. BloodHound no es opcional. Es el mapa.