Heim > Backend-Entwicklung > Python-Tutorial > Detaillierte Erläuterung des Grafikcodes zum Erstellen eines TCP-Port-Scanners mit Python3

Detaillierte Erläuterung des Grafikcodes zum Erstellen eines TCP-Port-Scanners mit Python3

黄舟
Freigeben: 2017-04-18 10:01:39
Original
2311 Leute haben es durchsucht

Dieser Artikel zeigt Ihnen den Produktionsprozess der Verwendung von Python3 zur Implementierung eines TCP-Portscanners mit vollständiger Verbindung, einschließlich Ideen und Code. Er ist sehr einfach und leicht zu verstehen 🎜>

bei der Penetration In der Vorphase des Tests müssen wir normalerweise Informationen über das Angriffsziel sammeln, und das Port-Scanning ist ein entscheidender Schritt bei der Informationssammlung. Durch Port-Scanning können wir herausfinden, welche Dienste auf dem Zielhost geöffnet sind, und wir können sogar vermuten, dass es aufgrund der Dienste möglicherweise bestimmte Schwachstellen gibt. TCP-Port-Scans werden im Allgemeinen in die folgenden Typen unterteilt:

TCP-Verbindungsscan: Diese Methode wird auch als vollständiger Verbindungsscan bezeichnet. Diese Methode stellt eine direkte Verbindung zum Zielport her und schließt den TCP-Drei-Wege-Handshake-Prozess ab genau, aber langsamer und vom Zielsystem leicht zu erkennen.

TCP-SYN-Scan: Diese Methode wird auch als halboffener Scan bezeichnet und sendet ein SYN-Paket, startet eine TCP-Sitzung und wartet auf das Zielantwortpaket. Wenn ein RST-Paket empfangen wird, zeigt dies an, dass der Port geschlossen ist, und wenn ein SYN/ACK-Paket empfangen wird, zeigt es an, dass der entsprechende Port geöffnet ist.

Tcp-FIN-Scan: Diese Methode sendet ein FIN-Paket, das den Abbau einer aktiven TCP-Verbindung anzeigt, sodass die andere Partei die Verbindung schließen kann. Wenn ein RST-Paket empfangen wird, zeigt dies an, dass der entsprechende Port geschlossen ist.

TCP-XMAS-Scan: Diese Methode sendet Pakete mit auf 1 gesetzten PSH-, FIN-, URG- und TCP-Flag-Bits. Wenn ein RST-Paket empfangen wird, zeigt dies an, dass der entsprechende Port geschlossen ist.

Als nächstes verwenden wir Python3, um den TCP-Portscanner für vollständige Verbindungen zu implementieren, und geben dann den Link

Programmierung ein.

Codierungspraxis

Der Kern der Methode besteht darin, TCP-Verbindungen für verschiedene Ports herzustellen und anhand der Verbindung zu beurteilen, ob der Port geöffnet ist Erfolgreich. Jetzt implementieren wir den einfachsten Port-Scanner: 全连接扫描

#!/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()
Nach dem Login kopieren
Der Kern dieses Codes ist die

portScanner-Funktion einfache TCP-Verbindung Wenn die Verbindung erfolgreich ist, wird der Port als geöffnet beurteilt, andernfalls wird er als geschlossen betrachtet. Werfen wir einen Blick auf die laufenden Ergebnisse:

Ein solcher Scan sieht zu ineffizient aus und ist tatsächlich sehr langsam, da wir das Standard-Timeout auf 1 Sekunde setzen, wenn wir 10.000 scannen Häfen, müssen wir nicht warten, bis die Blumen verwelkt sind? Der einfachste Weg ist die Verwendung von

, um die Effizienz zu verbessern. Obwohl das Multithreading von Python etwas zu schwach ist, können wir die Zeit, die wir warten, zumindest nutzen, um etwas anderes zu tun. Darüber hinaus wurden zuvor viele Ports gescannt, und die angezeigten Informationen schienen für uns unpraktisch zu sein. Dieses Mal zeigen wir nur die 多线程 an, die uns wichtig sind, und zeigen am Ende des Scans die Anzahl der offenen Ports an. 打开的端口

#!/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()
Nach dem Login kopieren
Führen Sie es aus und sehen Sie den Effekt, wie unten gezeigt:

Sieht es jetzt nicht bequemer aus? Zu diesem Zeitpunkt ist das Effizienzproblem gelöst. Jetzt müssen wir dem Scanner noch eine Parameter-Parsing-Funktion hinzufügen, damit er nicht jedes Mal geändert werden kann, um das Scan-Ziel und den Port zu ändern.

Wir werden das Standardmodul

verwenden, das mit Python3 geliefert wird, um die argparse-Parameter zu analysieren, sodass wir uns die Mühe ersparen, die -Zeichenfolge selbst zu analysieren! Schauen wir uns den Code an:

#!/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()
Nach dem Login kopieren

Sehen Sie sich den laufenden Effekt an, wie unten gezeigt:

An diesem Punkt ist unser Port-Scanner im Grunde fertig. Obwohl die Funktion relativ einfach ist und darauf abzielt, die grundlegenden Implementierungsideen des Port-Scanners auszudrücken! Detailliertere Funktionen können auf Basis dieser Grundstruktur schrittweise verbessert werden!

Zusammenfassung

In diesem Abschnitt wird hauptsächlich der Prozess der Implementierung eines einfachen Port-Scanners in Python3 erläutert. Dieses Experiment verwendet jedoch eine vollständige TCP-Verbindung Es gibt einige Mängel. Diese Methode eignet sich am besten für Anfänger. Komplexere Methoden werden in Zukunft nicht mehr schwer zu erlernen sein. Freunde, die aus einem Beispiel Rückschlüsse ziehen möchten, können den Scan abschließen und gleichzeitig das Protokoll basierend auf dem Vergleich zwischen dem Protokoll und dem Port ausgeben. Was die detaillierteren Funktionen betrifft, überlasse ich es jedem Übungen machen!

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Grafikcodes zum Erstellen eines TCP-Port-Scanners mit Python3. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage