← Retour aux projets

Projet personnel
Port Scanner — scanner TCP asynchrone et labo de détection
Scanner de ports asyncio sans dépendance, sécurisé par défaut, qui explique le risque de chaque service ouvert — et le versant Blue Team : comment détecter ce même scan avec Wireshark, Suricata et Sigma
Contexte
J'ai reconstruit ce projet de zéro avec un regard de défenseuse. Un scanner de ports se présente d'habitude du côté de l'attaquant ; je voulais l'inverse : un outil sans danger sur un réseau domestique ou d'entreprise, qui explique pourquoi un port ouvert compte et ce qu'il faut faire, puis qui montre comment un SOC détecte le scan qu'il vient d'effectuer (MITRE ATT&CK T1046 — Network Service Discovery).
Ce que j'ai construit
- Un scanner TCP « connect » asynchrone (asyncio, bibliothèque standard uniquement) : états ouvert / fermé / filtré, latence, concurrence et mémoire bornées
- L'analyse des cibles et des ports (IP, CIDR, noms d'hôte ; 22, 20-25, top100, all) avec une validation stricte
- Une cinquantaine de fiches de services : niveau de risque d'« info » à « critique » et recommandation de défense pour chaque port ouvert
- Une lecture de bannières optionnelle et passive, avec échappement de tout caractère non imprimable
- Des sorties texte, JSON et CSV, des codes de retour stables et --fail-on high pour l'intégration continue
- Une interface web locale bilingue (port-scanner-web) qui pilote le même moteur
Choix de sécurité
- Sécurisé par défaut : réseaux privés (RFC 1918, IPv6 ULA) et boucle locale uniquement ; IPv6 mappées, chaque réponse DNS et IP abrégées ambiguës (127.1, 0x7f.1) contrôlées
- Plafonds vérifiés avant tout envoi : 1 024 adresses, 262 144 tentatives, 500 connexions simultanées, délai de 30 s
- Bannières traitées comme des données hostiles : séquences d'échappement de terminal et caractères bidirectionnels invisibles (Trojan Source) neutralisés
- Injection de formules CSV empêchée (OWASP) ; aucun rapport existant écrasé sans --force
- Serveur web local protégé comme un service exposé : boucle locale uniquement, jeton aléatoire de 256 bits dans le fragment d'URL, contrôle Host contre le DNS rebinding, contrôle Origin contre le CSRF, CSP stricte, affichage par textContent uniquement
- Dépôt durci : branche main protégée, détection des secrets avec blocage à l'envoi, Dependabot, Ruff avec règles Bandit, signalement privé de vulnérabilités
Volet détection (Blue Team)
- Captures de laboratoire d'un vrai scan, de trafic normal et d'un client légitime très actif
- Guide Wireshark et tshark pas à pas : les filtres qui révèlent un scan
- Deux règles Suricata (rafale de SYN, rafale de RST) et une corrélation Sigma value_count (ports distincts par source)
- Un job de CI rejoue les captures dans Suricata et vérifie les alertes attendues — y compris l'absence d'alerte sur le trafic normal et un faux positif documenté
Qualité logicielle
250+
Tests automatisés
vrais sockets en boucle locale, réseau simulé sinon
6
Jobs de CI
Windows + Linux, Python 3.11/3.14, Ruff, Suricata + Sigma
0
Dépendances d'exécution
v1.0.0 → v1.1.0
Versions
Fonctionnement
- 1ValiderCibles et ports sont analysés puis confrontés au garde-fou réseaux privés et aux plafonds avant tout envoi.
- 2ScannerUn pool fixe de travailleurs asyncio ouvre puis referme aussitôt une connexion TCP par couple (adresse, port).
- 3ExpliquerChaque port ouvert reçoit son service probable, un niveau de risque et une recommandation ; les bannières sont lues et nettoyées sur demande.
- 4DétecterLe même scan est capturé puis repéré par les règles Suricata et Sigma, vérifiées automatiquement en CI.
Captures d'écran
