Kagenmi - stock.adobe.com

Netzwerkanalyse mit Scapy und Python

Im Bereich der Computersicherheit spielen das Scannen von Netzwerken sowie das Simulieren von Angriffen für das Pentesting eine wichtige Rolle. Scapy ist ein mächtiges Tool dafür.

Scapy ist ein ideales Tool, um zum Beispiel gemeinsam mit Nmap, Metasploit oder Wireshark Netzwerke zu untersuchen, Schwachstellen zu finden, Pentests durchzuführen und Netzwerkpakete zu ändern.

Das in Python geschriebene Tool ist bereits seit über 20 Jahren in diesem Bereich etabliert, lässt sich umfangreich erweitern und Python-erfahrene Admins können sich sogar eigene Skripte damit schreiben, mit denen sich komplette Netzwerke scannen lassen. Durch diesen großen Umfang und weitreichende Möglichkeiten ist Scapy auch Bestandteil von Kali Linux, lässt sich aber unproblematisch auch auf anderen Linux-Systemen installieren. Der Einsatz unter Windows ist ebenfalls möglich. Dazu wird nur Python für Windows benötigt und anschließend die Integration von Scapy mit pip install scapy2.

Ein großer Vorteil von Scapy besteht darin, dass die Befehle direkt in der Scapy-CLI im Terminal eingegeben werden können, sich aber auch als Python-Skript nutzten lassen. Admins können daher im Terminal Netzwerke untersuchen oder sich auch kleine oder größere Python-Skripte mit Scapy schreiben.

Scapy in der Praxis

Zum Starten unter Kali Linux reicht die Eingabe von scapy im Terminal. Scapy ist dabei auch in der Lage Netzwerkverkehr mitzuschneiden und als PCAP-Datei zu speichern. Analysieren lassen sich diese Dateien anschließend zum Beispiel mit Wireshark. Scapy lässt sich in Python-Installationen auch mit pip install scapy installieren. Dadurch steht die Erweiterung für Python-Skripte auf allen Rechnern zur Verfügung, auf denen auch Python installiert ist.

Starten der Scapy-CLI über das Terminal in Kali Linux.
Abbildung 1: Starten der Scapy-CLI über das Terminal in Kali Linux.

Nach der Eingabe des Befehls scapy startet die Scapy-CLI, in der sich bereits Scans von Netzwerken starten lassen. Um die ersten zehn Netzwerkpakete zu sniffen, reicht in der Scapy-CLI die Eingabe des Befehls „sniff(count=10)“. Anschließend zeigt Scapy eine Zusammenfassung der Protokolle an, mit denen diese zehn Pakete versendet wurden. Sollen dabei nur Pakete von bestimmten Protokollen erfasst werden, zum Beispiel UDP, geht das mit sniff(filter=“UDP“, Count=10) Mit clear lässt sich bei Bedarf der Inhalt des Bildschirms löschen.

Pakete sniffen und in PCAP-Datei zur Analys speichern

Mit Scapy lässt sich das Netzwerk scannen und das Ergebnis in einer PCAP-Datei speichern. Den Inhalt der Pakete können Sie anschließend ebenfalls mit Scapy analysieren, aber auch mit anderen Tools, die PCAP-Dateien öffnen können, zum Beispiel WireShark. Dazu werden in der Scapy-CLI oder im Python-Script erst die notwendigen Befehle über deren Python-Funktion geladen, zum Beispiel mit:

from scapy.all import sniff, wrpcap

Sinnvoll ist es darüber hinaus, das Arbeitsverzeichnis der Scapy-CLI anzupassen. Hier speichert Scapy die Scanergebnisse. Das aktuelle Verzeichnis lässt sich mit print(os.getcwd()) anzeigen. Ändern kann man das Verzeichnis mit os.chdir(„<Pfad>“) Um jetzt zum Beispiel die ersten 100 Pakete zu speichern, können Sie diese auch als Variable speichern, zum Beispiel mit:

pakete = sniff(count=100)

Die Pakete lassen sich anschließend über ihre Variable pakete in einer PCAP-Datei speichern, zum Beispiel mit:

wrpcap(„netscan.pcap“, pakete)

Die Datei kann zur Analyse zum Beispiel mit Wireshark geöffnet werden. Alternativ lassen sich die Daten aber auch in Scapy anzeigen. Dazu lädt man wieder die notwendige Funktion:

from scapy.all import rdpcap

Die Inhalte einer PCAP-Datei lassen sich ebenfalls in einer Variablen speichern. Auf Basis dieser Variablen erfolgt die Anzeige der Pakete:

pakete = rdpcap(„netscan.pcap“)

for pkt in pakete: pkt.show()

Auslesen von Netzwerkpaketen mit Scapy.
Abbildung 2: Auslesen von Netzwerkpaketen mit Scapy.

