BloodHound MCP

Permite que los modelos de lenguaje grandes interactúen con los datos de BloodHound Community Edition.

Documentación

BloodHound MCP

License: GPL v3

Un servidor de Model Context Protocol (MCP) que conecta LLMs con BloodHound Community Edition y BloodHound Enterprise. Haz preguntas en lenguaje natural, obtén análisis de rutas de ataque, ejecuta consultas Cypher y explora entornos de Active Directory, Azure/Entra ID y OpenGraph, todo desde tu asistente de IA.

Demo

Mira el video de demostración


Cómo Funciona

El servidor expone la API REST de BloodHound CE y el grafo de Neo4j a través de un conjunto de 13 herramientas MCP compuestas, 10 recursos de referencia y un prompt de sistema ajustado para análisis de seguridad ofensiva.

Herramientas Compuestas

Cada herramienta utiliza un parámetro info_type para seleccionar qué datos se devuelven, manteniendo la superficie de herramientas pequeña y eficiente en tokens:

HerramientaOpciones de info_type
domain_infolist, info, users, groups, computers, ous, gpos, dc_syncers, foreign_admins, foreign_group_members, linked_gpos, search
user_infoinfo, sessions, memberships, admin_rights, rdp_rights, dcom_rights, ps_remote_rights, sql_admin_rights, constrained_delegation, controllables, controllers
group_infoinfo, members, memberships, admin_rights, rdp_rights, dcom_rights, ps_remote_rights, controllers, controllables
computer_infoinfo, sessions, local_admins, rdp_rights, dcom_rights, ps_remote_rights, sql_admins, constrained_delegation, controllables, controllers
ou_infoinfo, users, groups, computers, gpos
gpo_infoinfo, controllers
graph_analysisshortest_path, edge_composition, search
adcs_infotemplates, esc_paths
cypher_queryrun, saved_list, saved_get
data_qualitystats, platform_list, platform_info
asset_groupslist, members, custom_selectors
custom_nodeslist, get, create, update, delete, validate_icon, extension_list, extension_upsert, extension_delete, extension_edges
file_uploadupload, start_job, upload_to_job, upload_bytes, upload_bytes_to_job, end_job

Recursos

Material de referencia que el LLM carga bajo demanda, sin llamadas API adicionales:

URI del RecursoContenido
bloodhound://cypher/referenceSintaxis de Cypher, esquema, nombres de propiedades, patrones
bloodhound://cypher/offensive-queriesPlantillas probadas en batalla: DCSync, Kerberoasting, abuso de GPO, delegación, ADCS, credenciales sombra, relay NTLM y más
bloodhound://guides/adReferencia rápida de tipos de nodos y relaciones de AD
bloodhound://guides/ad-methodologyMetodología y flujo de trabajo completo de ataques a AD
bloodhound://guides/azureReferencia rápida de análisis de Azure/Entra ID
bloodhound://guides/azure-methodologyCadenas de ataque completas de Azure
bloodhound://guides/adcsReferencia rápida de ADCS ESC1–ESC13
bloodhound://guides/adcs-methodologyAnálisis detallado de ESC y explotación
bloodhound://opengraph/guideDiseño de esquemas de nodos personalizados y mejores prácticas
bloodhound://opengraph/examplesEjemplos de OpenGraph para SQL Server y aplicaciones web

Prompt de Sistema

El prompt bloodhound_assistant incluye reglas de comportamiento que guían al LLM:

  • Cargar la biblioteca de consultas ofensivas antes de escribir Cypher para cualquier escenario de ataque
  • Nunca sacar conclusiones de privilegios sin verificar membresías de grupos y admincount
  • Respetar las convenciones de nombres de propiedades de BloodHound (hasspn, enabled, admincount — todo en minúsculas)
  • Manejar correctamente el almacenamiento de nombres en mayúsculas (DOMAIN ADMINS@CORP.LOCAL) en los filtros
  • Seguir los patrones adecuados de recorrido de bordes DCSync y GPO

Requisitos Previos

  • Python 3.11+
  • uv
  • Instancia de BloodHound Community Edition con datos cargados
  • Credenciales de API de BloodHound (Token ID + Token Key)

