Heim  >  Artikel  >  Backend-Entwicklung  >  Einfacher Port-Scanner mit Python

Einfacher Port-Scanner mit Python

Linda Hamilton
Linda HamiltonOriginal
2024-10-23 13:31:30157Durchsuche

Basic Port Scanner using 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)


Parsen von Befehlszeilenargumenten

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)

Hostauflösung und Erreichbarkeit

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()


Port-Scanning

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.

Abschluss

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!

Stellungnahme:
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