Créer un scan SYN avec Python et Scapy

Table des matières

Dans ce tutoriel, je vais vous apprendre effectuer une analyse des ports TCP SYN, pour cela je vais utiliser Python avec la librairie Scapy.

Pour installer Python, vous pouvez voir le tutoriel suivant. Et pour installer la librairie Scapy pour Python, cliquez sur le bouton suivant :

TÉLÉCHARGER LA BIBLIOTHÈQUE SCAPY

Savoir ce qu'est un scan SYNL'analyse SYN est une technique d'analyse également connue sous le nom d'analyse ouverte, qui est utilisée par les pirates pour déterminer l'état des ports sans établir une connexion complète. Il est également possible d'utiliser cette technique pour mener des attaques DDOS (attaques par déni de service).

NoterIl vise à enseigner comment fonctionne ce type de programme et que vous pouvez tester vos ports, mais pas à l'utiliser de manière malveillante.

Commençons par le scanner de ports.

Étape 1
La première chose que nous faisons est d'importer les bibliothèques dont nous avons besoin.

 import logging logging.getLogger ("scapy.runtime"). setLevel (logging.ERROR) depuis scapy.all import *
Nous importons scapy dans notre programme, et j'ai également importé la journalisation pour qu'il ne nous affiche pas un avertissement gênant si nous n'avons pas d'adresse IPv6.

Étape 2
Une étape qui sert à démarrer nos variables.

 conf.verb = 0 portlist = liste (plage (20 130)) hôte = "192.168.0.1"
La première instruction de cette étape fait une petite configuration pour qu'elle ne nous montre pas les informations Scapy à l'écran. Ce qui suit, nous n'ajoutons que les ports et l'hôte, où nous exécuterons l'action, il serait préférable de l'ajouter en tant que paramètres lors de l'exécution du programme (si vous souhaitez l'ajouter à votre programme, consultez ce lien) , pour faciliter le programme et le rendre plus court ici est pratique.

Étape 3
Cette étape est le cœur du programme.

 print ("Scanning IP ports:", host) for port in portList: sourceport = RandShort () packet = IP (dst = host) / TCP (sport = sourceport, dport = port, flags = "Y") response = sr1 ( paquet, délai d'attente = 2) if ("NoneType" dans str (type (response))): passez elif (response.haslayer (TCP) et response.getlayer (TCP). flags == 0x12): p = IP (dst = host) / TCP (sport = sourceport, dport = port, flags = "R") rst = sr (p, timeout = 1) essayez : service = socket.getservbyport (port) sauf : service = "?" print ("[OUVERT]", port, "->", service)
Cette partie est où l'analyse des ports démarre, nous montrons un message pour que nous sachions qu'il fonctionne, et par le car nous passons par chaque port. On utilise la fonction RandCourt () de sorte que le paquet qui est envoyé provient d'un port différent à chaque fois.

La construction du package se fait avec la deuxième instruction trouvée dans le for. Nous configurons les données qui nous intéressent, l'IP de destination pour la couche IP, les ports source et destination et les drapeaux pour TCP, dans ce cas c'est un scanner SYN, donc il y a le S, en changeant ce paramètre vous pouvez faire un autre type du scanner, comme un scan FIN ou un scan de fenêtre (mais notez que vous devrez modifier les conditions ci-dessous).

La fonction sr1 est en charge de l'envoi du colis. Il faut lui passer en argument le package créé (cette fois il est créé directement ici), et dans ce cas j'ai mis une attente maximum de 2 secondes, vous pouvez le changer, uniquement si vous ne l'indiquez pas, votre programme peut devenir infini. Le résultat de l'envoi du paquet est enregistré dans la variable de réponse.

Dans les conditions, nous sommes intéressés à savoir si nous avons une réponse et si elle a les drapeaux SYN et ACK activés (c'est pourquoi nous utilisons 0x12), si nous n'utilisons pas avant le et response.haslayer (TCP), si c'est le cas n'ont pas la couche, une exception sera levée. Si cette condition est remplie, nous enverrons un message avec le drapeau RST actif pour couper la connexion. La partie de essayez… attrapez vous pouvez l'ignorer, il ne fait que supprimer le service utilisé dans ce port pour afficher plus d'informations à l'écran (la fonction socket.getservbyport (port) si c'est un port connu, il renverra des informations, sinon il lèvera une exception et si cela se produit, j'ai choisi de mettre ¿? comme « information », comme une indication de non connu.)

Eh bien, nous avons terminé, dans l'image suivante, vous pouvez voir la sortie de l'exécution du scanner :

Ci-dessous je mets le code complet:

 import logging logging.getLogger ("scapy.runtime"). setLevel (logging.ERROR) # Ne pas afficher l'avertissement de scapy.all import * conf.verb = 0 # Ne pas afficher les données à l'écran listPorts = list (range ( 20 130) ) #La liste des ports à analyser hôte = "192.168.0.1" # Ici, l'adresse IP que vous souhaitez analyser est imprimée ("Scanning IP ports:", host) pour le port dans PortList : sourcePort = RandShort () packet = IP ( dst = host) / TCP (sport = sourceport, dport = port, flags = "S") response = sr1 (packet, timeout = 2) if ("NoneType" in str (type (response))): passe elif (response .haslayer (TCP) et response.getlayer (TCP) .flags == 0x12) : p = IP (dst = host) / TCP (sport = sourceport, dport = port, flags = "R") rst = sr (p, timeout = 1) essayez : service = socket.getservbyport (port) sauf : service = "?" print ("[OUVERT]", port, "->", service) 
[couleur = rvb (169,169,169)] Code complet [/couleur]

NoterCe scanner peut être lent à vérifier de nombreux ports, dans ces cas, c'est une bonne idée d'utiliser le « multithreading » ou le « multitraitement ». Vous pouvez également analyser d'autres manières, en utilisant nmap dans Python ou en utilisant des sockets bruts.

Et si vous voulez télécharger le code, je joins un zip :

Code SynScan.zip 644 octets 254 téléchargements

Avez-vous aimé et aidé ce tutoriel ?Vous pouvez récompenser l'auteur en appuyant sur ce bouton pour lui donner un point positif

Vous contribuerez au développement du site, partager la page avec vos amis

wave wave wave wave wave