ubuntuusers.de

tcpdump

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Dieser Artikel ist größtenteils für alle Ubuntu-Versionen gültig.

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

Wiki/Icons/terminal.png tcpdump 🇬🇧 ist ein bekannter und weit verbreiteter Paket-Sniffer für die Kommandozeile. Es ist für so gut wie jedes Unix-artige Betriebssystem erhältlich und kann im Gegensatz zu seinem Namen nicht nur TCP-Pakete, sondern auch UDP- und ICMP-Pakete mitschneiden.

Auch wenn tcpdump ein Kommandozeilen-Programm ist, ist es möglich, die mitgeschnittenen Pakete alternativ in der grafischen Oberfläche von Wireshark zu analysieren. Wie man mit tcpdump erzeugte Mitschnitte in Wireshark öffnen kann, ist am Ende des Artikels beschrieben.

Installation

Der Sniffer ist bei Ubuntu und den offiziellen Varianten im Paket

  • tcpdump

enthalten und bereits vorinstalliert.

Benutzung

Hinweis:

Das Programm muss unter Linux mit Root-Rechten [1] ausgeführt werden bzw. das Setuid-Bit gesetzt sein, damit es Pakete mitschneiden kann. Man kann das damit einhergehende Sicherheitsrisiko aber dadurch senken, dass man das Flag -Z mitsamt eines Benutzers mit eingeschränkten Rechten – also z.B. den gerade angemeldeten (entweder mit ausgeschriebenem Namen oder als $USER) – angibt.

Tcpdump wird in einem Terminal [2] mit dem Befehl:

tcpdump [FLAGS] [FILTER-OPTIONEN] 

gestartet. Im Folgenden werden die nützlichsten und meist gebrauchten Flags und Filteroptionen erläutert.

Flags

Alle Flags sind optional, man muss also keine angeben. Meist will man jedoch zumindest das Interface angeben, wenn tcpdump nicht automatisch das richtige auswählt. Außerdem kann man mit Flags unter anderem festlegen, wie viele Pakete und wie viele Daten jeweils von den Paketen mitgeschnitten werden sollen und in was für einer Art und Weise die Ausgabe erfolgen soll. Eine vollständige Liste kann man in der Man-Page von tcpdump finden.

Flags von tcpdump
Flag Bedeutung
-D Schreibt eine Liste aller Netzwerkinterfaces auf den Bildschirm, welche tcpdump sniffen kann. Wenn diese Flag benutzt wird, werden alle anderen Flags und Filteroptionen ignoriert.
-i INTERFACE welche Netzwerkschnittstelle gesnifft werden soll. Wenn dies nicht angegeben wird, sucht sich tcpdump eine aus. Dies ist meist die erste LAN-Karte, die es findet.
-n keine Hostnamen auflösen, genauso wenig sollen Portnummern durch ihre Dienste ersetzt werden.
-c ANZAHL Wenn diese Flag benutzt wird, beendet sich tcpdump automatisch, nachdem es die angegebene Anzahl Pakete mitgeschnitten hat, wie angegeben.
-e auch den Ethernet-Header mitschneiden.
-q loggt weniger Protokoll-Informationen. Die Ausgabe wird also kleiner.
-v,-vv oder -vvv Je mehr v's angegeben sind, desto mehr Informationen über Pakete wird tcpdump speichern.
-S Schreibt die absoluten anstelle von relativen Sequenznummern der Pakete.
-A Gibt den Inhalt eines Paketes als ASCII aus.
-x oder -xx Gibt den Inhalt eines Paketes als Hex aus. Mit einem x wird der Ethernet-Header ignoriert, mit zwei x nicht.
-X oder -XX Gibt den Inhalt eines Paketes sowohl als Hex wie auch als ASCII aus. Mit einem X wird der Ethernet-Header ignoriert, mit zwei X nicht.
-s ANZAHL Wieviele Bytes je Paket mitgeschnitten werden sollen. Standardmäßig sind dies 65535. Dabei gilt es jedoch zu bedenken, dass dadurch die Warteschlange voll werden kann und dies in bestimmten Situationen eventuell zum Verlust von Paketen führen kann. Man sollte am besten also nur soviel von Paketen mitschneiden, wie man benötigt. Die Angabe -s 0 setzt die Paketmitschnitt-Länge aus Gründen der Abwärtskompatibilität zu älteren Versionen von tcpdump auf den Standardwert von 65535 Bytes.
-Z BENUTZER Nachdem die zu sniffende Netzwerkschnittstelle bzw. die mit dem -r Flag zu parsende Datei geöffnet worden ist, jedoch bevor irgendeine Ausgabe(datei) gestartet bzw. geöffnet worden ist, wird das Benutzerkonto (UID) von root auf den angegebenen Benutzer und die Gruppe (GID) von root auf die Hauptgruppe des angegebenen Benutzers geändert. Man kann damit also das durch die Ausführung mit Root-Rechten [1] bzw. das gesetzte Setuid-Bit einhergehende Sicherheitsrisiko senken.
Den gerade angemeldeten Benutzer gibt man entweder mit ausgeschriebenem Namen oder aber allgemein als $USER an.
-w DATEINAME Schreibt die Pakete in die angegebene Datei, anstatt sie zu parsen und den Inhalt formatiert auf dem Bildschirm auszugeben. Die Pakete, die in die Datei geschrieben wurden, sind wie bereits gesagt unformatiert, also raw-packets. Man kann sie deswegen nicht mit cat oder less lesen. Jedoch kann man sie mit dem -r Flag parsen.
-r DATEINAME Parst, formatiert und gibt die Pakete, die mit der -w Flag in eine Datei geschrieben wurden, in der Konsole aus.

Filteroptionen

Eine vollständige Liste kann man in der Man-Page von pcap-filter finden. Eine Filter-Direktive besteht grundsätzlich aus einem Wert und einer oder mehreren Optionen, die diesem Wert vorangestellt sind. Wenn keine Optionen angegeben sind, wird immer alles mitgeschnitten. Wurde also kein Host angegeben, werden Pakete von allen Hosts mitgeschnitten, wenn kein Port angegeben wird, die Pakete von allen Ports, usw..

Filteroptionen von tcpdump
Option Werte Bedeutung
host IP-Adresse (oder auch Hostname) Es werden nur Pakete mitgeschnitten, die entweder als Quelle oder als Ziel die angegebene IP-Adresse besitzen. Anstelle einer IP-Adresse kann auch ein Hostname angegeben werden (aber nur, wenn nicht das -n Flag (s.o.) benutzt wird).
net Netzwerk-Bereich in CIDR-Schreibweise Es werden nur Pakete mitgeschnitten, die entweder als Quelle oder als Ziel eine IP-Adresse aus dem angegebenen Netzwerkbereich besitzen
port eine Zahl von 0 bis 65535 Schneidet Pakete mit, die entweder auf Quell- oder auf Ziel-Seite den angegebenen Port besitzen
portrange 0-65535 Schneidet Pakete mit, die entweder auf Quell- oder auf Ziel-Seite einen Port in dem angegebenen Portbereich besitzen
src host, net, port oder portrange Es werden nur Pakete mitgeschnitten, die als Quelle den angegebenen Wert besitzen
dst host, net, port oder portrange Es werden nur Pakete mitgeschnitten, die als Ziel den angegebenen Wert besitzen
proto ether, fddi, tr, wlan, ip, ip6, arp, rarp, decnet, tcp und udp Netzwerkprotokoll, in dem Pakete mitgeschnitten werden sollen

Mehrere Filterangaben können mit den Ausdrücken and (alternativ ist auch && möglich), or (alternativ ist auch || möglich) und not (alternativ ist auch ! möglich) miteinander verknüpft werden. Dabei können dann auch runde Klammern, also ( und ) verwendet werden, um Ausdrücke voneinander abzugrenzen. Dabei sollte jedoch beachtet werden, dass manche Dinge wie das Ausrufezeichen oder die Klammern unter Umständen von der Shell interpretiert werden könnten. Um dies zu verhindern, muss man Hochkommata herum setzen, wie unten bei einem Beispiel gezeigt.

Beispiele

