External Pentest Playbook (PNPT)
Un pentest externe simule un attaquant n’ayant que ce que l’organisation expose sur Internet : domaines, IPs publiques, et tout ce qui traîne en OSINT. C’est très différent d’un pentest interne (où on est déjà sur le LAN). L’objectif typique : obtenir un premier accès qui permette de pivoter en interne — un compte VPN, un shell sur un serveur web exposé, des creds valides via spraying.
Le funnel d’un pentest externe§
Internet (vu de l'attaquant)
│
▼
┌─────────────────────┐
│ OSINT — découvrir │ Domaines, sous-domaines, employés, breaches
│ ce qui existe │
└──────────┬──────────┘
▼
┌─────────────────────┐
│ Scanning │ Quels services exposés sur chaque IP ?
└──────────┬──────────┘
▼
┌─────────────────────┐
│ Énumération │ Versions exactes, configs, points faibles
└──────────┬──────────┘
▼
┌─────────────────────┐
│ Premier accès │ Web vuln, password spray, VPN, breach reuse
└──────────┬──────────┘
▼
┌─────────────────────┐
│ Foothold interne │ Pivot, et l'engagement continue en interne
└─────────────────────┘
À retenir : 80% du résultat d’un pentest externe se joue dans les 3 premières étapes. Une exploitation web sophistiquée sur un service mal identifié rate sa cible — préparer le terrain est primordial.
Phase 1 — Scoping et OSINT§
Avant tout, lire les règles d’engagement. On ne scanne pas ce qui n’est pas dans le scope. Une fois le périmètre clair :
- Énumération des employés (LinkedIn, site web, équipes RH)
- Format d’emails (Hunter.io, Phonebook.cz)
- Google Dorks pour fichiers exposés
- Shodan/Censys sur les IPs et certificats
- HaveIBeenPwned / DeHashed pour les breaches passées
Voir 04-osint pour le détail.
Pourquoi le format d’email est stratégique : si on confirme [email protected], on transforme une liste LinkedIn de 500 employés en 500 cibles de password spray.
Phase 2 — Scanning§
Sur le scope IP, scan complet d’abord, détaillé ensuite.
# Découverte initiale — tous les ports, plusieurs cibles en parallèle
nmap -Pn -sS -T4 -p- -oN all_ports.txt CIBLE
# -Pn car en externe l'ICMP est souvent filtré → ne pas skip à tort
# Scan ciblé sur les ports trouvés
nmap -sC -sV -p PORTS -oN detailed.txt CIBLE
# Vulns connues
nmap --script=vuln -p PORTS CIBLE
-Pn en externe est obligatoire : sans, nmap considère la cible “down” si ICMP ne répond pas, et ne scanne pas. Ça donne des faux négatifs catastrophiques.
Phase 3 — Énumération des services exposés§
Les vecteurs externes classiques :
Service exposé Vecteur d'attaque typique
────────────────── ──────────────────────────
Web (80/443) Vulns app, OWASP Top 10, .git, panels admin
Email (OWA, O365) Password spray, user enumeration
VPN (SSL, IKE) Brute force, breaches credentials
SSH Brute force ciblé, clés faibles
RDP Brute force, CVE (BlueKeep)
SMB exposé (445) Quasi jamais → si oui, EternalBlue, anonymous
FTP Anonymous, credentials en clair
API (REST, GraphQL) Auth bypass, IDOR, mauvaise validation
Citrix / RDS CVE récentes, breakout du jail
Phase 4 — Premier accès§
Password Spraying§
Bien plus efficace que le brute force individuel : on essaie UN mot de passe (commun) sur TOUS les comptes connus. Pas de lockout (généralement) puisqu’on n’incrémente pas les échecs sur un même compte.
Brute force classique : 1 user × 1000 passwords → lockout
Password spraying : 1000 users × 1 password → pas de lockout
# Sur SMB / AD (depuis internet, rare ; en interne, classique)
crackmapexec smb DC_IP -u users.txt -p 'Password123!' --no-bruteforce
nxc smb DC_IP -u users.txt -p 'Hiver2026!' --no-bruteforce
# Sur OWA / Outlook Web Access
# Outils : MailSniper, atomizer
Invoke-PasswordSprayOWA -ExchHostname mail.cible.com -UserList users.txt -Password "Spring2026!"
# Sur O365
# Outils : MSOLSpray, Spray365
python MSOLSpray.py --userlist users.txt --password 'Cible2026!'
Mots de passe à essayer : Saison+Année+! (Spring2026!, Hiver2026!), NomEntreprise+123, Bienvenue, Welcome123, Password1. La saisonnalité marche statistiquement bien.
Réutilisation de credentials (breach reuse)§
Si HIBP/DeHashed donne un mot de passe d’une vieille fuite pour [email protected], essayer ce même mot de passe sur tous les portails. La réutilisation est la règle, pas l’exception.
Application web vulnérable§
# Scanner systématique
nikto -h https://cible.com
nuclei -u https://cible.com
# Manuel — chercher :
# /.git/config → code source complet
# /admin/ → panneau d'admin (default creds ?)
# /.env, /config.php.bak → secrets
# /api/ versions → endpoints non documentés
Voir 17-web-application-basics et [[Web Security]] pour le détail.
VPN avec credentials faibles§
# IKE — fingerprint et brute force possible
ike-scan IP
# Cisco IKE Aggressive mode → dump PSK, crack
# SSL VPN (Fortinet, Pulse, Cisco AnyConnect) → souvent password spray ou CVE récente
Phase 5 — Post-exploitation§
Une fois le foothold obtenu, on est dans le scénario d’un pentest interne. Voir 08-post-exploitation, 09-active-directory, 10-pivoting.
Pièges courants§
- Scope flou = problème légal : confirmer par écrit chaque sous-domaine et IP. Une cible non scope = poursuites possibles.
-Pnoublié = scan invisible (faux négatif).- WAF agressif : un Cloudflare ou F5 bien configuré bloque vite. Ralentir avec
-T2, utiliser des User-Agents normaux, tester depuis plusieurs IPs. - Password spraying trop rapide = lockout malgré tout : Azure AD a un Smart Lockout. Espacer (un essai par compte toutes les 30 min minimum) pour rester sous le radar.
- Trouver un foothold n’est pas l’objectif : un pentest externe sans démonstration d’impact métier (accès à de la donnée critique) est faible en livrable. Toujours pousser jusqu’à un impact prouvé.
- Ne pas confondre breach reuse et brute force : utiliser un mot de passe trouvé en breach est rapide et passe sous le radar. Le brute force, lui, déclenche les alertes.
- OSINT à refaire en cours d’engagement : un nouveau sous-domaine peut apparaître entre deux jours. Re-scanner crt.sh à intervalle régulier.