La reconnaissance automatisée permet de cartographier la surface d’attaque d’une cible de manière systématique et reproductible. C’est la première étape de tout pentest ou programme de bug bounty.
Phase 1 — Découverte de sous-domaines§
Sources passives (sans envoyer de trafic à la cible)§
# subfinder — agrège de multiples sources (Shodan, VirusTotal, CertSpotter, etc.)
subfinder -d example.com -silent -o subdomains_passive.txt
# amass (mode passif)
amass enum -passive -d example.com -o subdomains_amass.txt
# Certificate Transparency Logs
curl -s "https://crt.sh/?q=%.example.com&output=json" |
jq -r '.[].name_value' | sed 's/\*\.//g' | sort -u >> subdomains_passive.txt
# theHarvester (emails, sous-domaines, IPs)
theHarvester -d example.com -b all -f results.html
# Sources manuelles à vérifier
# https://dnsdumpster.com
# https://securitytrails.com
# https://shodan.io
# https://censys.io
Sources actives (brute-force DNS)§
# puredns — brute-force DNS ultra-rapide avec résolution valide
puredns bruteforce /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt \
example.com -r resolvers.txt -w subdomains_active.txt
# dnsx — résoudre et filtrer une liste de sous-domaines
cat subdomains_passive.txt | dnsx -silent -a -resp -o resolved.txt
# gobuster DNS
gobuster dns -d example.com \
-w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt \
-t 50 --append-domain
# Consolidation et dédoublonnage
cat subdomains_passive.txt subdomains_active.txt | sort -u > all_subdomains.txt
Phase 2 — Découverte des hôtes actifs et des services§
# httpx — vérifier quels sous-domaines ont un service HTTP/S
cat all_subdomains.txt | httpx -silent -o live_hosts.txt
# Avec informations supplémentaires
cat all_subdomains.txt | httpx \
-title -status-code -tech-detect -web-server \
-o live_hosts_details.txt
# Nmap — scan de ports sur les IPs découvertes
cat live_hosts.txt | while read host; do
ip=$(dig +short "$host" | tail -1)
echo "$ip $host"
done | sort -u > ip_to_host.txt
# Scan rapide (top 1000 ports)
nmap -iL ips.txt --top-ports 1000 -T4 -oG nmap_quick.gnmap
# Scan complet sur des cibles sélectionnées
nmap -p- -sV -sC -T4 -oA nmap_full target.example.com
Phase 3 — Cartographie des endpoints§
# katana — crawler web moderne (ProjectDiscovery)
katana -list live_hosts.txt -o endpoints.txt -d 3
# gospider — crawler
gospider -S live_hosts.txt -o crawl_output/ -c 10 -d 2
# waybackurls / gau — URLs historiques (Wayback Machine + CommonCrawl)
cat live_hosts.txt | waybackurls | tee wayback_urls.txt
cat live_hosts.txt | gau --subs >> wayback_urls.txt
# Extraire des paramètres des URLs historiques
cat wayback_urls.txt | uro | grep "?" > parameterized_urls.txt
# Trouver des fichiers sensibles dans les URLs historiques
cat wayback_urls.txt | grep -E "\.(sql|bak|zip|tar|gz|env|log|conf|backup|txt)" > sensitive_files.txt
Phase 4 — Découverte de contenu§
# ffuf — répertoires et fichiers
cat live_hosts.txt | while read host; do
ffuf -u "${host}/FUZZ" \
-w /usr/share/seclists/Discovery/Web-Content/raft-large-directories.txt \
-o "fuzzing/${host//\//_}.json" -of json \
-mc 200,301,302,403 -t 40 -silent
done
# Extensions sensibles sur tous les hosts
ffuf -u "https://TARGET/FUZZ" \
-w /usr/share/seclists/Discovery/Web-Content/common.txt \
-e .php,.bak,.sql,.zip,.env,.log,.config \
-mc 200,301 -t 40
# Découverte de paramètres avec Arjun
arjun -u https://target.com/api/endpoint -oJ params.json
Phase 5 — Fingerprinting des technologies§
# whatweb — technologies web
cat live_hosts.txt | whatweb --no-errors -a3 --log-json=tech.json
# wappalyzer CLI
wappalyzer https://target.com
# webanalyze (open source)
webanalyze -host https://target.com -apps apps.json
# Shodan — recherche sur les IPs
shodan host 93.184.216.34
shodan search "org:example.com" --fields ip_str,port,hostnames
# Extraction des technos depuis les headers HTTP
cat live_hosts.txt | httpx -tech-detect -o tech_stack.txt
Phase 6 — Recherche de vulnérabilités§
# Nuclei — scan de vulnérabilités automatisé
cat live_hosts.txt | nuclei -tags cve,exposure,misconfig -severity high,critical \
-o nuclei_results.txt -stats
# nuclei sur les endpoints découverts
cat parameterized_urls.txt | nuclei -tags sqli,xss,ssrf -o param_vulns.txt
# Vérification de subdomain takeover
cat all_subdomains.txt | subjack -w - -t 100 -o takeover.txt
nuclei -list all_subdomains.txt -tags takeover
# Port scan pour services exposés
nmap -iL ips.txt -p 21,22,23,25,80,110,143,443,445,3306,3389,5900,6379,8080,8443,27017 \
--open -oG open_ports.txt
Automatisation avec des frameworks§
ReconFTW§
# Framework de recon tout-en-un
git clone https://github.com/six2dez/reconftw
cd reconftw && ./install.sh
# Scan complet
./reconftw.sh -d example.com -r # --recon (toutes les étapes)
./reconftw.sh -d example.com -s # --subdomains seulement
./reconftw.sh -l scope.txt -r # Liste de cibles
Pipeline bash personnalisé§
#!/bin/bash
# Pipeline de recon minimaliste
TARGET=$1
OUTPUT="recon_${TARGET}"
mkdir -p "$OUTPUT"
echo "[+] Sous-domaines passifs..."
subfinder -d "$TARGET" -silent -o "$OUTPUT/subs_passive.txt"
curl -s "https://crt.sh/?q=%.${TARGET}&output=json" |
jq -r '.[].name_value' | sed 's/\*\.//g' | sort -u >> "$OUTPUT/subs_passive.txt"
echo "[+] Résolution DNS..."
cat "$OUTPUT/subs_passive.txt" | dnsx -silent -o "$OUTPUT/subs_resolved.txt"
echo "[+] Hôtes HTTP actifs..."
cat "$OUTPUT/subs_resolved.txt" | httpx -silent -o "$OUTPUT/live_hosts.txt"
echo "[+] Crawling..."
katana -list "$OUTPUT/live_hosts.txt" -o "$OUTPUT/endpoints.txt" -silent
echo "[+] Nuclei scan..."
cat "$OUTPUT/live_hosts.txt" | nuclei \
-tags exposure,misconfig -severity medium,high,critical \
-o "$OUTPUT/nuclei_results.txt" -silent
echo "[+] Résultats dans $OUTPUT/"
wc -l "$OUTPUT/"*.txt
Outils par catégorie§
| Catégorie | Outil | Description |
|---|---|---|
| Sous-domaines passifs | subfinder, amass, theHarvester | Agrégation de sources |
| Sous-domaines actifs | puredns, gobuster dns | Brute-force DNS |
| Résolution DNS | dnsx, massdns | Résolution en masse |
| HTTP probing | httpx | Vérifier les hôtes actifs |
| Crawling | katana, gospider, hakrawler | Découvrir des endpoints |
| URLs historiques | gau, waybackurls | Wayback Machine |
| Directory fuzzing | ffuf, gobuster dir | Fichiers et répertoires |
| Paramètres | Arjun, Param Miner | Découverte de paramètres |
| Fingerprinting | whatweb, webanalyze | Technologies |
| Scanning vulnérabilités | nuclei, nikto | Vulnérabilités connues |
| Takeover | subjack, nuclei | Subdomain takeover |
| Ports | nmap, masscan | Scan de ports |
Gestion de la portée (Scope)§
# Filtrer les URLs hors-scope
cat all_urls.txt | grep "example.com" | grep -v "out-of-scope.example.com" > in_scope.txt
# Vérifier si une IP appartient à la cible
curl "https://api.bgpview.io/ip/93.184.216.34" | jq '.data.asn'
whois 93.184.216.34 | grep -i "orgname\|org-name"
# Générer une liste de CIDRs depuis ASN
curl "https://api.bgpview.io/asn/15169/prefixes" | jq '.data.ipv4_prefixes[].prefix'
Rate limiting et respect éthique§
# Toujours respecter les limites de taux
# ffuf : -p 0.1 (délai entre requêtes)
# nuclei : -rl 50 (50 req/s maximum)
# nmap : -T2 ou -T3 (plus lent)
# Vérifier le robots.txt avant de crawler
curl https://target.com/robots.txt
# Respecter le programme de bug bounty (scope, exclusions)
# Ne pas tester en dehors du scope défini
# Ne pas tester des services tiers
# Signaler rapidement les vulnérabilités critiques
Commentaires