Scan de port TCP
Sommaire
1 – Scan de port en ligne
2 – Fonction de Scan
L’utilitaire Scan permet à la base pour tester les ports TCP d’un hôte distant. L’avantage de cette outil est qu’il est en ligne et rend donc son utilisation anonyme. Il vous permettra aussi de valider votre sécurité* vu de l’extérieur.
Le plus gros avantage, c’est qu’il est en ligne avec la possibilité de changer l’adresse IP de destination.
*Sécurité : Test de de présence de port ouvert
Vous trouverez sur le site FraemIP, une bonne documentation sur les scan TCP et UDP.
3 – Suivi du développement
3.1 – Problème restant
3.2 – RoadMap
- Proposer le choix du timeout et du temps entre chaque port.
- Afficher le port source utilisé pour les scan.
- Proposer la saisie d’un nom d’hôte au lieu d’une IP.
- Proposer des list de ports à scanner tel que standard, Plus, All, Backdoor et etc.
- Tester les fonctions socket_strerror(socket_last_error($socket)), Compatible > php 4.0.
- Gérer un timeout pour allez plus vite entre chaque port.
- Différencier l’échec si pas de réponse ou si réponse indiquant le port est fermé.
3.3 – Suivi du projet
- V2.1
Vérification des champs port_destination et port_source si les données saisies sont bien des nombres. Pour cela, j’utilise la fonction is_numeric(), merci loquace. - V2.0
Résolution du problème d’affichage d’un coup. Pour cela, la boucle lance x fois un Document.Write lançant un scan d’un seul port.
Création de la fonction Javascript nouvelle_page() permettant de lancer une nouvel fenêtre redimensionnée à partir d’une Form. Merci à Seb| et à Sagamore pour leur coup de main.
Implantation d’un sécurité afin de protéger le script contre les utilisations.
Limitation du scan à 20 ports simultannés.
Demande au browser de ne pas mettre en cache afin d’éviter qu’une seconde demande de scan identique soit non effectuée. - V1.2
Validation poussée des champs port_de_début et port_de_fin.
Résolution du problème Warning: fsockopen() en ajoutant error_reporting(0); permettant de ne pas afficher les erreurs et warning. - V1.1
Migration sur Ovh => Warning: fsockopen(): unable to connect to quand le port est fermé.
Intégration de champ timeout qui fonctionne désormais, car Ovh tourne sur une version PHP 4.x.
Rattrapage du retard sur les commentaires dans le script.
Passage de la gestion des erreurs dans la fonction erreur($erreur,$opentable).
Vérification supplémentaire du champ IP pour éviter la saisie du style .0 qui donnait 0.0.0.0.
Passage du script dans son répertoire.
Vérification des champs de saisie. - V1.0
Création de la page de saisie.
Test d’un port.
Choix et test d’une plage.
4 – Code source
Ce script est divisé en deux fichiers afin d’obtenir un affichage fluide. Cela permet de ne pas bloquer l’affichage en attendant les réponses des différents ouverture de session TCP.
4.1 – Scan.php
<? // ******************************************** // Nom du script : scan.php // Auteur : _SebF AT frameIP.com // date de création : 07 Novembre 2003 // version : 2.1 // Licence : Ce script est libre de toute utilisation. // La seule condition existante est de faire référence au site http://www.frameip.com afin de respecter le travail d'autrui. // ******************************************** // ******************************************** // Affichage de l'entete html // ******************************************** echo ' <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <LINK REL="StyleSheet" HREF="../style.css" TYPE="text/css"> <title>FrameIP, Pour ceux qui aiment IP - Script Scan</title> <META http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <META NAME="AUTHOR" CONTENT="www.frameip.com"> <META NAME="COPYRIGHT" CONTENT="Copyright (c) 2003 by framip"> <META NAME="KEYWORDS" CONTENT="scan, online, outil, tcp, udp, port, destination, ouvert ferme, session, valider, validation, securite"> <META NAME="DESCRIPTION" CONTENT="Frameip, pour ceux qui aiment IP - Script Scan"> <META NAME="ROBOTS" CONTENT="INDEX, FOLLOW"> <META NAME="REVISIT-AFTER" CONTENT="1 DAYS"> <META NAME="RATING" CONTENT="GENERAL"> <META NAME="GENERATOR" CONTENT="powered by frameip.com - webmaster@frameip.com"> </head> <body> '; // ********************************************** // Récupération des variables POST // ********************************************** $scan_adresse_ip = $_POST['ipaddress']; $scan_port_de_depart = $_POST['port1']; $scan_port_de_fin = $_POST['port2']; // ********************************************** // Enregistrement du compteur // ********************************************** include '../variables.php'; $info_compteur1=$scan_adresse_ip; $info_compteur2=$scan_port_de_depart; $info_compteur3=$scan_port_de_fin; $specifiez_le_nom_du_compteur="scan.php"; include '../compteur.php'; // ******************************************** // Vérification du champ IP // ******************************************** if (empty($scan_adresse_ip)) scan_erreur(1); if ($scan_adresse_ip==0) scan_erreur(4); if (ip2long($scan_adresse_ip)==-1) // Vérification de la conformité de l'IP scan_erreur(4); else { // Transforme les saisies tel que 10.10..4 en 10.10.0.4 $inetaddr=ip2long($scan_adresse_ip); $scan_adresse_ip=long2ip($inetaddr); } // ******************************************** // Vérification des champs ports // ******************************************** if (empty($scan_port_de_depart)) scan_erreur(2); if (empty($scan_port_de_fin)) scan_erreur(3); if (is_numeric($scan_port_de_depart)==false) // Si ce n'est pas un nombre scan_erreur(10); if (is_numeric($scan_port_de_fin)==false) // Si ce n'est pas un nombre scan_erreur(11); if ($scan_port_de_depart<=0) scan_erreur(5); if ($scan_port_de_fin>65535) scan_erreur(6); if ($scan_port_de_depart>$scan_port_de_fin) scan_erreur(7); if ($scan_port_de_fin-$scan_port_de_depart>20) scan_erreur(9); // ********************************************** // Affichage du titre // ********************************************** echo ' <p class="titre-principal"> Scanner de ports TCP </p> <BR> <p > Voici les résultats du Scan de l\'adresse IP '.$scan_adresse_ip.' entre le port '.$scan_port_de_depart.' et '.$scan_port_de_fin.' <BR> <BR> '; // ********************************************** // Boucle lancant les appels du script de scan port par port // ********************************************** for ($i=$scan_port_de_depart;$i<$scan_port_de_fin+1;$i++) { echo '<script src="scan2.php?host='.$scan_adresse_ip.'&port='.$i.'"></script>'; } echo '</p>'; // ******************************************** // Fin du script général // ******************************************** fin_du_script(); // ******************************************** // Fonction de gestion des erreurs // ******************************************** function scan_erreur($erreur) // $erreur représente le numéro d'erreur. { // ******************************************** // Affichage de titre // ******************************************** echo ' <p class="titre-principal"> Erreur </p> '; // ******************************************** // Affichage de l'erreur // ******************************************** echo '<p >'; // ******************************************** // Message personnalisé // ******************************************** if ($erreur==1) echo 'Le Scan ne peux pas avoir lieu car le champ IP est vide.'; elseif ($erreur==2) echo 'Le Scan ne peux pas avoir lieu car le champ Port de début est vide.'; elseif ($erreur==3) echo 'Le Scan ne peux pas avoir lieu car le champ Port de fin est vide.'; elseif ($erreur==4) echo 'Le Scan ne peux pas avoir lieu car le champ IP ne contient pas d\'adresse valide.'; elseif ($erreur==5) echo 'Le Scan ne peux pas avoir lieu car le champ Port de début est inférieur ou égale à 0.'; elseif ($erreur==6) echo 'Le Scan ne peux pas avoir lieu car le champ Port de fin est suppérieur à 65535.'; elseif ($erreur==7) echo 'Le Scan ne peux pas avoir lieu car le champ Port de début est suppérieur au port de fin.'; elseif ($erreur==9) echo 'Le Scan ne peux pas avoir lieu car vous demandez de scanner plus de 20 ports.'; elseif ($erreur==10) echo 'Les donnees du champ port de depart ne reprensente pas un nombre.'; elseif ($erreur==11) echo 'Les donnees du champ port de fin ne represente pas un nombre.'; // ******************************************** // Fin du script général // ******************************************** echo '<br><br>'; fin_du_script(); } function fin_du_script() { // ******************************************** // Affiche de l'Url // ******************************************** echo ' <a href="http://www.frameip.com"> www.frameip.com </a> </p> '; // ******************************************** // Fin de la page Html // ******************************************** echo ' </body> </html> '; // ******************************************** // Fin du script général // ******************************************** exit(0); } ?>
4.2 – Scan2.php
<? // ******************************************** // Nom du script : scan2.php // Auteur : _SebF AT frameIP.com // date de création : 29 Novembre 2003 // version : 2.1 // Licence : Ce script est libre de toute utilisation. // La seule condition existante est de faire référence au site http://www.frameip.com afin de respecter le travail d'autrui. // ******************************************** // ********************************************** // Interdiction de la mise en cache // ********************************************** header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: no-cache, must-revalidate"); header("Pragma: no-cache"); // ********************************************** // Suppression des warning et erreurs si la session tcp ne monte pas // ********************************************** error_reporting(0); // ********************************************** // Ouverture de session tcp // ********************************************** $socket=fsockopen($host, $port, &$errno, &$errstr, 1); if ($socket) { // ********************************************** // La session s'est bien ouverte // ********************************************** $nombre_de_port_ouvert++; fclose($socket); echo "document.write('<BR>Le port TCP $port est ouvert');"; } else // ********************************************** // La session ne s'est pas ouverte // ********************************************** echo "document.write('<BR>Le port TCP $port est fermé $nombre_de_port_scanne');"; ?>
5 – Les vidéos
5.1 - What are well-known TCP port numbers ?
Cette video en anglais vous présente les ports connus. Translation is one approach to naming things online. Another is convention. Conventions establish defaults that associate semantics with numbers. A good example of this approach are well known TCP port numbers. When your web browser wants to retrieve a web page over an insecure (unencrypted) connection, it tries to open a connection to TCP port 80 on the host. There’s no reason that 80 is 80 it’s just what we’ve agreed on.
5.2 - Codage d'un scanner en Python
Cette vidéo présente comment créer et coder un petit script Python permettant de scanner des ports.
6 – Suivi du document
Création et suivi de la documentation par _SebF
7 – Discussion autour du scan de port TCP
Vous pouvez poser toutes vos questions, faire part de vos remarques et partager vos expériences à propos du scan de port TCP. Pour cela, n’hésitez pas à laisser un commentaire ci-dessous :
Très bon code mais malheureusement il ne renvoie aucun résultat par contre le code est claire et très bien expliqué. Il donne des astuces pas mal.