Explication détaillée du code graphique pour créer un scanner de port TCP à l'aide de Python3

黄舟
Libérer: 2017-04-18 10:01:39
original
2226 Les gens l'ont consulté

Cet article partage avec vous le processus de production d'utilisation de Python3 pour implémenter un scanner de port de connexion TCP complet, y compris les idées et le code. C'est très simple et facile à comprendre, je le recommande à tout le monde. 🎜>

en pénétration Dans la phase préliminaire des tests, nous devons généralement collecter des informations sur la cible de l'attaque, et l'analyse des ports est une étape cruciale dans la collecte d'informations. Grâce à l'analyse des ports, nous pouvons savoir quels services sont ouverts sur l'hôte cible, et nous pouvons même deviner qu'il peut y avoir certaines vulnérabilités basées sur les services. Les analyses de port TCP sont généralement divisées dans les types suivants :

Analyse de connexion TCP : également appelée analyse de connexion complète, cette méthode se connecte directement au port cible et termine le processus de négociation à trois voies TCP. précis, mais plus lent et facilement détecté par le système cible.

Analyse TCP SYN : également connue sous le nom d'analyse semi-ouverte, cette méthode enverra un paquet SYN, démarrera une session TCP et attendra le paquet de réponse cible. Si un paquet RST est reçu, cela indique que le port est fermé, et si un paquet SYN/ACK est reçu, cela indique que le port correspondant est ouvert.

Tcp FIN scan : Cette méthode envoie un paquet FIN indiquant la suppression d'une connexion TCP active, permettant à l'autre partie de fermer la connexion. Si un paquet RST est reçu, cela indique que le port correspondant est fermé.

Analyse TCP XMAS : Cette méthode envoie des paquets avec les indicateurs PSH, FIN, URG et TCP définis sur 1. Si un paquet RST est reçu, cela indique que le port correspondant est fermé.

Ensuite, nous utiliserons Python3 pour implémenter le scanner de port de connexion complet TCP, puis entrerons le lien

programmation.

Pratique de codage

Le cœur de la méthode consiste à établir des connexions TCP pour différents ports et à juger si le port est ouvert en fonction du fait que la connexion est réussi. Implémentons maintenant le scanner de port le plus simple : 全连接扫描

#!/usr/bin/python3
# -*- coding: utf-8 -*-
from socket import *

def portScanner(host,port):
  try:
    s = socket(AF_INET,SOCK_STREAM)
    s.connect((host,port))
    print('[+] %d open' % port)
    s.close()
  except:
    print('[-] %d close' % port)

def main():
  setdefaulttimeout(1)
  for p in range(1,1024):
    portScanner('192.168.0.100',p)

if name == 'main':
  main()
Copier après la connexion
Le cœur de ce code est la fonction

portScanner . connexion TCP simple. Si la connexion est réussie, le port est jugé ouvert, sinon il est considéré comme fermé. Jetons un coup d'œil aux résultats en cours :

Une telle analyse semble trop inefficace et est en fait très lente car nous définissons le délai d'expiration par défaut à 1 seconde si nous analysons 10 000. ports, ne faudrait-il pas attendre que les fleurs soient fanées ? Le moyen le plus simple est d'utiliser

pour améliorer l'efficacité. Bien que le multi-threading de python soit un peu trop faible, nous pouvons au moins utiliser le temps que nous attendons pour faire autre chose. De plus, de nombreux ports ont été analysés auparavant, et les informations affichées nous ont semblé peu pratiques. Cette fois, nous affichons uniquement le 多线程 qui nous intéresse, et affichons le nombre de ports ouverts à la fin de l'analyse. 打开的端口

#!/usr/bin/python3
# -*- coding: utf-8 -*-
from socket import *
import threading

lock = threading.Lock()
openNum = 0
threads = []

def portScanner(host,port):
  global openNum
  try:
    s = socket(AF_INET,SOCK_STREAM)
    s.connect((host,port))
    lock.acquire()
    openNum+=1
    print('[+] %d open' % port)
    lock.release()
    s.close()
  except:
    pass

def main():
  setdefaulttimeout(1)
  for p in range(1,1024):
    t = threading.Thread(target=portScanner,args=('192.168.0.100',p))
    threads.append(t)
    t.start()   

  for t in threads:
    t.join()

  print('[*] The scan is complete!')
  print('[*] A total of %d open port ' % (openNum))

if name == 'main':
  main()
Copier après la connexion
Exécutez-le et voyez l'effet, comme indiqué ci-dessous :

Cela ne semble-t-il pas plus pratique maintenant ? À ce stade, le problème d'efficacité a été résolu. Il nous reste maintenant à ajouter une fonction d'analyse des paramètres au scanner afin qu'il ait un aspect correct. Nous ne pouvons pas changer le code à chaque fois pour modifier la cible et le port d'analyse !

Nous utiliserons le module standard

fourni avec python3 pour analyser les paramètres argparse, nous nous épargnerons donc la peine d'analyser la chaîne nous-mêmes ! Regardons le code :

#!/usr/bin/python3
# -*- coding: utf-8 -*-
from socket import *
import threading
import argparse

lock = threading.Lock()
openNum = 0
threads = []

def portScanner(host,port):
  global openNum
  try:
    s = socket(AF_INET,SOCK_STREAM)
    s.connect((host,port))
    lock.acquire()
    openNum+=1
    print('[+] %d open' % port)
    lock.release()
    s.close()
  except:
    pass

def main():
  p = argparse.ArgumentParser(description='Port scanner!.')
  p.add_argument('-H', dest='hosts', type=str)
  args = p.parse_args()
  hostList = args.hosts.split(',')
  setdefaulttimeout(1)
  for host in hostList:
    print('Scanning the host:%s......' % (host))
    for p in range(1,1024):
      t = threading.Thread(target=portScanner,args=(host,p))
      threads.append(t)
      t.start()   

    for t in threads:
      t.join()

    print('[*] The host:%s scan is complete!' % (host))
    print('[*] A total of %d open port ' % (openNum))

if name == 'main':
  main()
Copier après la connexion

Regardez l'effet d'exécution, comme indiqué ci-dessous :

À ce stade, notre scanner de port est pratiquement terminé, bien que la fonction soit relativement simple et vise à exprimer les idées de base d'implémentation du scanner de ports ! Quant aux fonctions plus détaillées, elles pourront être progressivement améliorées à partir de cette structure de base !

Résumé

Cette section explique principalement le processus d'implémentation d'un simple scanner de port en Python3. Cette expérience utilise une connexion complète TCP et essaie en permanence de se connecter à l'hôte. Il y a quelques lacunes, cette méthode est la plus adaptée aux débutants. Quant aux méthodes plus complexes, elle ne sera pas difficile à apprendre à l'avenir. Les amis qui souhaitent tirer des conclusions à partir d'un exemple peuvent terminer l'analyse et sortir le protocole en même temps en fonction de la relation de comparaison entre le protocole et le port. Quant aux fonctions plus détaillées, je m'en remets. à tous de faire des exercices !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!