⬅ Retour
Scaneur port en python
Publié le 2026-06-25 19:25:55
Scanner Port
25 juin 2026
17:05
📝 Notes de cours : Scanner de ports & Réseau avec Python
1. Le Scanner Minimaliste (Synchrone)
La méthode la plus simple utilise le module natif socket. On utilise connect_ex car il renvoie un code d'erreur (0 si le port est ouvert) au lieu de faire planter le script.
• Points clés : Pratique, léger, aucun module à installer.
• Limite : Lent sur les grandes plages de ports car il teste les ports un par un.
Python
import socket
target = "127.0.0.1"
ports = [21, 22, 80, 443]
for port in ports:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(0.5)
result = s.connect_ex((target, port)) # 0 = Ouvert
if result == 0:
print(f"[OUVERT] Port {port}")
s.close()
2. Le Scanner Ultra-Rapide (Asynchrone)
Pour scanner à grande vitesse, on utilise asyncio. Cela permet de lancer des centaines de vérifications en parallèle au lieu d'attendre chaque réponse.
⚠️ Pièges évités (Bonnes pratiques) :
1. Gestion des ressources : Utiliser _, writer = ... pour ignorer le flux de lecture non utilisé (convention de l'underscore _), et toujours fermer le writer pour éviter les fuites de connexion.
2. Le Sémaphore : Limite le nombre de connexions simultanées (ex: 100) pour éviter l'erreur système Too many open files et réduire le risque de se faire bloquer par les pare-feux.
3. L'opérateur de dépaquetage (*) : Placé devant le générateur dans asyncio.gather(*), il ouvre le "carton" et distribue toutes les tâches comme arguments séparés à la fonction.
Python
import asyncio
semaphore = asyncio.Semaphore(100) # Max 100 scans en même temps
async def check_port(target, port):
async with semaphore:
try:
_, writer = await asyncio.wait_for(
asyncio.open_connection(target, port), timeout=2.0
)
print(f"[OUVERT] Port {port}")
writer.close()
await writer.wait_closed()
except Exception:
pass
async def main():
target = "scanme.nmap.org"
ports = range(1, 1025)
await asyncio.gather(*(check_port(target, p) for p in ports))
asyncio.run(main())
3. Pourquoi un scanner Python voit moins de ports que Nmap ?
• Comportement agressif : Le scan asynchrone bombarde le serveur d'un coup. Les pare-feux (ou CDN comme Cloudflare) détectent cela comme une attaque et bloquent l'IP instantanément après le premier port trouvé (souvent le port 22).
• Scan complet vs Furtif : Python réalise une connexion TCP complète (3-Way Handshake). Nmap utilise par défaut un SYN Scan (scan à moitié ouvert) : il demande la connexion, voit si le port répond, puis coupe immédiatement le fil (RST) avant que le serveur n'enregistre le scan.
4. Le "Banner Grabbing" (Identification)
Se connecter à un port ouvert (comme le port 22) pour lire les premiers octets envoyés par le serveur. Cela permet de récupérer sa "bannière" pour connaître sa version exacte (ex: la version d'OpenSSH).
Python
import socket
s = socket.socket()
s.settimeout(2)
s.connect(("mon-site.com", 22))
print(s.recv(1024).decode().strip()) # Affiche la carte d'identité du service
s.close()
Commentaires anonymes
Aucun commentaire pour le moment.