Instalación

Ejecuta el servidor MCP directamente desde Git sin clonarlo primero:

export BLOODHOUND_DOMAIN=your-bloodhound-instance.domain.com
export BLOODHOUND_TOKEN_ID=your-token-id
export BLOODHOUND_TOKEN_KEY=your-token-key
uvx --from git+https://github.com/mwnickerson/bloodhound_mcp bloodhound-mcp

Para una integración reproducible, agrega un commit después de la URL del repositorio, por ejemplo git+https://github.com/mwnickerson/bloodhound_mcp@<commit>. Una instalación con uvx no lee el .env de un checkout separado, por lo que el proceso que lanza el cliente MCP debe proporcionar las variables de credenciales.

Para desarrollo, clona el repositorio e instala su entorno:

git clone https://github.com/mwnickerson/bloodhound_mcp.git
cd bloodhound-mcp
uv sync

Crea un archivo .env en la raíz del proyecto:

BLOODHOUND_DOMAIN=your-bloodhound-instance.domain.com
BLOODHOUND_TOKEN_ID=your-token-id
BLOODHOUND_TOKEN_KEY=your-token-key

Al iniciar, el servidor MCP realiza una solicitud firmada de solo lectura a /api/v2/self. Las credenciales inválidas, fallos de conectividad y fallos de TLS detienen el servidor antes de que acepte llamadas a herramientas MCP. La solicitud de inicio expira después de 10 segundos.

El servidor usa por defecto https en el puerto 443. Anula si es necesario:

BLOODHOUND_PORT=8080
BLOODHOUND_SCHEME=http

La verificación de certificados TLS permanece habilitada cuando no se proporciona una configuración adicional. Para un despliegue de laboratorio de confianza que usa un certificado autofirmado, la verificación se puede deshabilitar explícitamente:

BLOODHOUND_VERIFY_TLS=false

Deshabilitar la verificación debilita la seguridad del transporte y registra una advertencia. No uses esta opción en redes no confiables.


Configuración

Claude Desktop

Agrega a claude_desktop_config.json:

{
  "mcpServers": {
    "bloodhound_mcp": {
      "command": "uvx",
      "args": [
        "--from",
        "git+https://github.com/mwnickerson/bloodhound_mcp",
        "bloodhound-mcp"
      ]
    }
  }
}

Claude Code

Agrega a ~/.claude/mcp.json:

{
  "mcpServers": {
    "bloodhound_mcp": {
      "type": "stdio",
      "command": "uvx",
      "args": [
        "--from",
        "git+https://github.com/mwnickerson/bloodhound_mcp",
        "bloodhound-mcp"
      ]
    }
  }
}

OpenAI Codex CLI

Agrega a ~/.codex/config.toml (o .codex/config.toml para configuración a nivel de proyecto):

[mcp_servers.bloodhound_mcp]
command = "uvx"
args = ["--from", "git+https://github.com/mwnickerson/bloodhound_mcp", "bloodhound-mcp"]

El servidor hereda las credenciales del proceso que lanza Codex. Para mantenerlas en la configuración de MCP en su lugar, pásalas explícitamente:

[mcp_servers.bloodhound_mcp]
command = "uvx"
args = ["--from", "git+https://github.com/mwnickerson/bloodhound_mcp", "bloodhound-mcp"]

[mcp_servers.bloodhound_mcp.env]
BLOODHOUND_DOMAIN = "your-bloodhound-instance.domain.com"
BLOODHOUND_TOKEN_ID = "your-token-id"
BLOODHOUND_TOKEN_KEY = "your-token-key"

MCP Inspector

  • Comando: uvx
  • Argumentos: --from git+https://github.com/mwnickerson/bloodhound_mcp bloodhound-mcp

Token de API de BloodHound

  1. Inicia sesión en BloodHound CE o BloodHound Enterprise
  2. Navega a AdministraciónTokens de API
  3. Crea un nuevo token y copia el Token ID y el Token Key en tu .env

Uso

Consultas de Ejemplo

Reconocimiento:

What domains are in BloodHound?
Show me all Domain Admins in CORP.LOCAL
Find all kerberoastable users
Which computers have unconstrained delegation?

