Python - Hacking (éthique) : librairie n-map
Python & Nmap 🕵️♀️ — découverte du scan réseau (éthique)
Dans ce mini-cours, on découvre comment utiliser la librairie
python-nmap pour dialoguer avec l’outil Nmap en Python :
scanner des ports, comprendre les résultats, automatiser des audits
sur son propre réseau ou un réseau de test.
Public : ~15 → 18 ans (avec encadrement)
Support de TP pour cours de cybersécurité / réseaux
On ne scanne jamais un réseau ou une machine sans autorisation explicite. Tout ce qui suit est à utiliser :
- sur ta propre machine (localhost),
- sur un petit réseau de labo / classe,
- ou dans un environnement prévu pour l’entraînement.
1) Nmap & python-nmap : de quoi parle-t-on ?
Nmap (Network Mapper) est un outil très connu d’analyse de réseau :
- il teste quels ports sont ouverts sur une machine ;
- il peut deviner quels services tournent (web, ssh, etc.) ;
- il aide les admins & pentesters à vérifier la sécurité.
python-nmap est une librairie Python qui permet :
- de lancer Nmap depuis un script Python ;
- de récupérer les résultats dans des variables Python ;
- de construire des petits outils “maison” d’audit.
2) Installation (en environnement de labo)
a) Installer Nmap
python-nmap ne remplace pas Nmap : il a besoin que l’outil nmap soit installé sur la machine.
# Exemple sous Linux (Debian / Ubuntu)
sudo apt update
sudo apt install nmap
# Exemple sous macOS (avec Homebrew)
brew install nmap
Sous Windows, on peut télécharger Nmap depuis le site officiel puis l’ajouter au PATH (voir documentation Nmap).
b) Installer la librairie Python
# Dans ton environnement Python
pip install python-nmap
Ensuite, dans ton code, tu pourras simplement faire :
import nmap.
3) Premier scan : scanner sa propre machine (localhost)
Exemple de script qui scanne ta machine (127.0.0.1)
sur quelques ports courants, uniquement pour découvrir :
import nmap
# Créer un objet "scanner"
scanner = nmap.PortScanner()
# Cible : ta propre machine (localhost)
target = "127.0.0.1" # à garder ainsi pour les premiers tests
ports = "20-1024" # plage de ports à tester
print(f"Scan de {target} sur les ports {ports}...")
# Lancer le scan
scanner.scan(target, ports)
# Vérifier l'état de la machine (up / down)
state = scanner[target].state()
print("État de l'hôte :", state)
# Parcourir les ports détectés
for proto in scanner[target].all_protocols():
print("\nProtocole :", proto)
ports_list = scanner[target][proto].keys()
for p in sorted(ports_list):
info = scanner[target][proto][p]
print(f" Port {p} : {info['state']} (service : {info.get('name','inconnu')})")
Ce script n’attaque rien, il observe simplement quels ports répondent sur ta machine.
4) Scanner un petit réseau de test
On peut aussi scanner une petite plage d’adresses dans un réseau de labo (par exemple un réseau de machines virtuelles).
Exemples de plages :
192.168.0.10-20: IP de 10 à 20192.168.1.0/30: petites sous-réseaux (notation CIDR)
import nmap
scanner = nmap.PortScanner()
# Exemple : petite plage de test (à adapter à ton réseau de labo)
target_range = "192.168.0.10-12" # uniquement si tu as le droit d'y accéder
ports = "22,80,443"
print(f"Scan de {target_range} sur les ports {ports}...")
scanner.scan(hosts=target_range, arguments=f"-p {ports}")
for host in scanner.all_hosts():
print("\nHôte :", host)
print(" État :", scanner[host].state())
for proto in scanner[host].all_protocols():
print(" Protocole :", proto)
ports_list = scanner[host][proto].keys()
for p in sorted(ports_list):
info = scanner[host][proto][p]
print(f" Port {p} : {info['state']} (service : {info.get('name','?')})")
5) Exploiter les résultats dans des scripts Python
L’avantage de python-nmap : on peut utiliser les résultats pour construire des outils d’audit automatisés.
- Crée un rapport texte des machines qui ont un port web ouvert.
- Génère un fichier CSV avec “IP;port;service;état”.
- Lance une alerte si un nouveau service apparaît sur le réseau.
Exemple minimal qui “filtre” les ports ouverts :
import nmap
scanner = nmap.PortScanner()
scanner.scan("127.0.0.1", "1-1024")
open_ports = []
for proto in scanner["127.0.0.1"].all_protocols():
for p, info in scanner["127.0.0.1"][proto].items():
if info["state"] == "open":
open_ports.append((p, info.get("name", "?")))
print("Ports ouverts sur 127.0.0.1 :")
for port, name in open_ports:
print(f" {port} ({name})")
QCM Python-nmap & éthique
Coche une réponse par question, puis clique sur “Vérifier mes réponses”.
Commentaires
Enregistrer un commentaire