Das Ganze lässt sich auch abkürzen, indem die Pakete erfasst, als Variable gespeichert und danach gleich ausgegeben werden. Auch das kann man mit einem Python-Skript erreichen oder durch die einzelnen Befehle:

from scapy.all import sniff, wrpcap, rdpcap

pakete = sniff(count=100)

for pkt in pakete: pkt.show()

Spezifische Pakete mitschneiden und Interfaces auslesen

Scapy ist in der Lage Pakete einzelner Netzwerkschnittstellen auszulesen. Für das Auslesen der Schnittstellen steht eine eigene Funktion zur Verfügung, die zunächst geladen werden muss:

from scapy.all import show_interfaces

Danach können Sie die zur Verfügung stehenden Interfaces mit dem Aufruf des folgenden Befehls anzeigen lassen:

show_interfaces()

Auf Basis dieser Informationen ist es möglich, mit Scapy noch genauer zu filtern. Neben dem Protokoll lässt sich daher auch die Netzwerkschnittstelle filtern. Um zum Beispiel von der Schnittstelle eth0 die ersten 200 Pakete zu erfassen, verwenden Sie folgenden Befehl:

sniff(iface=“eth0“, count=200)

Die erfassten Pakete lassen sich auf die gleiche Weise als Variable speichern und analysieren wie weiter oben gezeigt. So können Sie auch einen Filter auf Basis der IP-Adresse setzen, der die Quell-IP-Adresse filtert:

sniff(iface="eth0", filter="ip src 10.0.0.1")

Dieser Filter lässt sich wiederum mit den anderen bisher gezeigten Filtern kombinieren. Diese werden kommagetrennt mit Sniff gestartet. Ein weiterer Filter wäre Protokoll und Port in Kombination:

sniff(iface="eth0", filter="tcp and port 80")

Paketerstellung und -versand mit Scapy

Mit Scapy können außerdem Pakete unterschiedlicher Protokolle erstellt und ins Netzwerk gesendet werden. Das ist nützlich für Tests, Netzwerkanalysen oder Sicherheitsüberprüfungen. Um zum Beispiel ein einfaches ICMP-Echo-Request (Ping) zu erstellen, nutzen Sie folgende Befehle:

from scapy.all import IP, ICMP, send

paket = IP(dst="192.168.1.1")/ICMP()

send(paket)

Dieses Beispiel erstellt ein ICMP-Echo-Request-Paket an die Ziel-IP-Adresse 192.168.1.1 und sendet es. Darüber hinaus können Sie hier auch bestimmte Ports zum Senden verwenden:

from scapy.all import IP, TCP, send

paket = IP(dst="192.168.1.1")/TCP(dport=80)

send(paket)

Hier wird ein TCP-Paket zum Port 80 der Ziel-IP-Adresse 192.168.1.1 erstellt und gesendet. Interessant ist in diesem Bereich auch, dass Scapy ARP-Requests erstellen und versenden kann. Ein Befehl dazu sieht so aus:

from scapy.all import ARP, Ether, sendp

Danach erfolgt das Erstellen eines ARP-Request-Pakets, das anschließend gleich versnedet wird:

arp_request = Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst="192.168.1.1")

sendp(arp_request)

Dieses Beispiel sendet einen ARP-Request an das gesamte Netzwerk, um die MAC-Adresse des Geräts mit der IP-Adresse 192.168.1.1 zu erfragen. Eine weitere Möglichkeit ist das Erstellen und Versenden eines SYN-Flood-Pakets:

from scapy.all import IP, TCP, send

syn_flood_packet = IP(dst="192.168.1.1")/TCP(dport=80, flags="S")

for _ in range(100): send(syn_flood_packet)

Dieses Beispiel zeigt, wie ein TCP-SYN-Flood-Angriff auf den Port 80 der Ziel-IP-Adresse 192.168.1.1 durchgeführt werden könnte. Das darf natürlich nur im eigenen Netzwerk erfolgen. Ein weiteres Beispiel ist das Erstellen und Versenden eines DNS-Query-Pakets:

from scapy.all import IP, UDP, DNS, DNSQR, send

dns_query = IP(dst="8.8.8.8")/UDP(dport=53)/DNS(rd=1, qd=DNSQR(qname="www.beispiel.com"))

send(dns_query)

In diesem Beispiel wird ein DNS-Query für die Domain www.beispiel.com an einen DNS-Server (hier Google-DNS 8.8.8.8) gesendet. Jedes dieser Beispiele zeigt die Anpassungsfähigkeit von Scapy bei der Erstellung und dem Versand von Netzwerkpaketen, die auf spezifische Anforderungen zugeschnitten sind. Administratoren können diese Techniken nutzen, um Netzwerke zu testen, zu analysieren oder Sicherheitsmaßnahmen zu bewerten.

Erfahren Sie mehr über Netzwerk-Monitoring und -Analyse