Skip to content

BloodHound — BloodHound.py Data Collection (Linux)

¿Qué es BloodHound.py?

Collector no oficial de BloodHound escrito en Python por Dirk-jan Mollema, basado en Impacket. Permite recolectar datos de AD desde Linux sin necesitar unirse al dominio.


Instalación

c
# Via pip
pip install bloodhound

# Desde el repositorio
git clone https://github.com/fox-it/BloodHound.py -q
cd BloodHound.py/
sudo python3 setup.py install

Requiere: impacket, ldap3, dnspython.


Uso básico

c
# Ver opciones
python3 bloodhound.py

# Recolección básica con usuario y contraseña
bloodhound-python -d inlanefreight.htb -c DCOnly -u htb-student -p HTBRocks! -ns 10.129.204.207

# Con nameserver alternativo (cuando el DNS no apunta al DC)
bloodhound-python -d inlanefreight.htb -c Default -u htb-student -p HTBRocks! -ns 10.129.204.207

# Comprimir output en zip
bloodhound-python -d inlanefreight.htb -c All -u htb-student -p HTBRocks! -ns 10.129.204.207 --zip

Por defecto intenta Kerberos y cae a NTLM si falla.


Autenticación con Kerberos

Kerberos requiere resolución DNS del dominio. El flag --nameserver no es suficiente porque el host necesita resolver el KDC directamente.

c
# Agregar el DC al /etc/hosts
echo "10.129.204.207 dc01.inlanefreight.htb dc01 inlanefreight inlanefreight.htb" | sudo tee -a /etc/hosts

# Sincronizar tiempo con el DC (obligatorio para Kerberos)
sudo ntpdate 10.129.204.207

# Correr con Kerberos
bloodhound-python -d inlanefreight.htb -c DCOnly -u htb-student -p HTBRocks! -ns 10.129.204.207 --kerberos

Usar Kerberos en lugar de NTLM hace que el tráfico parezca más normal en el entorno.


Autenticación con hash NTLM

c
bloodhound-python -d inlanefreight.htb -c All -u htb-student --hashes aad3b435b51404eeaad3b435b51404ee:88ad09182de639ccc6579eb0849751cf -ns 10.129.204.207

Métodos de recolección

Default     → Group, LocalAdmin, Session, Trusts, ACL, Container, RDP, ObjectProps, DCOM, SPNTargets, PSRemote
All         → Todo excepto LoggedOn
DCOnly      → Solo desde el DC, sin conectar a hosts del dominio
LoggedOn    → Requiere admin en los hosts para obtener sesiones
ACL         → Solo ACLs

Opciones importantes

c
# DC específico
bloodhound-python -d inlanefreight.htb -c DCOnly -u htb-student -p HTBRocks! -dc dc01.inlanefreight.htb -ns 10.129.204.207

# Excluir DCs de enumeración de computadoras
bloodhound-python -d inlanefreight.htb -c Default -u htb-student -p HTBRocks! -ns 10.129.204.207 --exclude-dcs

# Número de workers para enumeración de computadoras
bloodhound-python -d inlanefreight.htb -c Default -u htb-student -p HTBRocks! -ns 10.129.204.207 -w 5

# Usar solo hosts específicos
bloodhound-python -d inlanefreight.htb -c ComputerOnly -u htb-student -p HTBRocks! -ns 10.129.204.207 --computerfile computers.txt

# Verbose
bloodhound-python -d inlanefreight.htb -c DCOnly -u htb-student -p HTBRocks! -ns 10.129.204.207 -v

SharpHound desde evil-winrm — Double Hop Problem

evil-winrm usa autenticación de red (Network Logon) que no genera un TGT de Kerberos en memoria. SharpHound necesita ese TGT para autenticarse al LDAP del DC. Sin él el DC rechaza la conexión.

RDP / PSExec  → Interactive Logon  → TGT en memoria → SharpHound funciona ✅
evil-winrm    → Network Logon      → Sin TGT        → SharpHound falla   ❌

Es el mismo problema del Double Hop: cualquier herramienta que intente autenticarse a un segundo servicio desde una sesión WinRM falla porque no hay credenciales cacheadas para reenviar.


Solución — schtasks para crear sesión interactiva

schtasks con /ru crea una tarea que corre en el contexto del usuario especificado como una sesión interactiva, lo que sí genera el TGT necesario.

1. Crear la tarea programada

c
schtasks /create /tn "SH" /tr "C:\Users\htb-student\Documents\SharpHound.exe -c All --outputdirectory C:\Users\htb-student\Documents" /sc once /st 00:00 /ru INLANEFREIGHT\htb-student /rp HTBRocks! /f

2. Ejecutar la tarea

c
schtasks /run /tn "SH"

3. Verificar si está corriendo

c
schtasks /query /tn "SH" /fo LIST
c
# O buscar el proceso directamente
tasklist | findstr Sharp
Get-Process | where {$_.Name -like "*Sharp*"}

El campo Status en la query muestra Running si está activa o Ready si terminó.

Alternativa — BloodHound.py desde Linux (sin tocar Windows)

Si schtasks tampoco funciona o quieres evitar ruido en Windows:

c
# Agregar DC al /etc/hosts
echo "10.129.23.176 dc01.inlanefreight.htb inlanefreight.htb" | sudo tee -a /etc/hosts

# Recolectar desde Linux directamente
bloodhound-python -d inlanefreight.htb -c All -u htb-student -p HTBRocks! -dc dc01.inlanefreight.htb -ns 10.129.23.176 --dns-tcp --zip

Nota personal — workaround descubierto en práctica

En caso de que solo tnga el servicio winrm y se tenga problemas con el TGS ya que


Output y carga a BloodHound

c
# Ver archivos generados
ls *.json

# Comprimir manualmente
zip -r bh_data.zip *.json

# Iniciar Neo4j
sudo neo4j console
# O
sudo systemctl start neo4j

# Lanzar BloodHound
./BloodHound --no-sandbox

A diferencia de SharpHound, BloodHound.py no comprime automáticamente los JSON. Usar --zip para que lo haga o comprimir manualmente antes de importar.


Diferencias clave con SharpHound

BloodHound.py no soporta Session Loop como SharpHound. Para capturar sesiones activas hay que correrlo varias veces manualmente o con un script.

BloodHound.py puede no recolectar ciertos datos que SharpHound sí obtiene, especialmente datos de sesiones que requieren conectividad directa a los hosts. Para entornos donde solo tienes acceso de red al DC, DCOnly es la opción más confiable.