Aller au contenu
← Retour aux projets
Command-line scan with risk levels and recommendations
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

  1. 1
    Valider
    Cibles et ports sont analysés puis confrontés au garde-fou réseaux privés et aux plafonds avant tout envoi.
  2. 2
    Scanner
    Un pool fixe de travailleurs asyncio ouvre puis referme aussitôt une connexion TCP par couple (adresse, port).
  3. 3
    Expliquer
    Chaque port ouvert reçoit son service probable, un niveau de risque et une recommandation ; les bannières sont lues et nettoyées sur demande.
  4. 4
    Détecter
    Le même scan est capturé puis repéré par les règles Suricata et Sigma, vérifiées automatiquement en CI.

Captures d'écran

Local web interface — light theme (French)