Tcpdump grundlagen: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
Zeile 1: Zeile 1:
 +
=Optionenübersicht=
  
−
 
+
{| class="wikitable"
−
=Benutzung=
+
! Option !! Beschreibung !! Beispiel
−
 
 
−
Standartmäßig fängt tcpdump alle Pakete ab die von der niedrigst nummerierten Netzwerkschnittstelle irgendwohin gehen oder empfangen werden mit einer maximalgröße von 96 bytes bis man es mit STRG+C abbricht:
 
−
 
 
−
root@zero:~# tcpdump
 
−
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
 
−
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
 
−
12:05:16.338867 IP zero.alpha.quadrant.48309  > rr.esams.wikimedia.org.www: P 1:463(462) ack 1 win 92 <nop,nop,timestamp 45865445 47813930>
 
−
12:05:16.361841 IP rr.esams.wikimedia.org.www > zero.alpha.quadrant.48309: . ack 463 win 14 <nop,nop,timestamp 47813933 45865445>
 
−
 
 
−
Da tcpdump viel zuviele Pakete aufzeichnet um in Echtzeit etwas damit anfangen zu können muss man es über Optionen steuern.
 
−
 
 
−
==Standartoptionen==
 
−
 
 
−
Einige der Optionen die sich mit jeder Benutzung von tcpdump als hilfreich erweisen sind:
 
−
 
 
−
{| Border=1 Cellpadding=2
 
−
|'''-s'''
 
−
|'''s'''ize
 
−
|Legt die Maximale Größe der abgefangenen Pakete fest. Empfohlener Wert is 1500 bytes, das entspricht der maximalen Paketgröße eines IP-Pakets
 
−
|-
 
−
|'''-c'''
 
−
|'''c'''ount
 
−
|Bestimmt die Anzahl an Paketen die abgefangen werden sollen
 
−
|-
 
−
|'''-w'''
 
−
|'''w'''rite
 
−
|Speichert die Ausgabe in einer Datei. Da tcpdump eine Menge Daten abfängt, ist es oft ratsam die Daten in einer Datei unterzubringen
 
−
|-
 
−
|'''-r'''
 
−
|'''r'''ead
 
−
|Liest mit tcpdump erstellte Dateien
 
−
|-
 
−
|'''-n'''
 
−
|'''n'''umeric
 
−
|Versucht nicht IP-Adressen in Hostnamen umzuwandeln, das '''beschleunigt die Ausgaberate erheblich'''
 
−
|-
 
−
|'''-t'''
 
−
|'''t'''ime
 
−
|Entfernt den Zeitstempel am Anfang jedes Pakets. Steigert die Übersichtlichkeit fals man nicht an Zeitstempeln interessiert ist
 
 
|-
 
|-
−
|'''-i'''
+
| -i || Interface angeben || tcpdump -i eth0
−
|'''i'''nterface
+
| -D || Verfügbare Interfaces auflisten || tcpdump -D
−
|Hört das angegebene Interface ab.
+
| -n || Keine DNS-Auflösung (schneller) || tcpdump -n
 +
| -s 0 || Ganze Pakete erfassen || tcpdump -s 0
 +
| -c 100 || Nach 100 Paketen abbrechen || tcpdump -c 100
 +
| -w DATEI || Mitschnitt speichern || tcpdump -w capture.pcap
 +
| -r DATEI || Mitschnitt aus Datei lesen || tcpdump -r capture.pcap
 +
| -A || ASCII-Daten anzeigen || tcpdump -A port 80
 +
| -v / -vv / -vvv || Detailtiefe (Verbose) erhöhen || tcpdump -vvv -i eth0
 +
| -e || Ethernet-Header mit anzeigen || tcpdump -e
 +
| -t || Zeitstempel unterdrücken || tcpdump -t
 
|}
 
|}
  
−
==Beispiele:==
+
=Filterübersicht (BPF Syntax)=
−
 
 
−
Schreiben aller Pakete in eine Datei:
 
−
 
 
−
root@zero:~# tcpdump '''-w''' traffic.cap
 
−
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
 
−
 
 
−
Schreiben von 100 Paketen mit einer maximalen Größe von 1500 byte in eine Datei:
 
  
−
root@zero:~# tcpdump '''-c 100 -s 1500''' -w traffic.cap
+
{| class="wikitable"
−
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 1500 bytes
+
! Filterausdruck !! Beschreibung
−
 
 
−
Lesen der Datei:
 
−
 
 
−
root@zero:~# tcpdump '''-r''' traffic.cap
 
−
reading from file traffic.cap, link-type EN10MB (Ethernet)
 
−
14:02:53.324049 IP zero.alpha.quadrant.48309 > 192.168.255.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST
 
−
14:02:53.597526 IP zero.alpha.quadrant.48309 > 192.168.255.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST
 
−
 
 
−
Gefiltertes Lesen der Datei:
 
−
 
 
−
root@zero:~# tcpdump '''-nt'''r traffic.cap
 
−
reading from file traffic.cap, link-type EN10MB (Ethernet)
 
−
IP 192.168.242.12.43045 > 192.168.255.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST
 
−
IP 192.168.242.12.43045 > 192.168.255.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST
 
−
 
 
−
===Weitere Optionen===
 
−
 
 
−
{| Border=1 Cellpadding=2
 
−
|'''-A'''
 
−
|'''A'''SCII
 
−
|Zeigt die Pakete ohne ihre Header in ASCII an
 
−
|-
 
−
|'''-D'''
 
−
|'''D'''evices
 
−
|Zeigt eine Liste der Netwerkschnittstellen an auf denen tcpdump laufen könnte
 
−
|-
 
−
|'''-e'''
 
−
|'''e'''thernet
 
−
|Zeigt den Ethernet Header jedes Pakets an
 
 
|-
 
|-
−
|'''-i'''
+
| host 192.168.1.100 || Alle Pakete zu/von Host
−
|'''i'''nterface
+
| src host 192.168.1.100 || Nur Pakete vom Host
−
|Tcpdump benutzt das angegebene Interface ( -i eth0 )
+
| dst host 192.168.1.100 || Nur Pakete zum Host
−
|-
+
| port 80 || Pakete mit Port 80 (TCP/UDP)
−
|'''-p'''
+
| src port 443 || Quellport 443
−
|'''p'''romiscuous
+
| dst port 22 || Zielport 22
−
|Tcpdump fängt nur Pakete ab die auch für den Rechner bestimmt sind
+
| net 192.168.1.0/24 || Pakete im Subnetz
−
|-
+
| portrange 1000-2000 || Portbereich
−
|'''-q'''
+
| tcp || Nur TCP-Verkehr
−
|'''q'''uick
+
| udp || Nur UDP-Verkehr
−
|Zeigt weniger Protokoll-Informationen
+
| icmp || Nur ICMP-Verkehr (Ping etc.)
−
|-
+
| and, or, not || Logische Filterverknüpfung
−
|'''-v'''
+
| 'tcp[tcpflags] & tcp-syn != 0' || Nur TCP-SYN-Pakete
−
|'''v'''erbose
+
| 'ip[8] = 128' || Pakete mit TTL = 128
−
|Zeigt mehr Informationen an, steigerbar bis '''-vvv'''
 
 
|}
 
|}
  
−
==Filter==
+
=Beispielbefehle für Analyse mit tcpdump=
−
 
 
−
Da man jetzt immernoch mit allen Pakete die in unserer Netzwerkkarte so ankommen zu kämpfen hat, hat man unter  vielen anderen folgende Filter-Optionen zur Hand:
 
−
 
 
−
==Optionen==
 
−
{| border=1 cellpadding=2
 
−
!Filter
 
−
!Match
 
−
|-
 
−
|host IP
 
−
|IP-Adresse
 
−
|-
 
−
|port PORT
 
−
|Port-Nummer
 
−
|-
 
−
|net NET/CIDR
 
−
|Netz und Netznummer in CIDR Schreibweise
 
−
|-
 
−
|src <nowiki>(host IP|port PORT|net NET/CIDR)</nowiki>
 
−
|Quellen IP-Adresse, Port-Nummer oder Netz
 
−
|-
 
−
|dst <nowiki>(host IP|port PORT|net NET/CIDR)</nowiki>
 
−
|Ziel IP-Adresse,Port-Nummer oder Netz
 
−
|-
 
−
|! oder not
 
−
|Negation
 
−
|-
 
−
|&& oder and
 
−
|Und Verknüpfung
 
−
|-
 
−
|<nowiki>||</nowiki> oder or
 
−
|Oder Verknüpfung
 
−
|}
 
−
 
 
−
===Nach IP-Adressen/Domains filtern===
 
−
 
 
−
Um nach einer bestimmten IP-Adresse oder Domain zu filtern muss man sie mit mit '''host''' angeben
 
−
 
 
−
root@zero:~# tcpdump -nts 1500 '''host''' '''192.168.247.222'''
 
−
 
 
−
Tcpdump filtert nun den Verkehr so das entweder der Sender oder der Empfänger unsere IP-Adresse ist.
 
−
 
 
−
Man kann aber auch diese 2 getrennt festlegen mit '''src''' und '''dst''' vor dem jeweiligen host, man muss sie alerdings wie alle Filter-Optionen mit z.B. '''and''' voneinander abgrenzen.
 
−
 
 
−
root@zero:~# tcpdump -nts 1500 '''src''' host 192.168.247.222 '''and''' '''dst''' host www.google.de
 
−
 
 
−
Jetzt sehen wir nurnoch Pakete die von uns an den bestimmten host gesendet werden.
 
−
 
 
−
===Nach Ports filtern===
 
−
 
 
−
Will man darüber hinaus den Traffic auf einen bestimmten Port begrenzen, so kann man das mit '''port''' (welches auch dem src/dst prinzip folgt):
 
−
 
 
−
root@zero:~# tcpdump -nts 1500 src host 192.168.247.222 and dst host www.google.de and '''port 80'''
 
−
 
 
−
Wenn Sie ein anderes Protokoll, als das standardmäßig eingesetzte TCP verwenden möchten, können Sie dies ebenfalls angeben mit :
 
−
 
 
−
root@zero:~# tcpdump -nts 1500 src host 192.168.247.222 and dst host www.google.de and '''udp''' port 80
 
−
 
 
−
Jetzt sehen wir nurnoch den Traffic der von uns an www.google.de über den HTTP-Port geht und das sieht dann so aus:
 
−
 
 
−
root@zero:~# tcpdump -nts 1500 src host 192.168.247.222 and dst host www.google.de and port 80
 
−
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
 
−
listening on eth0, link-type EN10MB (Ethernet), capture size 1500 bytes
 
−
IP 192.168.247.222.58031 > 209.85.227.147.80: P 3171948303:3171948924(621) ack 4293284400 win 1002 <nop,nop,timestamp 46815127 2256160305>
 
−
IP 192.168.247.222.58031 > 209.85.227.147.80: . ack 1419 win 1002 <nop,nop,timestamp 46815155 2256167438>
 
−
 
 
−
Soll der Traffic auf einer Reihe von Ports beobachtet werden, so kann man dies mit '''portrange'''
 
−
root@zero:~#  tcpdump -ni eth0 portrange 25-40
 
−
 
 
−
Für vereinzelte Ports genügt
 
−
root@zero:~#  tcpdump -ni eth0 port \( 80 or 8080 \)
 
−
 
 
−
===Nach Netzen filtern===
 
−
Hier werden die Netze 192.168.200.0 bis 192.168.207.255 angezeigt
 
−
root@zero:~# tcpdump  -ni eth0 net 192.168.200.0/21
 
−
 
 
−
Hier werden die Ziel Netze 192.168.200.0 bis 192.168.207.255 angezeigt
 
−
root@zero:~# tcpdump  -ni eth0 dst net 192.168.200.0/21
 
−
 
 
−
===Nach Flags filtern===
 
−
 
 
−
Um die Filter jetzt noch zu vertiefen sollte man sich mit den Protokoll Headern auskennen.
 
−
 
 
−
Wenn man jetzt z.B. nur die Pakete sehen will in denen Daten gesendet werden, muss man sie nach dem PUSH-Flag filtern, und das geht mit dem Zusatz:
 
−
 
 
−
'''tcp[13] == 8'''
 
−
 
 
−
Das bedeutet tcpdump soll ein Paket nur anzeigen wenn das 13te Oktet den Wert 8 hat.
 
−
 
 
−
Da das aber bedeuten würde das keine Pakete angezeigt werden bei denen PUSH mit irgendwelche anderen Flags aktiv ist, müssen wir das Oktett mit 8 verUNDen um das gewünschte Ergebnis zu erzielen:
 
  
−
  'tcp[13] '''& 8''' == 8'
+
*Alle Pakete auf eth0 erfassen:
 +
  tcpdump -i eth0
  
−
Man beachte die ' Zeichen um den Filter die dazu dienen das tcpdump das & auch anerkennt.
+
*Verkehr zu/von 192.168.1.100:
 +
tcpdump host 192.168.1.100
  
−
=Fallbeispiel=
+
*Nur Verkehr zu Port 443:
 +
tcpdump dst port 443
  
−
Wir wollen jetzt versuchen herauszufinden nach welchen Worten denn so gegoogelt auf unserem Rechner.
+
*Nur ICMP-Pakete (Ping etc.):
−
Also fangen wir an den Verkehr beliebig lange in einer Datei zu speichern damit wir ihn anschließend ohne viel Stress filtern können.
+
tcpdump icmp
  
−
root@zero:~# tcpdump -s 1500 -w beispiel.cap
+
*Verkehr von Subnetz 192.168.1.0/24:
−
  tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 1500 bytes
+
  tcpdump net 192.168.1.0/24
−
199 packets captured
 
−
199 packets received by filter
 
−
0 packets dropped by kernel
 
  
−
Nachdem wir jetz nach ein paar Worten gegoogelt haben machen wir uns an die Arbeit. Zuerst einmal stellen wir mit dem Host-Filter klar das wir Pakete die von uns kommen sehen wollen.
+
*Nur TCP-Pakete mit gesetztem SYN-Flag:
 +
tcpdump 'tcp[tcpflags] & tcp-syn != 0'
  
−
  root@zero:~# tcpdump -ntr beispiel.cap '''src host 192.168.247.222'''
+
*Nur Pakete mit TTL = 128:
 +
  tcpdump 'ip[8] = 128'
  
−
Das sind aber noch viel zu viele Pakete deswegen addieren wir die Ziel-Adresse
+
*Verkehr von 192.168.1.100 auf Port 80 oder 443:
 +
tcpdump src host 192.168.1.100 and \( port 80 or port 443 \)
  
−
  root@zero:~# tcpdump -ntr beispiel.cap src host 192.168.247.222 and '''dst host www.google.de'''
+
*Verkehr ohne ICMP:
 +
  tcpdump not icmp
  
−
Das sollte das Ergebnis schon einigermaßen eingegrenzt haben.
+
*Mitschnitt in Datei schreiben:
 +
tcpdump -i eth0 -s 0 -w traffic.pcap
  
−
Als nächstes fügen wir noch hinzu das wir Pakete die Daten enthalten suchen, durch den Flag-Filter
+
*Mitschnitt aus Datei lesen:
 +
tcpdump -r traffic.pcap
  
−
  root@zero:~# tcpdump -ntr beispiel.cap src host 192.168.247.222 and dst host www.google.de and''' 'tcp[13] & 8 == 8' '''
+
*HTTP-Verkehr sichtbar machen (ASCII):
 +
  tcpdump -A port 80
  
−
Wir sehen nurnoch die Pakete die Daten enthalten in der Ausgabe. Aber noch nicht die Daten. Das ist machbar mit der Option '''-A''', die die Pakete in ASCII anzeigt.
+
*Verkehr von/zu MAC-Adresse:
 +
tcpdump ether host 11:22:33:44:55:66
  
−
  root@zero:~# tcpdump -'''A'''ntr beispiel.cap src host 192.168.247.222 and dst host www.google.de and 'tcp[13] & 8 == 8'
+
*Nur Pakete mit gesetztem PSH-Flag:
 +
  tcpdump 'tcp[tcpflags] & tcp-push != 0'
  
−
Damit sind wir unserem Ziel greifbar Nahe.
+
*Pakete mit TCP-ACK:
 +
tcpdump 'tcp[tcpflags] & tcp-ack != 0'
  
−
Wenn man sich das Ergebnis ansieht kann man schon ein Muster und unsere gesuchten Worte erkennen kann.
+
*TCP-Verkehr mit Sequenznummer 12345678:
 +
tcpdump 'tcp[4:4] = 12345678'
  
−
Jetzt nurnoch unsere tcpdump Ausgabe mit einer Pipe durch grep laufen lassen und wir haben was wir wollten:
+
*TCP-Verkehr mit ACK-Nummer 87654321:
 +
tcpdump 'tcp[8:4] = 87654321'
  
−
root@zero:~# tcpdump ... '''| grep search'''
+
*TCP-Quellport im Bereich 1024–65535:
−
reading from file beispiel.cap, link-type EN10MB (Ethernet)
+
  tcpdump 'tcp[0:2] > 1023 and tcp[0:2] < 65536'
−
......U(GET /search?hl=de&q='''baum'''&btnG=Suche&meta= HTTP/1.1
 
−
Referer: http://www.google.de/search?hl=de&q='''auto'''&btnG=Suche&meta=
 
−
  Referer: http://www.google.de/search?hl=de&q='''baum'''&btnG=Suche&meta=
 
−
......X2GET /search?hl=de&q='''haus'''&btnG=Suche&meta= HTTP/1.1
 
−
Referer: http://www.google.de/search?hl=de&q='''baum'''&btnG=Suche&meta=
 
−
Referer: http://www.google.de/search?hl=de&q='''haus'''&btnG=Suche&meta=
 
−
......`.GET /search?hl=de&q='''auto'''&btnG=Suche&meta= HTTP/1.1
 
−
Referer: http://www.google.de/search?hl=de&q='''haus'''&btnG=Suche&meta=
 
−
Referer: http://www.google.de/search?hl=de&q='''auto'''&btnG=Suche&meta=
 
  
−
Hier sieht man deutlich die benutzten Worte heraus.
+
*TCP-Zielport im Bereich 1024–65535:
 +
tcpdump 'tcp[2:2] > 1023 and tcp[2:2] < 65536'

Version vom 10. Mai 2025, 08:30 Uhr

Optionenübersicht

Option Beschreibung Beispiel
-i Interface angeben tcpdump -i eth0 -D Verfügbare Interfaces auflisten tcpdump -D -n Keine DNS-Auflösung (schneller) tcpdump -n -s 0 Ganze Pakete erfassen tcpdump -s 0 -c 100 Nach 100 Paketen abbrechen tcpdump -c 100 -w DATEI Mitschnitt speichern tcpdump -w capture.pcap -r DATEI Mitschnitt aus Datei lesen tcpdump -r capture.pcap -A ASCII-Daten anzeigen tcpdump -A port 80 -v / -vv / -vvv Detailtiefe (Verbose) erhöhen tcpdump -vvv -i eth0 -e Ethernet-Header mit anzeigen tcpdump -e -t Zeitstempel unterdrücken tcpdump -t

Filterübersicht (BPF Syntax)

Filterausdruck Beschreibung
host 192.168.1.100 Alle Pakete zu/von Host src host 192.168.1.100 Nur Pakete vom Host dst host 192.168.1.100 Nur Pakete zum Host port 80 Pakete mit Port 80 (TCP/UDP) src port 443 Quellport 443 dst port 22 Zielport 22 net 192.168.1.0/24 Pakete im Subnetz portrange 1000-2000 Portbereich tcp Nur TCP-Verkehr udp Nur UDP-Verkehr icmp Nur ICMP-Verkehr (Ping etc.) and, or, not Logische Filterverknüpfung 'tcp[tcpflags] & tcp-syn != 0' Nur TCP-SYN-Pakete 'ip[8] = 128' Pakete mit TTL = 128

Beispielbefehle für Analyse mit tcpdump

  • Alle Pakete auf eth0 erfassen:
tcpdump -i eth0
  • Verkehr zu/von 192.168.1.100:
tcpdump host 192.168.1.100
  • Nur Verkehr zu Port 443:
tcpdump dst port 443
  • Nur ICMP-Pakete (Ping etc.):
tcpdump icmp
  • Verkehr von Subnetz 192.168.1.0/24:
tcpdump net 192.168.1.0/24
  • Nur TCP-Pakete mit gesetztem SYN-Flag:
tcpdump 'tcp[tcpflags] & tcp-syn != 0'
  • Nur Pakete mit TTL = 128:
tcpdump 'ip[8] = 128'
  • Verkehr von 192.168.1.100 auf Port 80 oder 443:
tcpdump src host 192.168.1.100 and \( port 80 or port 443 \)
  • Verkehr ohne ICMP:
tcpdump not icmp
  • Mitschnitt in Datei schreiben:
tcpdump -i eth0 -s 0 -w traffic.pcap
  • Mitschnitt aus Datei lesen:
tcpdump -r traffic.pcap
  • HTTP-Verkehr sichtbar machen (ASCII):
tcpdump -A port 80
  • Verkehr von/zu MAC-Adresse:
tcpdump ether host 11:22:33:44:55:66
  • Nur Pakete mit gesetztem PSH-Flag:
tcpdump 'tcp[tcpflags] & tcp-push != 0'
  • Pakete mit TCP-ACK:
tcpdump 'tcp[tcpflags] & tcp-ack != 0'
  • TCP-Verkehr mit Sequenznummer 12345678:
tcpdump 'tcp[4:4] = 12345678'
  • TCP-Verkehr mit ACK-Nummer 87654321:
tcpdump 'tcp[8:4] = 87654321'
  • TCP-Quellport im Bereich 1024–65535:
tcpdump 'tcp[0:2] > 1023 and tcp[0:2] < 65536'
  • TCP-Zielport im Bereich 1024–65535:
tcpdump 'tcp[2:2] > 1023 and tcp[2:2] < 65536'