Saltearse al contenido

BloodHound

BloodHound transforma la enumeración plana de AD en un grafo de relaciones: nodos (usuarios, grupos, equipos, OUs, GPOs, dominios) unidos por aristas que representan permisos y relaciones (MemberOf, AdminTo, HasSession, GenericAll, CanRDP, Owns…). Sobre ese grafo, una consulta responde la pregunta que de forma manual es casi imposible: “¿cuál es el camino más corto desde la cuenta que controlo hasta Domain Admin?”. Convierte miles de ACLs dispersas en una ruta de ataque concreta.

El problema que BloodHound explota no es un bug: es la complejidad acumulada. En un AD real hay decenas de miles de permisos delegados, grupos anidados y sesiones activas que nadie audita en conjunto. Relaciones individualmente inocuas encadenadas forman una ruta a DA que el equipo de defensa no ve porque nunca la mira como grafo. El atacante sí.

  • Colectores (SharpHound): recorren el dominio vía LDAP, SMB y sesiones, y producen JSON.
  • Interfaz (BloodHound): carga el JSON en una base Neo4j y permite consultar/visualizar rutas.
  • Dos sabores: BloodHound Community Edition (nuevo, web, colector bloodhound.py/SharpHound) y el legacy (Electron). Las aristas y la lógica son equivalentes.
# desde Windows (ejecutable o DLL en memoria)
SharpHound.exe -c All --zipfilename out
# desde Linux con credenciales (sin tocar un host Windows)
bloodhound-python -u user -p pass -d dominio.local -ns <DC_IP> -c All
# métodos de colección: Session, LoggedOn, ACL, Trusts, Group, LocalAdmin...

-c All recoge ACLs, sesiones, admins locales, trusts y GPOs. Para sigilo, --stealth o métodos selectivos (menos consultas, menos ruido).

Carga el ZIP y marca tu nodo de inicio como Owned. Consultas clave:

  • “Shortest Path to Domain Admins” desde tu usuario/host owned → la ruta directa.
  • Kerberoastable / ASREProastable users → objetivos de roasting (ver Ataques Kerberos).
  • Unconstrained/constrained delegation → ver ad-delegation.
  • Dangerous ACLs: GenericAll, WriteDacl, WriteOwner, ForceChangePassword, AddMember sobre objetos privilegiados.
  • Sesiones de usuarios privilegiados en hosts que ya controlas (HasSession) → robo de credenciales ahí.
  • Where can my owned principals RDP / PSRemote; Computers where Domain Users are local admin.

Interpretar aristas (lo que cada una habilita)

Sección titulada «Interpretar aristas (lo que cada una habilita)»
MemberOf -> heredas permisos del grupo
AdminTo -> admin local en ese equipo (ejecución, dump)
HasSession -> hay credenciales de ese usuario en ese host
GenericAll -> control total del objeto (reset pass, add member, RBCD)
WriteDacl -> te concedes permisos sobre el objeto
ForceChangePassword -> cambias la password del usuario sin saber la vieja
Owns / WriteOwner -> te haces dueño y reescribes la DACL
AllowedToDelegate -> delegación constrained explotable
  • SharpHound / bloodhound.py — colectores (Windows / Linux).
  • BloodHound CE / AzureHound (para Entra ID / Azure AD).
  • Cypher (lenguaje de Neo4j) para consultas personalizadas sobre el grafo.
  • PlumHound, GoodHound — reporting priorizado sobre los datos de BloodHound.

De “tengo una cuenta cualquiera” a “sé exactamente qué 3 pasos me llevan a Domain Admin”. BloodHound no explota por sí solo, pero planifica el ataque entero y revela rutas que ningún humano encontraría a mano.

  • SharpHound genera consultas LDAP y conexiones SMB masivas en poco tiempo desde una workstation → patrón detectable (event 4662, picos LDAP, \\host\IPC$ a muchos equipos para sesiones).
  • Enumeración de sesiones (NetSessionEnum/NetWkstaUserEnum) contra muchos hosts.
  • Ejecución del binario/DLL SharpHound (firmas, Sysmon image load).
  • Auditoría LDAP fina (4662) y de logon de red; alertas por volumen de consultas por cuenta.
  • Restringe NetSessionEnum anónimo/usuario (clave: priva a SharpHound de la arista HasSession).
  • Honeytokens: cuentas “jugosas” que al aparecer en una ruta y ser tocadas alertan.
  • El mejor control es borrar aristas: audita y elimina ACLs peligrosas, aplana grupos anidados, quita admins locales de usuarios de dominio.
  • Implementa tiering / PAW (admins de Tier 0 nunca inician sesión en estaciones) → corta las rutas HasSession.
  • Corre BloodHound tú mismo periódicamente como herramienta defensiva: mide y reduce los caminos a DA.
  • LAPS, gMSA, Protected Users, y limpieza de membresías privilegiadas.

Si detectas recolección, asume que el atacante ya tiene el mapa: prioriza cerrar las rutas cortas a DA (reset de cuentas en la ruta, quitar las ACLs abusables) antes que perseguir solo el host origen.

  • BloodHound no es un CVE: es metodología. Aparece en informes de ransomware (Conti playbook filtrado, LockBit, BlackCat) como herramienta estándar de mapeo pre-DA.
  • MITRE ATT&CK: T1087 (account discovery), T1069 (groups), T1482 (trusts), T1018 (remote systems).
  • El propio equipo de BloodHound (SpecterOps) documenta rutas reales y su mitigación; base de la disciplina “Attack Path Management”.
  • Recolectar con -c All (SharpHound o bloodhound.py) sin errores
  • Marcar nodos owned e importar el ZIP
  • “Shortest Path to Domain Admins” desde tu principal
  • Usuarios Kerberoastable / ASREProastable
  • ACLs peligrosas (GenericAll/WriteDacl/ForceChangePassword) a objetos privilegiados
  • Delegaciones (unconstrained/constrained/RBCD)
  • Sesiones de usuarios privilegiados en hosts controlables
  • Consultas Cypher propias para rutas no obvias