Einführung
Scapy ist ein leistungsstarkes, interaktives Programm und eine Bibliothek zur Paketmanipulation, die in Python geschrieben wurde. Es ermöglicht Ihnen, Pakete für eine Vielzahl von Protokollen zu erstellen oder zu dekodieren, sie über das Netzwerk zu versenden, zu erfassen sowie Anfragen und Antworten abzugleichen.
Das Besondere an Scapy ist, dass Sie auf der Ebene der Paketkonstruktion arbeiten können, anstatt nur auf der Socket- oder Anwendungsebene. Das bedeutet, dass Sie Header, Flags, Felder und Protokollkombinationen explizit steuern können – auf eine Weise, die bei herkömmlichen Client-Bibliotheken meist verborgen bleibt.
In diesem Lab lernen Sie die Grundlagen der Paketerstellung mit Scapy. Sie beginnen mit dem Import der notwendigen Module und gehen dann dazu über, ICMP- (Ping) und TCP-Pakete Schicht für Schicht zu erstellen. Abschließend versenden Sie diese benutzerdefinierten Pakete und analysieren die Netzwerkantworten. Diese praktische Erfahrung vermittelt Ihnen ein tieferes Verständnis dafür, wie Netzwerkprotokolle im Hintergrund funktionieren und wie Sicherheitsexperten Netzwerkverteidigungen testen.
Scapy-Module importieren
In diesem Schritt richten Sie Ihre Python-Umgebung ein und importieren die erforderlichen Scapy-Module. Obwohl Scapy als interaktive Konsole verwendet werden kann, ermöglicht das Schreiben von Skripten das einfache Speichern, Ändern und Wiederverwenden Ihrer Logik zur Paketerstellung.
Dies stellt einen Wechsel von der Nutzung von Protokollen hin zu deren Konstruktion dar. Anstatt nur eine bestehende Anwendung anzuweisen, Datenverkehr für Sie zu senden, definieren Sie selbst, wie dieser Datenverkehr aussehen soll.
Stellen Sie zunächst sicher, dass Sie sich in Ihrem Standard-Arbeitsverzeichnis befinden. Sie können dies mit dem Befehl pwd überprüfen, aber Sie sollten sich bereits in ~/project befinden.
Erstellen Sie eine neue Python-Datei namens packet_crafter.py mit dem Texteditor nano.
nano packet_crafter.py
Innerhalb dieser Datei müssen Sie die Scapy-Bibliothek importieren. Der Standardweg, Scapy in Skripten zu verwenden, besteht darin, alle Funktionen aus dem Modul scapy.all zu importieren. Fügen Sie die folgenden Zeilen zu Ihrem Skript hinzu:
from scapy.all import *
print("Scapy modules imported successfully.")
Speichern Sie die Datei mit Ctrl+O und Enter. Wenn Sie das Skript weiter ausbauen möchten, bevor Sie es testen, können Sie in nano bleiben. Verwenden Sie Ctrl+X, wenn Sie bereit sind, zum Terminal zurückzukehren.
Führen Sie nun Ihr Skript mit Python aus, um sicherzustellen, dass keine Syntaxfehler vorliegen und die Scapy-Bibliothek korrekt geladen wird. Da das Erstellen von rohen Netzwerkpaketen erhöhte Privilegien erfordert, müssen Sie das Skript mit sudo ausführen.
sudo python3 packet_crafter.py
Sie sollten eine Ausgabe ähnlich der folgenden sehen, die den Erfolg bestätigt:
Scapy modules imported successfully.
In einigen Lab-Umgebungen gibt Scapy möglicherweise vor der Erfolgsmeldung eine zusätzliche Warnung von optionalen Python-Paketen wie matplotlib aus. Wenn Sie dennoch Scapy modules imported successfully. sehen, können Sie mit dem nächsten Schritt fortfahren.
Ein ICMP Echo Request erstellen
In diesem Schritt erstellen Sie ein ICMP Echo Request-Paket, allgemein bekannt als "Ping". Netzwerkpakete werden in Schichten (Layern) aufgebaut, gemäß dem OSI-Modell. In Scapy können Sie diese Schichten mit dem Operator / stapeln.
Das Schichtenmodell ist eines der wichtigsten Konzepte, die es hier zu verinnerlichen gilt. Jede Schicht fügt ihre eigenen Felder und Verantwortlichkeiten hinzu. Scapy spiegelt dieses Modell direkt wider, weshalb die Syntax das Verständnis der Paketstruktur erleichtert.
Ein ICMP-Ping erfordert eine IP-Schicht (Netzwerkschicht), um Quell- und Zieladressen anzugeben, sowie eine ICMP-Schicht, um den Nachrichtentyp zu definieren.
Falls packet_crafter.py noch in nano geöffnet ist, setzen Sie die Bearbeitung fort. Andernfalls öffnen Sie die Datei erneut:
nano packet_crafter.py
Fügen Sie den folgenden Code am Ende Ihres Skripts hinzu. Dieser Code erstellt ein IP-Objekt, das auf den öffentlichen DNS-Server von Google (8.8.8.8) zielt, ein ICMP-Objekt erstellt und beide miteinander stapelt. Die Methode show() gibt eine detaillierte Aufschlüsselung der Paketstruktur aus.
## Create an IP layer targeting Google's DNS
ip_layer = IP(dst="8.8.8.8")
## Create an ICMP layer (Echo Request)
icmp_layer = ICMP()
## Stack the layers to form the final packet
icmp_packet = ip_layer / icmp_layer
print("\n--- ICMP Packet Structure ---")
icmp_packet.show()
Speichern Sie die Datei mit Ctrl+O und Enter. Sie können in nano bleiben und mit dem nächsten Schritt fortfahren, wenn Sie das Skript weiter ausbauen möchten, bevor Sie es ausführen.
Führen Sie Ihr aktualisiertes Skript aus, um die Struktur des soeben erstellten Pakets zu sehen.
sudo python3 packet_crafter.py
Sie sehen eine detaillierte Ausgabe, die die Standardwerte zeigt, die Scapy automatisch für Sie ausgefüllt hat, wie z. B. die Protokollversion, TTL (Time To Live) und den ICMP-Typ.
--- ICMP Packet Structure ---
###[ IP ]###
version = 4
ihl = None
tos = 0x0
len = None
id = 1
flags =
frag = 0
ttl = 64
proto = icmp
chksum = None
src = 10.0.2.15
dst = 8.8.8.8
\options \
###[ ICMP ]###
type = echo-request
code = 0
chksum = None
id = 0x0
seq = 0x0
unused = ''
Ein benutzerdefiniertes TCP SYN-Paket erstellen
In diesem Schritt erstellen Sie ein TCP SYN-Paket. Diese spezielle Art von Paket wird häufig bei Netzwerk-Scans verwendet (wie beim Stealth-Scan von Nmap), um zu prüfen, ob ein bestimmter Port auf einem Zielrechner offen ist, ohne eine vollständige Verbindung aufzubauen.
Dies ist ein gutes Beispiel dafür, wie kleine Änderungen am Header zu sehr unterschiedlichem Netzwerkverhalten führen. Sie ändern nicht den Zielhost oder den Port, sondern nur die Flags und Protokollfelder – doch genau diese Details definieren die Bedeutung des Pakets und wie das Ziel es interpretieren wird.
Ähnlich wie beim ICMP-Paket erfordert ein TCP-Paket eine zugrunde liegende IP-Schicht. Darauf setzen Sie eine TCP-Schicht, in der Sie den Zielport und die TCP-Flags angeben können. Das Flag S steht für SYN (Synchronize).
Wenn Sie sich noch in derselben nano-Sitzung befinden, setzen Sie die Bearbeitung von packet_crafter.py fort. Andernfalls öffnen Sie die Datei erneut:
nano packet_crafter.py
Fügen Sie den folgenden Code zu Ihrem Skript hinzu. Wir verwenden die ip_layer aus dem vorherigen Schritt wieder und stapeln eine neue TCP-Schicht darauf, die auf Port 80 (HTTP) zielt.
## Create a TCP layer targeting port 80 with the SYN flag
tcp_layer = TCP(dport=80, flags="S")
## Stack the IP and TCP layers
tcp_packet = ip_layer / tcp_layer
print("\n--- TCP SYN Packet Structure ---")
tcp_packet.show()
Speichern Sie die Datei mit Ctrl+O und Enter. Beenden Sie mit Ctrl+X nur, wenn Sie das Skript vom Terminal ausführen möchten, oder bearbeiten Sie es weiter und fahren Sie mit dem letzten Schritt fort.
Führen Sie das Skript erneut aus, um die Struktur Ihres neuen TCP SYN-Pakets zu untersuchen.
sudo python3 packet_crafter.py
Die Ausgabe enthält nun die Details der TCP-Schicht und zeigt, dass der Zielport auf http (Port 80) und die Flags auf S gesetzt sind.
--- TCP SYN Packet Structure ---
###[ IP ]###
version = 4
ihl = None
tos = 0x0
len = None
id = 1
flags =
frag = 0
ttl = 64
proto = tcp
chksum = None
src = 10.0.2.15
dst = 8.8.8.8
\options \
###[ TCP ]###
sport = ftp_data
dport = http
seq = 0
ack = 0
dataofs = None
reserved = 0
flags = S
window = 8192
chksum = None
urgptr = 0
options = []
Die Netzwerkantwort senden und analysieren
In diesem letzten Schritt senden Sie das von Ihnen erstellte ICMP-Paket über das Netzwerk und erfassen die Antwort.
Das Senden des Pakets vervollständigt das mentale Modell: Schichten definieren, Paket bauen, übertragen und dann die Antwort interpretieren. Dies ist derselbe grundlegende Ablauf, der hinter vielen benutzerdefinierten Netzwerk-Testwerkzeugen steckt.
Scapy bietet verschiedene Funktionen zum Senden von Paketen. Die Funktion sr1() ist besonders nützlich, da sie ein Paket sendet und auf die erste Antwort wartet, die sie empfängt. Das "s" steht für send (senden), "r" für receive (empfangen) und "1" für ein Paket.
Wenn Sie die Datei geöffnet gelassen haben, setzen Sie die Bearbeitung fort. Andernfalls öffnen Sie packet_crafter.py erneut:
nano packet_crafter.py
Fügen Sie den folgenden Code hinzu, um das icmp_packet zu senden und die Antwort zu analysieren. Wir fügen einen timeout-Parameter hinzu, damit das Skript nicht unendlich lange hängen bleibt, falls das Paket verworfen oder blockiert wird.
print("\n--- Sending ICMP Packet ---")
## Send the packet and wait for 1 response, with a timeout of 2 seconds
## verbose=0 hides the default Scapy sending output for cleaner results
response = sr1(icmp_packet, timeout=2, verbose=0)
if response:
print(f"Response received from: {response[IP].src}")
print("\n--- Response Packet Structure ---")
response.show()
else:
print("No response received. The packet might have been dropped.")
Speichern Sie die Datei und beenden Sie den Editor.
Führen Sie Ihr Skript aus, um das Paket ins Internet zu senden und auf die Antwort des DNS-Servers von Google zu warten.
sudo python3 packet_crafter.py
Wenn das Netzwerk die ICMP-Anfrage zulässt, sehen Sie die Struktur des Antwortpakets. Beachten Sie, dass der ICMP-Typ in der Antwort echo-reply lautet.
--- Sending ICMP Packet ---
Response received from: 8.8.8.8
--- Response Packet Structure ---
###[ IP ]###
version = 4
ihl = 5
tos = 0x0
len = 28
id = 0
flags =
frag = 0
ttl = 114
proto = icmp
chksum = 0x67d8
src = 8.8.8.8
dst = 10.0.2.15
\options \
###[ ICMP ]###
type = echo-reply
code = 0
chksum = 0xffff
id = 0x0
seq = 0x0
unused = ''
###[ Padding ]###
load = '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
Zusammenfassung
Sie haben gelernt, wie man ein Python-Skript mit Scapy einrichtet, ICMP- und TCP-Pakete manuell Schicht für Schicht mit dem Operator / erstellt und diese Pakete über das Netzwerk sendet, um die rohen Antworten zu analysieren. Dieses grundlegende Wissen ist entscheidend, um die Funktionsweise von Netzwerkprotokollen zu verstehen, Sicherheitsbewertungen durchzuführen und benutzerdefinierte Netzwerkanalyse-Tools zu entwickeln.



