Reconnaissance et outils du pentester
Les cinq phases d'un pentest
Un vrai test d'intrusion suit toujours les mêmes étapes, dans l'ordre.
| Phase | Ce qu'on y fait |
|---|---|
| 1. Reconnaissance | récolter des informations sur la cible (sans la toucher) : noms de domaine, adresses, technologies, employés |
| 2. Scan | sonder la cible : quels ports sont ouverts, quels services tournent, quelles versions |
| 3. Exploitation | utiliser une faille trouvée pour entrer |
| 4. Post-exploitation | une fois dedans, voir jusqu'où on peut aller (élévation de privilèges, mouvement latéral) |
| 5. Rapport | tout documenter et expliquer comment corriger. C'est la partie la plus importante, celle pour laquelle le client paie. |
Les ports et les services
Quand deux ordinateurs communiquent (module réseau), chaque service écoute sur un port numéroté. Scanner les ports ouverts d'une machine, c'est dresser la liste des portes par lesquelles on pourrait entrer.
Quelques ports à connaître, et leur niveau de risque :
| Port | Service | Remarque |
|---|---|---|
| 21 | FTP | transfert de fichiers, souvent non chiffré : à surveiller |
| 22 | SSH | accès distant chiffré : correct, mais cible des attaques de mots de passe |
| 23 | Telnet | accès distant en clair : à bannir absolument, tout passe lisible |
| 80 | HTTP | web non chiffré |
| 443 | HTTPS | web chiffré : le bon |
| 3306 | MySQL | base de données : ne devrait jamais être exposée à Internet |
| 3389 | RDP | bureau à distance Windows : très ciblé par les rançongiciels |
Exercice : Analyser un scan de ports
Tu as lancé nmap sur ta propre machine de test et obtenu une liste de ports ouverts avec leur service. Écris analyser(ports) qui renvoie la liste des services à risque présents, parmi un ensemble de services dangereux : telnet, ftp, mysql et rdp (ceux qui ne devraient pas être exposés). Renvoie-les triés par ordre alphabétique.
Voir une solution
ports = {
22: "ssh",
23: "telnet",
80: "http",
443: "https",
3306: "mysql",
}
dangereux = {"telnet", "ftp", "mysql", "rdp"}
def analyser(ports):
"""Renvoie la liste triée des services à risque présents dans le scan."""
return sorted(s for s in ports.values() if s in dangereux)
print(analyser(ports))Dans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice
Exercice : Un mini-rapport automatique
Complète rapport(ports, versions) qui produit les lignes d'un rapport de scan. Pour chaque port ouvert, trié par numéro :
- si le service est dans
dangereux, la ligne est"[RISQUE] port <n> : <service> <version> - à fermer ou sécuriser"; - sinon,
"[OK] port <n> : <service> <version>".
versions donne la version de chaque port. La fonction renvoie la liste des lignes.
Voir une solution
dangereux = {"telnet", "ftp", "mysql", "rdp"}
def rapport(ports, versions):
"""Renvoie les lignes d'un rapport de scan, triées par numéro de port."""
lignes = []
for n in sorted(ports):
service = ports[n]
version = versions[n]
if service in dangereux:
lignes.append(f"[RISQUE] port {n} : {service} {version} - à fermer ou sécuriser")
else:
lignes.append(f"[OK] port {n} : {service} {version}")
return lignes
ports = {443: "https", 23: "telnet", 22: "ssh"}
versions = {443: "nginx 1.24", 23: "telnetd", 22: "OpenSSH 9.6"}
for ligne in rapport(ports, versions):
print(ligne)Dans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice