certi
Outil d'énumération des services de certificats Active Directory. Interroge ADCS pour les templates de certificats, les permissions d'inscription, et identifie les chemins d'élévation de privilèges potentiels sans générer d'alertes. Active Directory Certificate Services enumeration tool. Queries ADCS for certificate templates, enrollment permissions, and identifies potential privilege escalation paths without generating alerts.
↗ https://github.com/eloypgz/certiOverview
Certi enumerates Active Directory Certificate Services (ADCS) to find certificate templates, CA configurations, and enrollment permissions. It’s a passive enumeration tool — does not request certificates or modify anything, making it useful for low-noise reconnaissance before exploitation with certipy-ad.
Installation
pip3 install certi
# or
git clone https://github.com/eloypgz/certi
cd certi
pip3 install .
Basic Usage
Enumerate all ADCS templates
certi.py list --dc-ip 10.10.10.1 DOMAIN/user:password
List vulnerable templates only
certi.py list --dc-ip 10.10.10.1 DOMAIN/user:password -v
Get details on a specific template
certi.py list --dc-ip 10.10.10.1 DOMAIN/user:password --template "VulnTemplate"
Enumeration Commands
List all certificate templates
certi.py list --dc-ip 10.10.10.1 DOMAIN/user:password
Show templates with enrollment permissions
certi.py list --dc-ip 10.10.10.1 DOMAIN/user:password --enroll
Show CA information
certi.py getca --dc-ip 10.10.10.1 DOMAIN/user:password
Show interesting templates (potential ESC paths)
certi.py req --dc-ip 10.10.10.1 DOMAIN/user:password
Comparing with certipy-ad
certi — passive enumeration only (no certificate requests) Good for: initial recon, low-noise assessment
certi.py list --dc-ip 10.10.10.1 DOMAIN/user:password -v
certipy-ad — enumeration + exploitation Good for: full assessment + attack
certipy find -u user@domain.local -p password -dc-ip 10.10.10.1 -vulnerable
What Certi Finds
# Template information:
# - Template name
# - Enrollment permissions (who can request)
# - Certificate purpose (EKU)
# - SAN (Subject Alternative Name) settings
# - Manager approval required?
# - Authorized signature count
# ESC1 indicators:
# - Any user can enroll
# - Client Authentication EKU
# - Enrollee can supply SAN
Tips
- Run certi first for passive enumeration, then certipy for exploitation
- Any template with “Any User” enrollment + SAN flexibility = ESC1 candidate
- Certi’s
-vflag highlights potentially vulnerable templates - Cross-reference with BloodHound’s ADCS edges for attack path visualization
- Document all template findings for the security report
Help / Man page
certi.py [command] [options] target
target: DOMAIN/username:password
Commands:
list List certificate templates
getca Get CA information
req Request certificate info
Options:
--dc-ip IP Domain controller IP
--template T Specific template name
-v Verbose (highlight interesting)
--enroll Show enrollment permissions
Vue d’ensemble
Certi énumère les services de certificats Active Directory (ADCS) pour trouver les templates de certificats, les configurations de CA et les permissions d’inscription. C’est un outil d’énumération passive : il ne demande aucun certificat et ne modifie rien, ce qui le rend utile pour une reconnaissance à faible bruit avant exploitation avec certipy-ad.
Installation
pip3 install certi
# ou
git clone https://github.com/eloypgz/certi
cd certi
pip3 install .
Utilisation de base
# Énumérer tous les templates ADCS
certi.py list --dc-ip 10.10.10.1 DOMAIN/user:password
# Lister uniquement les templates vulnérables
certi.py list --dc-ip 10.10.10.1 DOMAIN/user:password -v
# Récupérer les détails d'un template précis
certi.py list --dc-ip 10.10.10.1 DOMAIN/user:password --template "VulnTemplate"
Commandes d’énumération
# Lister tous les templates de certificats
certi.py list --dc-ip 10.10.10.1 DOMAIN/user:password
# Afficher les templates avec permissions d'inscription
certi.py list --dc-ip 10.10.10.1 DOMAIN/user:password --enroll
# Afficher les informations de la CA
certi.py getca --dc-ip 10.10.10.1 DOMAIN/user:password
# Afficher les templates intéressants (chemins ESC potentiels)
certi.py req --dc-ip 10.10.10.1 DOMAIN/user:password
Comparaison avec certipy-ad
certi : énumération passive uniquement (aucune demande de certificat). Bon pour : recon initiale, évaluation à faible bruit.
certi.py list --dc-ip 10.10.10.1 DOMAIN/user:password -v
certipy-ad : énumération + exploitation. Bon pour : évaluation complète + attaque.
certipy find -u user@domain.local -p password -dc-ip 10.10.10.1 -vulnerable
Ce que trouve Certi
# Informations sur le template :
# - Nom du template
# - Permissions d'inscription (qui peut demander)
# - Usage du certificat (EKU)
# - Réglages du SAN (Subject Alternative Name)
# - Approbation d'un manager requise ?
# - Nombre de signatures autorisées
# Indicateurs ESC1 :
# - N'importe quel utilisateur peut s'inscrire
# - EKU Client Authentication
# - L'inscrit peut fournir le SAN
Conseils
- Lancez d’abord certi pour l’énumération passive, puis certipy pour l’exploitation
- Tout template avec inscription “Any User” + flexibilité du SAN = candidat ESC1
- Le flag
-vde Certi met en évidence les templates potentiellement vulnérables - Recoupez avec les edges ADCS de BloodHound pour visualiser le chemin d’attaque
- Documentez toutes les découvertes de templates pour le rapport de sécurité
Aide / Page de manuel
certi.py [command] [options] target
target: DOMAIN/username:password
Commands:
list List certificate templates
getca Get CA information
req Request certificate info
Options:
--dc-ip IP Domain controller IP
--template T Specific template name
-v Verbose (highlight interesting)
--enroll Show enrollment permissions