Análisis de Usuarios y Grupos:

What admin rights does jsmith@corp.local have?
Show me all sessions for the administrator account
What groups is this user a member of?
Who controls the IT ADMINS group?

Análisis de Rutas de Ataque:

Find the shortest path from jsmith@corp.local to Domain Admins
Who has DCSync rights in the domain?
Show me all GPO abuse paths
Find ADCS ESC1 paths in the domain

Cypher Personalizado:

Run a Cypher query to find all users with SPN set and admincount=1
Find all computers where DOMAIN USERS can RDP

Cargas de Colección:

Upload this SharpHound ZIP from /tmp/sharphound.zip into BloodHound
Upload these base64-encoded SharpHound ZIP bytes as sharphound.zip
Start an upload job, upload these base64 JSON bytes as users.json, then end the job

Los agentes que ya tengan una colección de SharpHound o AzureHound en memoria deben codificar en base64 los bytes de la colección y llamar a:

file_upload(
    info_type="upload_bytes",
    file_name="sharphound.zip",
    file_bytes_base64="<base64-encoded zip bytes>"
)

Para trabajos de múltiples archivos, llama a start_job, luego upload_bytes_to_job para cada payload en base64, y luego end_job.


Soporte de OpenGraph

BloodHound 8.0+ admite tipos de nodos personalizados mediante OpenGraph, lo que te permite modelar infraestructura no-AD (recursos en la nube, bases de datos, activos personalizados) en el mismo grafo que Active Directory.

La herramienta custom_nodes maneja operaciones CRUD heredadas en configuraciones de visualización de tipos de nodos a través de /api/v2/custom-nodes. Para instancias de BloodHound v9.0.0+ con gestión de extensiones OpenGraph habilitada, la misma herramienta compuesta también admite /api/v2/extensions y /api/v2/extensions-edges mediante extension_list, extension_upsert, extension_delete y extension_edges.

Usa los recursos bloodhound://opengraph/guide y bloodhound://opengraph/examples para el diseño de esquemas y patrones de Cypher. Para esquemas OpenGraph estructurados, haz upsert del esquema de extensión primero, luego ingiere los datos de colección con file_upload.

Requiere BloodHound Enterprise o BloodHound CE 8.0 o posterior. La gestión de extensiones OpenGraph requiere BloodHound 9.0.0+ y la bandera de funcionalidad correspondiente habilitada.


Consideraciones de Seguridad

Los datos de BloodHound procesados a través de esta herramienta se transmiten a los servidores de tu proveedor de LLM. No uses esto con datos de AD de producción a menos que hayas evaluado ese riesgo.

Casos de uso recomendados:

  • Entornos de laboratorio (GOAD, DetectionLab, rangos personalizados)
  • Preparación para entrenamiento y certificación
  • Investigación y desarrollo de herramientas
  • Análisis de dominios no productivos

Mejores prácticas:

  • Rota los tokens de API de BloodHound regularmente
  • Usa un token de API de solo lectura cuando sea posible
  • Considera un puente LLM local para entornos sensibles

Pruebas

# Full test suite
uv run pytest

# Specific modules
uv run pytest tests/test_main_mcp_tools.py -v
uv run pytest tests/test_bloodhound_api.py -v

# Integration tests (requires a live BloodHound instance)
BLOODHOUND_INTEGRATION_TESTS=1 uv run pytest tests/test_integration.py -v

Hoja de Ruta

  • Modo de acceso directo a Neo4j (omite la API REST para recorridos complejos de grafos)
  • Mejora de herramientas para Azure/Entra ID
  • Mejor cobertura de rutas de ataque ADCS
  • Ejemplos y plantillas adicionales de OpenGraph

Contribuciones

Las contribuciones son bienvenidas. Abre un issue para discutir cambios significativos antes de enviar un PR.

  1. Haz un fork del repositorio
  2. Crea una rama de funcionalidad
  3. Agrega pruebas para la nueva funcionalidad
  4. Ejecuta uv run pytest y confirma que todo pasa
  5. Envía un pull request

Agradecimientos

Licencia

GNU General Public License v3.0 — consulta LICENSE para más detalles.