Développement d'un scanner de ports TCP en Python
Présentation du projet
En parallèle de ma formation en cybersécurité, j'ai développé un scanner de ports TCP en Python afin d'identifier les ports accessibles sur une machine cible et de recueillir des informations sur les services exposés.
L'objectif était de concevoir un outil en ligne de commande permettant d'effectuer une reconnaissance réseau simple, tout en mettant en pratique plusieurs notions fondamentales : les connexions TCP, la programmation concurrente, l'identification des services et l'exploitation des résultats d'un scan.
Le projet a été testé sur mon Raspberry Pi au sein de mon réseau local.
Fonctionnalités développées
Scan TCP configurable
Le scanner accepte une adresse IP ou un nom d'hôte comme cible. La plage de ports peut être définie à l'aide de l'option --ports, avec la possibilité de sélectionner un port unique ou un intervalle.
Par exemple, les formats suivants sont pris en charge :
--ports 443: analyse du port 443.--ports 20-100: analyse des ports 20 à 100.--ports 1-1024: analyse des ports 1 à 1024.
La validation des paramètres permet notamment de vérifier que les ports sont compris entre 1 et 65535 et que la plage sélectionnée est cohérente.
Exécution concurrente
Pour accélérer l'analyse, le programme utilise ThreadPoolExecutor avec un maximum de 50 threads. Plusieurs tentatives de connexion peuvent ainsi être exécutées simultanément, plutôt que de traiter chaque port strictement l'un après l'autre.
Le scanner utilise des délais d'attente afin de limiter le temps consacré aux connexions qui ne répondent pas.
Export des résultats en JSON
Les résultats peuvent être enregistrés dans un fichier JSON grâce à l'option --output. Le fichier conserve notamment la cible, la plage de ports analysée, la durée du scan et les informations recueillies pour chaque port ouvert.
Ce format facilite la conservation des résultats et leur exploitation ultérieure dans d'autres scripts ou outils.
Environnement technique
- Langage : Python
- Réseau : sockets TCP
- Concurrence :
ThreadPoolExecutor - Protocoles applicatifs : HTTP et HTTPS
- Format d'export : JSON
- Interface : ligne de commande avec
argparse
Le code utilise principalement la bibliothèque standard de Python pour gérer les connexions réseau, les arguments et la sérialisation JSON. Il importe également des modules tiers ou spécifiques à certains environnements ; les dépendances et imports présents dans la version publiée doivent donc être vérifiés avant de présenter le projet comme reposant exclusivement sur la bibliothèque standard.
Résultats du test
Le test a été effectué sur mon Raspberry Pi, à l'adresse IP privée 192.168.1.50, en analysant les ports TCP de 1 à 1024.
Le scan s'est terminé en 2,31 secondes environ et a identifié trois ports TCP ouverts.
La réponse 302 Found indique une redirection HTTP. Le scan ne permet cependant pas, à lui seul, de déterminer la destination de cette redirection ni de conclure qu'un service présente une vulnérabilité.
Compétences mises en pratique
Ce projet m'a permis de mettre en pratique :
- La programmation réseau en Python avec les sockets TCP.
- La résolution de noms d'hôtes et la gestion des erreurs de connexion.
- La programmation concurrente pour accélérer les analyses.
- L'identification des services et la récupération de bannières.
- L'analyse de réponses HTTP et HTTPS.
- La validation des arguments d'une interface en ligne de commande.
- La structuration et l'export de résultats au format JSON.
Limites et améliorations possibles
Ce scanner constitue un outil de reconnaissance réseau de base. Il détecte les ports TCP accessibles et tente d'en identifier les services, mais il ne réalise pas de détection de vulnérabilités.
Parmi les évolutions possibles figurent l'ajout de tests automatisés, une meilleure gestion des erreurs lors de l'analyse HTTP/HTTPS, la possibilité de configurer les délais d'attente et l'amélioration du traitement des bannières.
Les analyses sont destinées à mes propres équipements et à des environnements pour lesquels une autorisation de test a été obtenue.
Conclusion
Ce projet m'a permis de développer un outil concret pour comprendre comment un scanner de ports fonctionne et comment automatiser une première phase de reconnaissance réseau. Il constitue une base que je pourrai faire évoluer dans le cadre de mes travaux en cybersécurité.