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

FlagQué hace
-uUsername
-pPassword
-nsNameserver (IP del DC) — crítico, le dice dónde resolver DNS
-dNombre de dominio
-c AllRecolectar 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

  • -ns no 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 All es el default correcto. Algunas guías dicen usar -c DCOnly para sigilo. Para boxes CTF y OSCP, solo agarrar todo.
  • El nombre de dominio importa. Algunas boxes usan domain.htb, otras usan domain.htb.local, otras usan domain.local. Sacarlo del output de nmap LDAP o del output de nxc 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

  1. Loguearse a BloodHound CE en http://localhost:8080
  2. Click en el botón Upload (arriba a la derecha, icono de flecha)
  3. Seleccionar todos los archivos JSON de bloodhound-python
  4. 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 ExplorePathfinding
  • 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

EdgeQué SignificaExplotación
GenericWritePuede modificar atributosPoner SPN → Kerberoast, o setear logon script
WriteOwnerPuede tomar ownershipTomar ownership → darse GenericAll
AddMemberPuede agregar usuarios al grupoAgregarte a vos o un usuario comprometido
ReadLAPSPasswordPuede leer passwords de LAPSObtener password de local admin para esa maquina
AllowedToDelegateKerberos delegationAtaques 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:

  1. Conseguir cualquier cred válida — null session, AS-REP Roast, creds en archivos, password spray, lo que sea
  2. Correr bloodhound-python con -c All
  3. Subir archivos JSON a BloodHound CE
  4. Marcar tu usuario como owned — click derecho → Mark as Owned
  5. Correr pathfinding — usuario owned → Domain Admins
  6. Revisar queries pre-armadas — Kerberoastable, AS-REP Roastable, DCSync rights
  7. 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.