ParcoursOuvrir l'appli

Reconnaissance et outils du pentester

Sécurité et hacking éthique · 45 min

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