Saltearse al contenido

AD CS (Active Directory Certificate Services)

AD CS es la PKI de Microsoft: emite certificados que sirven para autenticar en el dominio (un certificado válido se puede canjear por un TGT vía PKINIT). El problema es que la autorización de quién puede pedir qué certificado y con qué identidad se configura en plantillas (templates) y permisos que, por defecto o por descuido, suelen ser laxos. La investigación “Certified Pre-Owned” (SpecterOps) catalogó una familia de escaladas —ESC1 a ESC16+— que convierten un usuario normal en Domain Admin. Hoy es uno de los caminos a DA más fiables y, a menudo, silenciosos.

flowchart LR
    A["Usuario de dominio"] -->|"CSR con SAN = Administrador (ESC1)"| CA["AD CS"]
    CA -->|"emite el certificado"| A
    A -->|"autentica con el cert (PKINIT)"| DC[Domain Controller]
    DC -->|"TGT como Administrador"| A

Un certificado es una credencial de autenticación de larga duración y difícil de revocar. Si un atacante consigue que la CA le emita un certificado en el que figura como otro usuario (p. ej. Administrator), puede autenticarse como ese usuario con PKINIT y obtener su TGT. Peor: los certificados sobreviven a cambios de contraseña, así que son también persistencia. La raíz es casi siempre una plantilla mal configurada o permisos de inscripción/gestión demasiado abiertos.

# Certipy (Linux) — el estándar
certipy find -u user@dominio -p pass -dc-ip <DC> -vulnerable -stdout
# Certify (Windows)
Certify.exe find /vulnerable

Busca CAs, plantillas, quién puede inscribirse (Enrollment Rights) y las condiciones que disparan cada ESC.

  • ESC1 — plantilla que permite ENROLLEE_SUPPLIES_SUBJECT (el solicitante elige el SAN), con EKU de autenticación de cliente y permiso de inscripción para usuarios bajos → pides un cert “como Administrator”.
certipy req -u user@dominio -p pass -ca CA -template VulnTemplate -upn administrator@dominio
certipy auth -pfx administrator.pfx -dc-ip <DC> # PKINIT -> TGT de Administrator
  • ESC2 — plantilla con EKU Any Purpose o sin EKU → el cert vale para autenticar como cualquiera.
  • ESC3 — abuso del Certificate Request Agent (enrollment agent) para pedir en nombre de otros.
  • ESC4 — tienes permisos de escritura sobre la plantilla → la reconfiguras para hacerla vulnerable (ESC1) y luego la explotas.
  • ESC6 — flag EDITF_ATTRIBUTESUBJECTALTNAME2 en la CA → puedes añadir un SAN arbitrario a cualquier solicitud.
  • ESC7 — permisos de gestión de la CA (ManageCA/ManageCertificates) → apruebas solicitudes o habilitas ESC6.
  • ESC8 — Web Enrollment (HTTP) sin EPA → NTLM relay de una cuenta (incluido un DC coaccionado) a certsrv → certificado de esa cuenta → su TGT (ver NTLM Relay). Cadena clásica: PetitPotam(DC) → relay ESC8 → cert de DC → DCSync.
  • ESC9/ESC10 — mapeos débiles de certificado a cuenta (szOID/altSecurityIdentities, StrongCertificateBindingEnforcement) → impersonación.
  • ESC11 — relay a la interfaz RPC (ICPR) de la CA.
  • ESC13 — plantilla ligada a un grupo con derechos (OID group link).
  • Robar la clave privada de la CA (certipy ca -backup / THEFT) → forjar certificados para cualquiera (Golden Certificate) → persistencia que sobrevive a resets de contraseña.
  • Guardar un PFX de una cuenta privilegiada: válido hasta que caduque/revoque el certificado.
  • Certipy (Linux) — enumeración, explotación de todos los ESC, PKINIT, forja.
  • Certify + Rubeus (Windows) — find, request, y PKINIT→TGT.
  • ntlmrelayx —adcs — ESC8/relay a Web Enrollment.
  • PKINITtools — pedir TGT con certificado.

De usuario sin privilegios a Domain Admin vía un certificado de cuenta privilegiada, y persistencia de dominio robando la clave de la CA. ESC8 + coerción de DC es compromiso total; ESC1 es, a menudo, escalada directa en un solo paso.

  • Solicitudes de certificado con SAN/UPN de otra cuenta (especialmente privilegiada): eventos de AD CS 4886/4887 (request/issue) con SAN inusual.
  • Autenticaciones PKINIT (4768 con certificado) para cuentas que no suelen usar certificados.
  • Relay a certsrv (ESC8): peticiones HTTP de inscripción desde una cuenta de máquina/DC; coerción previa.
  • Cambios en plantillas (escritura) y en la configuración de la CA.

Habilita la auditoría de AD CS (eventos 4886/4887/4899/4900), correlaciona SAN↔solicitante, y monitoriza cambios de plantilla/flags de CA. Certipy/PingCastle para auditar tú mismo.

  • Revisa y corrige plantillas: quita ENROLLEE_SUPPLIES_SUBJECT salvo donde sea imprescindible; restringe EKUs y permisos de inscripción; exige aprobación del manager (CA manager approval).
  • Quita el flag EDITF_ATTRIBUTESUBJECTALTNAME2 (ESC6).
  • EPA + HTTPS en Web Enrollment o deshabilítalo (ESC8); fuerza firma/channel binding.
  • Activa StrongCertificateBindingEnforcement (mitiga ESC9/ESC10).
  • Restringe quién gestiona la CA (ESC7); protege la clave privada de la CA (HSM).

Revoca los certificados maliciosos (y recuerda: un cert emitido sigue valiendo hasta revocar/caducar → puede requerir rotar más). Si la clave de la CA se robó, reconstruye la PKI. Corrige la plantilla/flag concreto y, si hubo DCSync, rota krbtgt ×2.

  • “Certified Pre-Owned” (Will Schroeder & Lee Christensen, SpecterOps, 2021) — la investigación que definió los ESC.
  • ESC8 + PetitPotam (CVE-2021-36942) — cadena pública de dominio completo, parcheada/mitigada por Microsoft.
  • CVE-2022-26923 (Certifried) — escalada a DA creando una cuenta de máquina y pidiendo un cert con dNSHostName manipulado.
  • Certipy aparece en informes de red team y en intrusiones reales como atajo a DA cuando AD CS está mal configurado.
  • certipy find -vulnerable — ¿qué ESC están presentes?
  • ESC1: plantilla con SAN suministrado + client auth + enroll para low-priv
  • ESC2/ESC3: Any Purpose / enrollment agent
  • ESC4: escritura sobre plantilla (reconfigurar a vulnerable)
  • ESC6: EDITF_ATTRIBUTESUBJECTALTNAME2 activo
  • ESC7: permisos ManageCA/ManageCertificates
  • ESC8: Web Enrollment HTTP sin EPA → relay (coerce DC)
  • Robo de clave de CA → Golden Certificate (persistencia)