scapy - Interaktiv Netzwerkpakete manipulieren

Scapy ist ein umfangreiches in Python geschriebenes Tool zur Erzeugung, zum Empfang und zur Manipulation von Netzwerkpaketen.

Bei scapy allein handelt es sich grundlegend erst einmal um eine Bibliothek für Python mit der Netzwerkpakete erzeugt und dekodiert werden können. Mit Hilfe weiterer Tools können jedoch auch Pakete direkt versendet und empfangen werden. Unter Linux/*nix Systemen kommt für das Aufzeichnen von Paketen zum Beispiel libpcap zum Einsatz. Nach dem Aufzeichnen gibt es weitere Anbindungen an Gnuplot, Graphviz, LaTeX und weitere um die aufgezeichneten Pakete zu visualisieren.

Installation

Es gibt mehrere Wege um scapy zu installieren. Einsteiger sollten mindestens die grundlegenden Bibliotheken und Tools installieren. Dies erlaubt es interaktiv mit scapy Pakete zu erzeugen zu analysieren. Die Installation sieht dann wie folgt aus.

$ pip install --pre 'scapy[basic]'

Wer alles ausprobieren möchte, der kann auch gleich alle optionalen Abhängigkeiten installieren.

$ pip install --pre 'scapy[complete]'

Verwendung

Scapy kann wie folgt gestartet werden. Zu beachten ist, dass es durch das Tool sudo mit erweiterten Rechten gestartet wird. Dies ist in vielen Fällen sinnvoll, da zum Beispiel für die Erzeugung von speziellen Paketen und für die Aufzeichnung die Berechtigungen eines Nutzers mit Standardberechtigungen nicht ausreichen.

$ sudo scapy

Im folgenden Beispiel wird durch die Funktion sr1() ein Pakete versendet und ein Pakete empfangen und von der Funktion zurückgegeben. Als Argument wird der Funktion ein IP-Paket mit der Payload eines ICMP-Paketes übergeben. Kurz gesagt, es wird ein Ping Paket versendet, wie es zum Beispiel auch das Tool ping macht. Das Antwort Paket wird in der Variable a gespeichert und anschließend ausgegeben. Selbstverständlich kann auch auf jeden der angezeigten Werte einzeln zugegriffen werden.

>>> a = sr1(IP(dst='8.8.8.8')/ICMP(), timeout=10)                                                                                                                                             
Begin emission:
.Finished sending 1 packets.
*
Received 2 packets, got 1 answers, remaining 0 packets
>>> a.show()                                                                                                                                                                                  
###[ IP ]### 
  version= 4
  ihl= 5
  tos= 0x0
  len= 28
  id= 6230
  flags= 
  frag= 0
  ttl= 54
  proto= icmp
  chksum= 0x506d
  src= 8.8.8.8
  dst= 10.0.2.15
  \options\
###[ ICMP ]### 
     type= echo-reply
     code= 0
     chksum= 0xffff
     id= 0x0
     seq= 0x0
###[ Padding ]### 
        load= '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

Abfrage der TTL des Antwort Paketes.

>>> a.ttl                         
54

Scapy kann den Inhalt eines Paketes auch als PDF- oder PS-Datei ausgeben. Dabei wird hervorgehoben welcher Wert in einem Paket wie extrahiert wurde und zu welchem Ergebnis dies führte.

>>> a.pdfdump(filename="/tmp/test.pdf")

Fazit

Vor ein paar Jahren hatte ich das Projekt aus den Augen verloren, weil es keine signifikanten Weiterenticklungen mehr gab. So basierten viele meiner Projekte bereits auf Python 3, jedoch kam der Python 3 Support bei scapy erst mit dem Release 2.4 im Jahr 2018.

Nach meiner Einschätzung ist es ein sehr gutes und nützliches Werkzeug und kann zum Beispiel zum Testen von Anwendungen verwendet werden. Auch für die, die tiefer in das Thema Netzwerk und den Protokollstack einsteigen wollen ist es sehr nützlich, weil hier die einzelnen Pakete und die Eigenschaften zerlegt, manipuliert und deren Auswirkung nachvollzogen werden können.

Wichtig: Es sollte beachten werden, dass das Tool am besten in einer Testumgebung zum Einsatz kommt, um eventuelle Auswirkungen auf produktive Systeme zu vermeiden.

Links

Verwandte Artikel