Hier nun einige Beispiele, die die Benutzung von tcpdump besser verdeutlichen sollen. Es sei nochmals daran erinnert, dass die Befehle immer mit Root-Rechten [1] ausgeführt werden müssen.

  • Gibt die Netzwerkschnittstellen aus, welche tcpdump sniffen kann:

    sudo tcpdump -D  
  • Schneidet die ersten 68 Bytes von sämtlichen Paketen mit, die die Netzwerkschnittstelle wlan0 passieren:

    sudo tcpdump -i wlan0 
  • Schneidet alle UDP-Pakete mit, welche 10.231.11.7 als Ziel haben:

    sudo tcpdump -i wlan0 udp and dst 10.231.11.7 
  • Schneidet alle ein- und ausgehenden HTTP-Pakete, welche ubuntuusers.de als Quelle haben, mit dem Standardwert von 65535 Bytes je Paket mit und gibt das Ganze als ASCII aus. Wie man an diesem Beispiel sieht, kann man hinter src und dst den Identifier weglassen, wenn es sich um den Typ host handelt. src ubuntuusers.de hat die gleiche Bedeutung wie src host ubuntuusers.de. Die Identifier net, port und portrange müssen dagegen immer explizit deklariert werden:

    sudo tcpdump -i wlan0 -A -s 0 port 80 and src ubuntuusers.de 
  • Schneidet alle auf den Ports 20 bis 80 eingehenden Pakete mit dem Standardwert von 65535 Bytes je Paket mit und gibt den Inhalt als ASCII aus, außerdem wird aus Sicherheitsgründen das Benutzerkonto (UID) von root auf den Benutzer gustav und die Gruppe (GID) von root auf die Hauptgruppe des Benutzers gustav geändert:

    sudo tcpdump -i wlan0 -A -s 0 -Z gustav src portrange 20-80 
  • Schneidet DNS-Requests und deren Antworten mit. Die Ausgabe ist dabei auf minimal gestellt:

    sudo tcpdump -i wlan0 -q udp port 53 
  • Schneidet sowohl HTTP-, als auch HTTPS-Pakete mit:

    sudo tcpdump -i wlan0 -q '(tcp port 80) or (tcp port 443)' 
  • Macht das Gleiche wie das Beispiel zuvor, nur werden die Pakete nicht formatiert auf dem Bildschirm ausgegeben, sondern raw in die Datei output.dump geschrieben:

    sudo tcpdump -i wlan0 -q -w output.dump '(tcp port 80) or (tcp port 443)' 
  • Parst die im vorangegangenen Beispiel erzeugte Datei output.dump und gibt den Inhalt formatiert auf dem Bildschirm aus:

    sudo tcpdump -r output.dump 

tcpdumps mit Wireshark analysieren

Die Ausgabe von tcpdump lässt sich auch in dem grafischen Werkzeug Wireshark analysieren. Man kann mit Wireshark selbstverständlich auch selbst Pakete mitschneiden, wovon unter Linux jedoch strengstens abzuraten ist. Wireshark besitzt mehr als eine Million Zeilen Code und besaß in der Vergangenheit zahlreiche Sicherheitslücken. Die Integrität ist deswegen nicht zu garantieren und jemand könnte mit manipulierten Datenströmen Wireshark kompromittieren und dann Code mit Root-Rechten auf dem System des Wireshark-Nutzers ausführen. Mehr dazu im Wireshark-Wiki 🇬🇧.

Deswegen ist es sinnvoll das kleinere und in der Vergangenheit sicherere tcpdump zum Sniffen zu benutzen und Wireshark nur zum grafischen Analysieren zu verwenden. Somit muss nur tcpdump als root ausgeführt werden, Wireshark hingegen kann mit normalen Benutzer-Rechten ausgeführt werden.

Bei der Benutzung von tcpdump gibt es dabei zwei Dinge zu beachten:

  • man muss tcpdump mit -s 0 ausführen, damit komplette Pakete mitgeschnitten werden

  • Wireshark analysiert die Rohdaten von tcpdump, also die Ausgabe muss mit -w DATEINAME in eine Datei geschrieben werden und nicht zum Beispiel die Bildschirmausgabe von tcpdump in eine Datei umgeleitet (gepiped) werden

Mehr zu diesen beiden Flags findet man weiter oben im Artikel.

Beispiel

Mit

sudo tcpdump -i wlan0 -s 0 -w output.dump tcp port 80 

schneidet man alle HTTP-Pakete mit und schreibt sie in die Datei output.dump. Diese Datei kann man nun in Wireshark über "File → Open..." öffnen und analysieren.

Diese Revision wurde am 23. Dezember 2015 10:58 von linux_joy erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Sicherheit, Internet, Shell, Netzwerk