ubuntuusers.de

Hinweis: Dies ist ein statischer Snapshot unseres Wikis vom 25. März 2013 und kann daher nicht bearbeitet werden. Der aktuelle Artikel ist unter wiki.ubuntuusers.de zu finden.

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:

tcpdump {en} ist ein sehr bekannter und weitverbreiteter Paket-Sniffer für die Konsole. 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 andere, wie UDP- und ICMP-Pakete mitschneiden.

Auch wenn tcpdump ein Konsolen-Programm ist, ist es trotzdem möglich, die mitgeschnittenen Pakete nicht nur auf der Konsole, sondern auch 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 kann über das Paket:

  • tcpdump

installiert [1] werden.

Benutzung

Hinweis:

tcpdump muss unter Linux als root [3] ausgeführt werden bzw. das setuid-Bit gesetzt sein, damit es Pakete mitschneiden kann.

Tcpdump wird in der Konsole [2] mit dem Befehl:

tcpdump [flags] [filter-options] 

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.

FlagBedeutung
-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 Damit sagt man tcpdump welches Interface gesnifft werden soll. Wenn dies nicht angegeben wird, sucht sich tcpdump eines aus. Dies ist meist die erste LAN-Karte, die es findet.
-n tcpdump soll 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 soviele Pakete mitgeschnitten hat, wie angegeben.
-e tcpdump soll auch den Ethernet-Header mitschneiden.
-q tcpdump 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 68 Bytes. Will man die Pakete komplett mitschneiden, sollte man 0 angeben. 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.
-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 der -r Flag parsen.
-r DATEINAHME 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..

OptionWerteBedeutung
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 die -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 von welchem 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 als root [3] ausgeführt werden müssen.

tcpdump -D  

Gibt die Netzwerkinterfaces aus, welche tcpdump sniffen kann.

tcpdump -i wlan0 

Schneidet die ersten 68 Bytes von sämtlichen Paketen mit, die das Netzwerkinterface wlan0 passieren.

tcpdump -i wlan0 udp and dst 10.231.11.7 

Schneidet alle UDP-Pakete mit, welche 10.231.11.7 als Ziel haben.

tcpdump -i wlan0 -A -s 0 port 80 and src ubuntuusers.de 

Schneidet alle ein- und ausgehenden HTTP-Pakete, welche ubuntuusers.de als Quelle haben, komplett mit und gibt das Gganze 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. Also "src ubuntuusers.de" hat die gleiche Bedeutung wie "src host ubuntuusers.de". Die Identifier "net", "port" und "portrange" müssen indes immer explizit deklariert werden.

tcpdump -i wlan0 -A -s 0 src portrange 20-80 

Schneidet alle auf den Ports 20 bis 80 eingehenden Pakete komplett mit und gibt den Inhalt als ASCII aus.

tcpdump -i wlan0 -q udp port 53 

Schneidet DNS-Requests und deren Antworten mit. Die Ausgabe ist dabei auf minimal gestellt.

tcpdump -i wlan0 -q '(tcp port 80) or (tcp port 443)' 

Schneidet sowohl HTTP-, als auch HTTPS-Pakete mit.

tcpdump -i wlan0 -q -w output.dump '(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.

tcpdump -r output.dump 

Parst die im vorangegangenen Beispiel erzeugte Datei output.dump und gibt den Inhalt formatiert auf dem Bildschirm aus.

tcpdumps mit Wireshark analysieren

Die Ausgabe von tcpdump lässt sich auch in dem grafischen Tool 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 {en}.

Deswegen ist es sinnvoll das kleinere und in der Vergangenheit sicherere tcpdump zum Sniffen zu benutzen und Wireshark nur zum grafischen Analysieren, wenn nötig, 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 raw-Daten 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 gepiped werden

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

Beispiel

Mit

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.

ubuntuusers.local › Wikitcpdump