Heim >Backend-Entwicklung >Python-Tutorial >Einfacher Port-Scanner mit Python
Quellcode hier klicken
Dies ist ein grundlegendes Port-Scanner-Tool, mit dem Benutzer den Host scannen können, um offene Ports zu finden und herauszufinden, welcher Dienst auf dem Port ausgeführt wird...
Schauen wir uns zunächst den Code an und zerlegen ihn dann in Teile, um ihn zu analysieren...
import socket from datetime import datetime import sys import os def usage(): """Prints the usage information for this script.""" usage_info = """ Tool Name: SimplePortScanner Developed by : Bharath Kumar Usage: python3 port_scanner.py [options] Options: -h, --help Show this help message and exit. -t, --target <ip> Specify the target hostname or IP address (required). -p, --port <port> Specify a port (or) range of ports to scan (e.g. -p 80 (or) -p 1-1024). Description: This script performs a port scan on a specified hostname or IP address for a specific port or a range of ports, checking which ports are open. Examples: python3 port_scanner.py -t example.com (or) 192.0.0.1 python3 port_scanner.py -t example.com (or) 192.168.1.1 -p 80 python3 port_scanner.py -t example.com (or) 192.168.1.1 --ports 1-1024 """ print(usage_info) start_time = datetime.now() def scan_port(ip, port): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(1) try: result = s.connect_ex((ip, port)) service = socket.getservbyport(int(port)) except: service = "None" if result == 0: print(" Port: {}\t State: Open\t Service: {}".format(port, service)) else: pass s.close() def host(target): try: ip = socket.gethostbyname(target) print('_'*51) print("[#] Resolved {} to {}".format(target,ip)) return ip except: print('_'*51) print("[#] Error: Unable to resolve hostname {}".format(target)) sys.exit(1) def check_host_up(ip): ping = os.system("ping {} -c 1 > /dev/null".format(ip)) if ping == 0: print("[#] {} host is up and running".format(ip)) return True else: print("[#] {} host is down".format(ip)) print("Exiting...") exit() return False if __name__ == "__main__": target_ip = None start_port = 1 end_port = 65535 try: for i, arg in enumerate(sys.argv): if arg in ("-t", "--target"): target_ip = sys.argv[i + 1] elif arg in ("-p", "--ports"): port_range = sys.argv[i + 1] if "-" in port_range: start_port, end_port = map(int, port_range.split('-')) else: start_port = end_port = int(port_range) if target_ip is None: print("[#] Error: Target hostname or IP address is required.") usage() sys.exit(1) if start_port is None or end_port is None: print("[#] Error: Port range is required.") usage() sys.exit(1) target_ip = host(target_ip) if not check_host_up(target_ip): sys.exit(1) print(f"[#] Scanning {target_ip} from port {start_port} to {end_port}...") print("[#] Scanning started at: {}".format(start_time)) print('_'*51) for port in range(start_port, end_port + 1): scan_port(target_ip, port) except (IndexError, ValueError): print("[#] Error: Invalid arguments provided.") usage() sys.exit(1) start_time = start_time.now() - start_time print('_'*51) print("Scanning is completed in ",start_time)
Socket importieren: Eine Möglichkeit, zwei Knoten (Server, Client) miteinander zu kommunizieren.
from datetime import datetime: Wird für das Scannen aufgewendete Rechenzeit verwendet.
System importieren: ist Zugriff auf systemspezifische Parameter (argv).
Betriebssystem importieren: wird zum Ausführen des Befehls Ping verwendet.
def_usage(): Druckt die Nutzungsinformationen für dieses Skript.
start_time = datetime.now(): wird verwendet, um die aktuelle Uhrzeit und das aktuelle Datum abzurufen, um die für das Scannen aufgewendete Zeit zu berechnen.
def scan_port(ip, port): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(1) try: result = s.connect_ex((ip, port)) service = socket.getservbyport(int(port)) except: service = "None" if result == 0: print(" Port: {}\t State: Open\t Service: {}".format(port, service)) else: pass s.close()
Dieser Codeblock definiert die Funktion scan_port(ip, port), die prüft, ob ein bestimmter Port an einer bestimmten IP-Adresse über Socket geöffnet ist.
Socket-Erstellung: socket.socket(socket.AF_INET, socket.SOCK_STREAM) Erstellen Sie einen neuen Socket für IPv4 mit TCP.
Timeout: s.settimeout(1) setzt die Socket-Zeit auf 1 Sekunde. Wenn die Verbindung innerhalb dieser Zeit nicht erfolgreich ist, wird der Versuch abgebrochen.
Verbindungstest:s.connect_ex((ip, port))versucht, die spezifische IP und den Port zu verbinden. wenn es erfolgreich ist, ist das Ergebnis 0; andernfalls wird es ein anderer Wert sein.
Diensterkennung: socket.getservbyport(int(port))versuchen, Dienste zu erkennen, die auf dem angegebenen Port ausgeführt werden, z. B. HTTP für Port 80.
Fehlerbehandlung:Im Falle eines Fehlers (z. B. kein Dienst auf dem Port), setzt der Except-Block den Dienst auf „Keine“.
Ausgabe: Wenn der Port geöffnet ist (Ergebnis == 0), werden die Portnummer, der Status („Offen“) und der Dienstname gedruckt.
Verbindungsschluss: s.close() schließt den Socket, um Ressourcen freizugeben.
def host(target): try: ip = socket.gethostbyname(target) print('_'*51) print("[#] Resolved {} to {}".format(target,ip)) return ip except: print('_'*51) print("[#] Error: Unable to resolve hostname {}".format(target)) sys.exit(1)
Dieser Codeblock definiert die Funktion host(target), die ein bestimmtes Ziel (einen Hostnamen) mithilfe von socket.gethostname() in seine entsprechende IP-Adresse auflöst
def check_host_up(ip): ping = os.system("ping {} -c 1 > /dev/null".format(ip)) if ping == 0: print("[#] {} host is up and running".format(ip)) return True else: print("[#] {} host is down".format(ip)) print("Exiting...") exit() return False
Diese Funktion check_host_up(ip) prüft mithilfe der Ping-Methode os.system(), ob ein bestimmter Port auf einer bestimmten Ziel-IP aktiv oder inaktiv ist.
if __name__ == "__main__": target_ip = None start_port = 1 end_port = 65535 try: for i, arg in enumerate(sys.argv): if arg in ("-t", "--target"): target_ip = sys.argv[i + 1] elif arg in ("-p", "--ports"): port_range = sys.argv[i + 1] if "-" in port_range: start_port, end_port = map(int, port_range.split('-')) else: start_port = end_port = int(port_range)
Das Array sys.argv enthält die Liste der an das Skript übergebenen Argumente. Wir durchlaufen diese Argumente, um nach der Ziel-IP (-t oder --target) und dem Portbereich (-p oder --ports) zu suchen.
Die Ziel-IP/der Ziel-Hostname wird in target_ip gespeichert.
Der Portbereich wird analysiert und in start_port und end_port aufgeteilt. Wenn kein Bereich angegeben ist, werden standardmäßig alle Ports von 1 bis 65535 gescannt.
import socket from datetime import datetime import sys import os def usage(): """Prints the usage information for this script.""" usage_info = """ Tool Name: SimplePortScanner Developed by : Bharath Kumar Usage: python3 port_scanner.py [options] Options: -h, --help Show this help message and exit. -t, --target <ip> Specify the target hostname or IP address (required). -p, --port <port> Specify a port (or) range of ports to scan (e.g. -p 80 (or) -p 1-1024). Description: This script performs a port scan on a specified hostname or IP address for a specific port or a range of ports, checking which ports are open. Examples: python3 port_scanner.py -t example.com (or) 192.0.0.1 python3 port_scanner.py -t example.com (or) 192.168.1.1 -p 80 python3 port_scanner.py -t example.com (or) 192.168.1.1 --ports 1-1024 """ print(usage_info) start_time = datetime.now() def scan_port(ip, port): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(1) try: result = s.connect_ex((ip, port)) service = socket.getservbyport(int(port)) except: service = "None" if result == 0: print(" Port: {}\t State: Open\t Service: {}".format(port, service)) else: pass s.close() def host(target): try: ip = socket.gethostbyname(target) print('_'*51) print("[#] Resolved {} to {}".format(target,ip)) return ip except: print('_'*51) print("[#] Error: Unable to resolve hostname {}".format(target)) sys.exit(1) def check_host_up(ip): ping = os.system("ping {} -c 1 > /dev/null".format(ip)) if ping == 0: print("[#] {} host is up and running".format(ip)) return True else: print("[#] {} host is down".format(ip)) print("Exiting...") exit() return False if __name__ == "__main__": target_ip = None start_port = 1 end_port = 65535 try: for i, arg in enumerate(sys.argv): if arg in ("-t", "--target"): target_ip = sys.argv[i + 1] elif arg in ("-p", "--ports"): port_range = sys.argv[i + 1] if "-" in port_range: start_port, end_port = map(int, port_range.split('-')) else: start_port = end_port = int(port_range) if target_ip is None: print("[#] Error: Target hostname or IP address is required.") usage() sys.exit(1) if start_port is None or end_port is None: print("[#] Error: Port range is required.") usage() sys.exit(1) target_ip = host(target_ip) if not check_host_up(target_ip): sys.exit(1) print(f"[#] Scanning {target_ip} from port {start_port} to {end_port}...") print("[#] Scanning started at: {}".format(start_time)) print('_'*51) for port in range(start_port, end_port + 1): scan_port(target_ip, port) except (IndexError, ValueError): print("[#] Error: Invalid arguments provided.") usage() sys.exit(1) start_time = start_time.now() - start_time print('_'*51) print("Scanning is completed in ",start_time)
Sobald wir eine gültige IP-Adresse haben, müssen wir prüfen, ob der Host erreichbar ist. Die Funktion host(target_ip) löst einen Hostnamen in seine IP-Adresse auf und check_host_up(target_ip) überprüft, ob der Host online ist.
def scan_port(ip, port): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(1) try: result = s.connect_ex((ip, port)) service = socket.getservbyport(int(port)) except: service = "None" if result == 0: print(" Port: {}\t State: Open\t Service: {}".format(port, service)) else: pass s.close()
Der Kern der Port-Scan-Funktionalität findet innerhalb der Schleife statt:
Diese Schleife durchläuft den angegebenen Portbereich und für jeden Port prüft die Funktion scan_port(target_ip, port) den Port, um zu prüfen, ob er offen oder geschlossen ist.
Durch Befolgen dieser Anleitung haben Sie gelernt, wie Sie einen einfachen Python-Port-Scanner erstellen, der Befehlszeilenargumente akzeptiert, Eingaben validiert und eine Reihe von Ports auf einem bestimmten Ziel scannt. Obwohl es sich hierbei um eine grundlegende Implementierung handelt, bildet sie die Grundlage für erweiterte Funktionen wie Threading oder Diensterkennung.
Sie können dieses Skript gerne an Ihre spezifischen Bedürfnisse anpassen und erweitern. Viel Spaß beim Scannen!
Das obige ist der detaillierte Inhalt vonEinfacher Port-Scanner mit Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!