[[Vorlage(Getestet, general)]] {{{#!vorlage Wissen [:sudo: Programme als Root ausführen] [:Terminal: Ein Terminal öffnen] }}} [[Inhaltsverzeichnis(1)]] [[Bild(Wiki/Icons/terminal.png, 48, align=left)]] [http://www.tcpdump.org/ tcpdump] {en} 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 [#tcpdumps-mit-Wireshark-analysieren Ende des Artikels] beschrieben. = Installation = Der Sniffer ist bei Ubuntu und den offiziellen Varianten im Paket * '''tcpdump''' enthalten und bereits vorinstalliert. = Benutzung = {{{#!vorlage Hinweis Das Programm muss unter Linux mit Root-Rechten [1] ausgeführt werden bzw. das [:Rechte#Sonderrechte:Setuid-Bit] gesetzt sein, damit es Pakete mitschneiden kann. Man kann das damit einhergehende Sicherheitsrisiko aber dadurch senken, dass man das [#Flags 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: {{{#!vorlage 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:Man-Page] von tcpdump finden. {{{#!vorlage Tabelle 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 [:Benutzer_und_Gruppen#Benutzer:Benutzerkonto] (UID) von `root` auf den angegebenen Benutzer und die [:Benutzer_und_Gruppen#Gruppen: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 [:Rechte#Sonderrechte:Setuid-Bit] einhergehende Sicherheitsrisiko senken. [[BR]] 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: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.. {{{#!vorlage Tabelle 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 [wikipedia:Classless_Inter-Domain_Routing: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: {{{#!vorlage Befehl sudo tcpdump -D }}} * Schneidet die ersten 68 Bytes von sämtlichen Paketen mit, die die Netzwerkschnittstelle `wlan0` passieren: {{{#!vorlage Befehl sudo tcpdump -i wlan0 }}} * Schneidet alle UDP-Pakete mit, welche `10.231.11.7` als Ziel haben: {{{#!vorlage Befehl 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: {{{#!vorlage Befehl 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: {{{#!vorlage Befehl 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: {{{#!vorlage Befehl sudo tcpdump -i wlan0 -q udp port 53 }}} * Schneidet sowohl HTTP-, als auch HTTPS-Pakete mit: {{{#!vorlage Befehl 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: {{{#!vorlage Befehl 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: {{{#!vorlage Befehl 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 [http://wiki.wireshark.org/CaptureSetup/CapturePrivileges 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 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 [#Flags weiter oben] im Artikel. == Beispiel == Mit {{{#!vorlage Befehl 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. = Links = * [:Netzwerk-Monitoring:] {Übersicht} Programmübersicht * [http://www.tcpdump.org/tcpdump_man.html Man-Pages] {en} - Man-Pages von tcpdump * [http://www.manpagez.com/man/7/pcap-filter/ Man-Pages] {en} - Man-Pages von pcap-filter * [http://dmiessler.com/study/tcpdump/ tcpdump Primer] {en} - ein Howto und einige sehr gute Rezepte zu tcpdump * [:Netzwerk:] {Übersicht} Übersichtsartikel #tag: Netzwerk, Internet, Sicherheit, Shell