
Herramienta de enumeración de seguridad de Active Directory de baja observabilidad que utiliza interfaces ADSI/COM nativas. Enumera ACLs, delegación, trusts, ADCS, objetivos Kerberoast y rutas de ataque sin .NET ni PowerShell, produciendo resultados compatibles con BloodHound.
# Kestrel
[](https://github.com/ssteelfactor-oss/Kestrel/actions/workflows/build.yml)
[](LICENSE)
[](#)
[](#)
> ### BloodHound te muestra el camino. Kestrel te muestra lo que ya está dentro.
Todos mapean lo mismo: la ruta de ataque - *quién puede llegar a Domain Admin.* Es la pregunta correcta, y las herramientas que la responden son excelentes. Pero un grafo de "quién puede llegar a quién" es ciego a toda una clase de problemas, porque algunas de las peores cosas en un Active Directory no son una ruta en absoluto.
Son una puerta trasera soldada dentro de un atributo. Un certificado que sigue autenticando mucho después de que se restablezca la contraseña. Un permiso estampado en el propio esquema, de modo que cada objeto creado a partir de ahora lo hereda silenciosamente. Una cuenta eliminada cuya capacidad de restauración alguien conservó discretamente. Un objeto oculto de la enumeración mediante un único ACE de denegación de lectura.
**Nada de eso es una arista en un grafo. Todo eso está en tu directorio ahora mismo.** Kestrel lo lee - con llamadas nativas de Windows, permisos de usuario de dominio ordinarios, sin servidor, sin Python, sin agente, y con una huella en el controlador de dominio tan contenida que está [documentada evento por evento](https://github.com/ssteelfactor-oss/kestrel/blob/main/FOOTPRINT.md).
Un `.exe`. Un comando. Todo lo que sigue.
---
## Has estado mirando hacia el lado equivocado
El ecosistema ofensivo de AD - SharpHound, impacket, Certipy y el grafo que hay detrás de ellos - es soberbio, y todos miran la misma superficie: la alcanzabilidad. Kestrel mira las tres dimensiones que esa superficie no puede expresar.
- **Tiempo.** Un grafo es una instantánea. Kestrel lee los metadatos de replicación - *cuándo* cambió un atributo de Tier-0 y *qué DC* lo originó. Un derecho DCSync concedido anoche no es el mismo hallazgo que uno que lleva años ahí, y solo uno de ellos significa que te están atacando ahora mismo.
- **Persistencia en un atributo, no en una arista.** Credenciales sombra, historial de SID, reanimate-tombstones, puertas traseras en el `defaultSecurityDescriptor` del esquema, objetos ocultos, ACEs de denegación `OWNER RIGHTS`, claves DKM de AD FS. Las herramientas de grafo no recopilan esto porque no hay ninguna arista que dibujar.
- **Postura defensiva, invertida.** No "quién puede atacar", sino "qué no está protegido" - la cuenta de Tier-0 fuera de su silo, la cuenta de sincronización con un RID aleatorio que nadie etiquetó, la política de bloqueo que nunca frena un spray.
No es que Kestrel sea más rápido que un grafo. Responde preguntas que el grafo no puede plantear.
---
## Todos los pecados de AD, en un único exe nativo
| Sin | Qué encuentra Kestrel | Flag(s) |
|-----|-------------------|---------|
| **Replicación y delegación** | Derechos DCSync (quién *puede* replicar, sin replicar nunca), delegación sin restricciones / con restricciones / RBCD / S4U | `--acl` · `--delegation` |
| **Abuso de certificados** | AD CS ESC1–5/9, CA fraudulenta en el almacén NTAuth, persistencia mediante certificados de larga duración, **ACL de la clave DKM de AD FS: la condición previa del Golden SAML** | `--adcs` · `--adfs` |
| **Persistencia en atributos** | Credenciales shadow, inyección de historial de SID, **derechos de reanimación de tombstone**, **objetos ocultos**, **backdoors en el `defaultSecurityDescriptor` del esquema**, `adminCount` huérfano | `--shadowcreds` · `--sidhistory` · `--acl` · `--schema` · `--adminsdholder` |
| **Credenciales en texto claro y descifrables** | `cpassword` de GPP, secretos de `unattend`/`sysprep` y contraseñas de scripts en SYSVOL, cuentas Kerberoastables y AS-REP-roastables, carencias de cobertura de LAPS | `--gpp` · `--roast` · `--laps` |
| **Entre dominios e híbrido** | Principales externos en grupos privilegiados, **cuentas de sincronización de Entra Connect etiquetadas como Tier-0**, postura de confianza, **cuentas de equipo creadas mediante MachineAccountQuota** (`mS-DS-CreatorSID`) | `--groups` · `--trust` · `--machines` |
| **Postura y reconocimiento** | Política de contraseñas / PSO, antigüedad de `krbtgt`, configuración de GPO de LLMNR / NBT-NS / WDigest / NTLMv1, lectores de gMSA, equipos obsoletos, topología de delegación | `--pwdpolicy` · `--policy` · `--gmsa` · `--stale` |
| **Arqueología** | **ACE peligrosas huérfanas** (un derecho en manos de un principal eliminado: el SID no resuelve a nadie), **cuentas privilegiadas obsoletas** (olvidadas, con exceso de privilegios, con contraseñas antiquísimas) | `--archaeology` |
| **Endurecimiento del dominio** | Flags de `dSHeuristics` de LDAP anónimo / exclusión de AdminSDHolder, pertenencia amplia a Pre-Windows 2000 Compatible Access | `--hardening` |
| **Postura de servicios** *(leída desde AD, sin paquetes al servicio)* | **Escalada de Exchange a DA y fin de soporte (EOL)**, **toma de control del contenedor de SCCM y mapa de sitios**, **envenenamiento de zonas ADIDNS** (Authenticated Users puede crear registros) | `--exchange` · `--sccm` · `--dns` |
Más de dos docenas de comprobaciones que normalmente están repartidas entre una docena de scripts y dos lenguajes. Aquí son un único binario, y terminan en un único veredicto ordenado por gravedad.
---
## Una línea
```
Kestrel.exe --all --report audit.html
```
Ejecútalo todo. Obtén el informe HTML completo. Y, al final del todo de la consola, la parte que importa:
```
═══ Kestrel - Prioritized Findings ═══
CRITICAL DCSync CORP\svc_sql - non-default principal can replicate directory changes (DCSync)
→ fix: remove GetChanges/GetChangesAll from the principal on the domain head (dsacls) unless it is a DC
CRITICAL AD FS CN=... - read access to the DKM key (Golden SAML precondition)
→ fix: remove non-default read ACEs on the DKM object (dsacls) and rotate the token-signing certificate
HIGH Persistence CN=... - object hidden from enumeration via a broad deny-read ACE
→ fix: inspect the hidden object and remove the broad deny-read ACE (dsacls)
[=] 2 critical · 1 high · 0 medium · 0 low
```
No un muro de salida. Los hallazgos que importan, clasificados, cada uno con el comando para cerrarlo.
---
## Un solo exe. Rojo, azul, púrpura.
- **Rojo / gris** - enumera la persistencia y la delegación que el grafo pasa por alto, exporta directamente a BloodHound CE OpenGraph (`--opengraph`) para fusionarlo con tu colección existente, o pivota desde cualquier principal (`--from`).
- **Azul** - una lista de hallazgos priorizada y remediada; un `--diff` contra la instantánea de la semana pasada para detectar lo que *cambió*; y una herramienta cuya huella de detección exacta está publicada para que puedas incluirla en la lista blanca y ajustar tu propia alerta en torno a ella.
- **Púrpura** - un único artefacto que ambos lados leen de la misma manera. Rojo lo encuentra, azul lo corrige, todos apuntan al mismo número de línea.
## Detectable por diseño
Kestrel es de solo lectura. Nunca escribe en el directorio, nunca replica, nunca necesita `SeSecurityPrivilege`, nunca toca la nube. Leer *quién puede* hacer DCSync no se parece en nada, a nivel de red, a *hacer* DCSync - sin DRSUAPI, sin `4662` de firma de replicación. Cada consulta que ejecuta y cada evento que puede (y no puede) generar está catalogado en **[FOOTPRINT.md](https://github.com/ssteelfactor-oss/kestrel/blob/main/FOOTPRINT.md)**. Un auditor que le dice al defensor exactamente cómo atraparlo no es una contradicción - es precisamente el objetivo.
---
## Inicio rápido
**Consigue una compilación.** Cada ejecución verde de CI publica un artefacto `Kestrel.exe` - descárgalo desde la [pestaña Actions](https://github.com/ssteelfactor-oss/Kestrel/actions), sin necesidad de toolchain.
**O compílalo tú mismo.** Visual Studio (v143+) o MSBuild:
```
git clone https://github.com/ssteelfactor-oss/Kestrel.git
cd Kestrel
msbuild Kestrel.vcxproj /p:Configuration=Release /p:Platform=x64
```
C puro, cero dependencias de terceros. Compila `/MT` y obtendrás un único ejecutable autocontenido: colócalo en un host unido al dominio y ejecútalo como cualquier usuario normal.
**Ejecútalo.**
```
Kestrel.exe --all --report audit.html # everything, HTML report + ranked findings
Kestrel.exe --acl --adcs --adfs # pick specific checks
Kestrel.exe --paths --from CORP\jdoe # attack paths from one principal
Kestrel.exe --all --diff last-week.json # what changed since the last snapshot
Kestrel.exe --all --opengraph graph.json # export to BloodHound CE OpenGraph
```
---
## Módulos
Ejecute `--all`, o seleccione cualquier subconjunto. Ayuda completa: `Kestrel.exe --help`.
| Flag | Escaneo |
|------|------|
| `--acl` | Aristas de ACL, derechos DCSync, higiene de propietario/herencia/canónico, objetos ocultos, reanimate-tombstones |
| `--groups` | Pertenencia privilegiada transitiva + entidades de seguridad externas |
| `--delegation` | Sin restricciones / con restricciones / RBCD / S4U2Self |
| `--paths` / `--from` | Análisis de rutas de ataque hacia Tier-0 (opcionalmente desde una entidad de seguridad dada) |
| `--adcs` | Auditoría de plantillas de certificado / CA de AD CS (ESC1–5/9) + almacén NTAuth + validez |
| `--adfs` | ACL de la clave DKM de AD FS (precondición de Golden SAML) |
| `--schema` | Auditoría de puerta trasera en `defaultSecurityDescriptor` del esquema |
| `--trust` | Postura de confianza de dominio / bosque |
| `--machines` | Cuentas de máquina creadas mediante MachineAccountQuota (`mS-DS-CreatorSID`) |
| `--roast` | Cuentas Kerberoastables + AS-REP-roastables |
| `--shadowcreds` | Credenciales en la sombra (`msDS-KeyCredentialLink`) |
| `--sidhistory` | Inyección de `sIDHistory` (privilegiada / externa) |
| `--adminsdholder` | Objetos huérfanos con `adminCount=1` |
| `--gpp` | Barrido de secretos en SYSVOL - `cpassword` de GPP, `unattend`, credenciales en scripts |
| `--gpolateral` | Grupo local de GPO → aristas laterales (AdminTo / CanRDP / CanPSRemote / ExecuteDCOM) |
| `--policy` | Política de seguridad de GPO (LLMNR / NBT-NS / WDigest / NTLMv1) |
| `--pwdpolicy` | Política de contraseñas / PSO · antigüedad de `krbtgt` · MachineAccountQuota |
| `--hygiene` | Higiene de credenciales (`PASSWD_NOTREQD` / `DONT_EXPIRE` / reversible / filtraciones en descripciones) |
| `--gmsa` | Enumeración de lectores de contraseñas de gMSA |
| `--laps` | Cobertura de LAPS (heredado + Windows LAPS 2023+) |
| `--stale` | Equipos obsoletos mediante `lastLogonTimestamp` |
| `--topology` | Topología de equipos mediante decodificación de SPN |
| `--adws` | Detección de endpoint ADWS (9389/TCP por DC) |
| `--archaeology` | ACEs peligrosas huérfanas (propietario muerto, derecho vivo) + cuentas privilegiadas obsoletas |
| `--hardening` | Indicadores de endurecimiento del dominio: acceso anónimo de `dSHeuristics` / exclusión de SDProp + Pre-Windows 2000 Compatible Access |
| `--exchange` | Postura de Exchange: versión/EOL + escalada de Exchange a DA (WriteDACL sobre el dominio) *(servicio; opcional)* |
| `--sccm` | Postura de SCCM/MECM: ACL del contenedor `System Management` + punto de administración / mapa de sitio *(servicio; opcional)* |
| `--dns` | DNS integrado en AD (ADIDNS): DACL CreateChild de la zona + wpad/isatap/wildcard + DnsAdmins *(servicio; opcional)* |
**Postura de servicios** (`--exchange` · `--sccm` · `--dns`) es opcional y **no** forma parte de `--all`; ejecute `--services` para toda la capa. Los hallazgos ahora llevan etiquetas de técnicas **MITRE ATT&CK**.
**Salida e interoperabilidad:** `--report <file>` (`.html` / `.json` / `.yaml`) · `--opengraph <file>` (BloodHound CE) · `--diff <snapshot.json>` · `--verbose`.
---
## Invariantes de diseño
Estas son promesas, no preferencias: las razones por las que es seguro ejecutarlo en producción. Romper cualquiera de ellas es un fallo de seguridad (consulte [SECURITY.md](https://github.com/ssteelfactor-oss/kestrel/blob/main/SECURITY.md)).
- **Solo lectura** - nunca crea, modifica ni elimina un objeto de directorio. Solo eventos de lectura/acceso, nunca eventos de modificación.
- **Usuario de dominio ordinario** - sin escalada de privilegios, sin `SeSecurityPrivilege`, máscaras de seguridad solo de DACL.
- **Sin replicación** - detecta quién *puede* hacer DCSync; nunca llama a DRSUAPI por sí mismo.
- **Solo directorio y SYSVOL** - sin RPC/SMB contra hosts miembros.
- **Sin evasión** - sin fragmentación de consultas, sin juegos de temporización, sin manipulación de registros. Consulte [FOOTPRINT.md](https://github.com/ssteelfactor-oss/kestrel/blob/main/FOOTPRINT.md).
- **Solo on-prem** - sin llamadas a Entra / Graph / nube; audita el rastro que lo híbrido deja *en AD*.
- **Nativo y autocontenido** - C puro, cero dependencias de terceros, un único `.exe`.
---
## Hoja de ruta
| Versión | Estado | Hito |
|---------|:------:|-----------|
| v0.13 | ✅ | Postura de condición de entrada |
| v0.14 | ✅ | Profundidad de ACL + aristas laterales |
| v0.15 | ✅ | Auditoría de estructura de ACL (clase ADeleg) |
| v0.16 | ✅ | Persistencia sigilosa + profundidad SYSVOL / ADCS |
| v0.17 | ✅ | Huella entre dominios + híbrida |
| v0.18 | ✅ | Higiene de consultas + huella honesta |
| **v1.0** | ✅ | **Funcionalidad completa: hallazgos priorizados + remediación, CI, Apache 2.0** |
| **v1.1** | ✅ | **Capa pasiva de postura de servicios: Exchange · SCCM · ADIDNS · endurecimiento de dominio · etiquetas MITRE ATT&CK** |
| **v1.2** | ✅ | **Arqueología de AD: ACEs peligrosas huérfanas + cuentas privilegiadas obsoletas** |
| v1.3 | 🔲 | Costura híbrida (Entra Connect / Seamless SSO) · nTDSConnection / precondición de DCShadow |
---
## Documentación
- **[FOOTPRINT.md](https://github.com/ssteelfactor-oss/kestrel/blob/main/FOOTPRINT.md)** - el rastro exacto de LDAP / SYSVOL que deja cada escaneo, y los eventos de DC que genera (y que no puede generar).
- **[SECURITY.md](https://github.com/ssteelfactor-oss/kestrel/blob/main/SECURITY.md)** - reporte, alcance y las invariantes de diseño como garantías verificables.
- **[LICENSE](https://github.com/ssteelfactor-oss/kestrel/blob/main/LICENSE)** - Apache 2.0.
## Relacionado
Proyecto principal: [NetEnum](https://github.com/ssteelfactor-oss/NetEnum) - enumeración de AD mediante ADSI / COM / LDAP.
## Autor
[@ssteelfactor-oss](https://github.com/ssteelfactor-oss) - investigación de seguridad e internals de COM / Windows.
## Licencia
Licenciado bajo la **Apache License 2.0** - consulte [LICENSE](https://github.com/ssteelfactor-oss/kestrel/blob/main/LICENSE). Se proporciona "tal cual", sin garantía; ejecútelo únicamente contra directorios que esté autorizado a auditar.