certgraph

Crawler de logs de certificate transparency et constructeur de graphe de domaines. Cartographie les relations entre certificats pour découvrir sous-domaines, domaines liés et connexions d'infrastructure. Certificate transparency log crawler and domain graph builder. Maps certificate relationships to discover subdomains, related domains, and infrastructure connections.

↗ https://github.com/lanrat/certgraph

Overview

certgraph crawls certificate transparency logs to build a graph of domain relationships. Given a starting domain, it finds all certificates issued for it and related domains, then recursively discovers connected infrastructure — revealing subdomains, hosting relationships, and organizational connections that aren’t visible through DNS alone.

Installation

go install github.com/lanrat/certgraph@latest

Basic Usage

Build certificate graph for a domain

certgraph example.com

Recursive discovery (follow related domains)

certgraph -depth 2 example.com

Save as JSON

certgraph -json example.com > graph.json

Save as DOT (for Graphviz visualization)

certgraph -dot example.com > graph.dot

Output domain list only

certgraph -list example.com

Discovery Options

Include expired certificates

certgraph -expired example.com

Depth of recursive crawling

certgraph -depth 3 example.com

Use specific CT log API

certgraph -ct https://crt.sh example.com

Parallel queries

certgraph -parallel 5 example.com

Timeout per request

certgraph -timeout 30 example.com

Visualizing the Graph

Generate DOT file

certgraph -dot example.com > graph.dot
# Render with Graphviz
dot -Tpng graph.dot -o graph.png
dot -Tsvg graph.dot -o graph.svg

Or use the web viewer Run the built-in web server:

certgraph -web example.com

→ Open http://localhost:8080 to explore the interactive graph

What certgraph Reveals

For target.com, certgraph might find:
  - api.target.com, dev.target.com (subdomains)
  - target.io, target.net (related domains)
  - cdn-target.example.net (CDN infrastructure)
  - Internal certificates with internal hostnames
  - Wildcard certs: *.target.com
  - Certificates with SAN entries listing multiple domains
  - Hosting provider certificates (shared hosting)

Querying crt.sh Directly

# crt.sh is the main CT log aggregator
# Direct API (no tool needed)
curl -s "https://crt.sh/?q=%.example.com&output=json" | \
  python3 -c "
import json,sys
data = json.load(sys.stdin)
names = set()
for cert in data:
    names.add(cert['name_value'])
for n in sorted(names):
    print(n)
"

Clean up wildcards

curl -s "https://crt.sh/?q=%.example.com&output=json" | \
  python3 -m json.tool | \
  grep "name_value" | \
  sort -u | \
  sed 's/.*"\(.*\)".*/\1/' | \
  grep -v "^\*"

Tips

  • CT logs are public — every certificate issued is logged, including internal/staging ones
  • Wildcard certs (*.example.com) reveal the existence of subdomains even if they’re not in DNS
  • Old/expired certificates reveal past infrastructure that may still have live hosts
  • SANs (Subject Alternative Names) often list multiple domains — great for expanding scope
Help / Man page
certgraph [options] <domain>

-depth N      Recursion depth (default: 5)
-parallel N   Parallel requests (default: 10)
-timeout N    Timeout in seconds (default: 10)
-expired      Include expired certificates
-json         JSON output
-dot          DOT format output (Graphviz)
-list         Output domain list only
-web          Start web viewer
-ct URL       Certificate Transparency log URL
-save         Save results to file
-v            Verbose

Vue d’ensemble

certgraph parcourt les logs de certificate transparency pour construire un graphe des relations entre domaines. À partir d’un domaine de départ, il trouve tous les certificats émis pour lui et les domaines liés, puis découvre récursivement l’infrastructure connectée, révélant sous-domaines, relations d’hébergement et connexions organisationnelles qui ne sont pas visibles par le seul DNS.

Installation

go install github.com/lanrat/certgraph@latest

Utilisation de base

# Construire le graphe de certificats d'un domaine
certgraph example.com

# Découverte récursive (suivre les domaines liés)
certgraph -depth 2 example.com

# Sauvegarder en JSON
certgraph -json example.com > graph.json

# Sauvegarder en DOT (pour visualisation Graphviz)
certgraph -dot example.com > graph.dot

# Sortie de la liste de domaines uniquement
certgraph -list example.com

Options de découverte

# Inclure les certificats expirés
certgraph -expired example.com

# Profondeur du crawling récursif
certgraph -depth 3 example.com

# Utiliser une API de log CT spécifique
certgraph -ct https://crt.sh example.com

# Requêtes parallèles
certgraph -parallel 5 example.com

# Timeout par requête
certgraph -timeout 30 example.com

Visualiser le graphe

# Générer le fichier DOT
certgraph -dot example.com > graph.dot

# Rendre avec Graphviz
dot -Tpng graph.dot -o graph.png
dot -Tsvg graph.dot -o graph.svg
# Ou utiliser le visualiseur web : lancer le serveur web intégré
certgraph -web example.com
# → Ouvrir http://localhost:8080 pour explorer le graphe interactif

Ce que certgraph révèle

Pour target.com, certgraph peut trouver :
  - api.target.com, dev.target.com (sous-domaines)
  - target.io, target.net (domaines liés)
  - cdn-target.example.net (infrastructure CDN)
  - Des certificats internes avec des noms d'hôtes internes
  - Des certs wildcard : *.target.com
  - Des certificats dont les entrées SAN listent plusieurs domaines
  - Des certificats de fournisseur d'hébergement (hébergement mutualisé)

Interroger crt.sh directement

# crt.sh est le principal agrégateur de logs CT
# API directe (aucun outil nécessaire)
curl -s "https://crt.sh/?q=%.example.com&output=json" | \
  python3 -c "
import json,sys
data = json.load(sys.stdin)
names = set()
for cert in data:
    names.add(cert['name_value'])
for n in sorted(names):
    print(n)
"
# Nettoyer les wildcards
curl -s "https://crt.sh/?q=%.example.com&output=json" | \
  python3 -m json.tool | \
  grep "name_value" | \
  sort -u | \
  sed 's/.*"\(.*\)".*/\1/' | \
  grep -v "^\*"

Conseils

  • Les logs CT sont publics : chaque certificat émis y est journalisé, y compris ceux internes/de staging
  • Les certs wildcard (*.example.com) révèlent l’existence de sous-domaines même s’ils ne sont pas dans le DNS
  • Les certificats anciens/expirés révèlent une infrastructure passée dont certains hôtes peuvent être encore actifs
  • Les SAN (Subject Alternative Names) listent souvent plusieurs domaines : parfait pour élargir le périmètre
Aide / Page de manuel
certgraph [options] <domain>

-depth N      Recursion depth (default: 5)
-parallel N   Parallel requests (default: 10)
-timeout N    Timeout in seconds (default: 10)
-expired      Include expired certificates
-json         JSON output
-dot          DOT format output (Graphviz)
-list         Output domain list only
-web          Start web viewer
-ct URL       Certificate Transparency log URL
-save         Save results to file
-v            Verbose