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/certi

Overview

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 -v flag 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 -v de 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