Tcpdump grundlagen: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
Zeile 1: Zeile 1:
=Optionenübersicht=
 
  
{| class="wikitable"
+
 
! Option !! Beschreibung !! Beispiel
+
=Benutzung=
 +
 
 +
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 || Interface angeben || tcpdump -i eth0
+
|'''-i'''
| -D || Verfügbare Interfaces auflisten || tcpdump -D
+
|'''i'''nterface
| -n || Keine DNS-Auflösung (schneller) || tcpdump -n
+
|Hört das angegebene Interface ab.
| -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)=
+
==Beispiele:==
 +
 
 +
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:
  
{| class="wikitable"
+
root@zero:~# tcpdump '''-c 100 -s 1500''' -w traffic.cap
! Filterausdruck !! Beschreibung
+
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 1500 bytes
 +
 
 +
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
 
|-
 
|-
| host 192.168.1.100 || Alle Pakete zu/von Host
+
|'''-i'''
| src host 192.168.1.100 || Nur Pakete vom Host
+
|'''i'''nterface
| dst host 192.168.1.100 || Nur Pakete zum Host
+
|Tcpdump benutzt das angegebene Interface ( -i eth0 )
| port 80 || Pakete mit Port 80 (TCP/UDP)
+
|-
| src port 443 || Quellport 443
+
|'''-p'''
| dst port 22 || Zielport 22
+
|'''p'''romiscuous
| net 192.168.1.0/24 || Pakete im Subnetz
+
|Tcpdump fängt nur Pakete ab die auch für den Rechner bestimmt sind
| portrange 1000-2000 || Portbereich
+
|-
| tcp || Nur TCP-Verkehr
+
|'''-q'''
| udp || Nur UDP-Verkehr
+
|'''q'''uick
| icmp || Nur ICMP-Verkehr (Ping etc.)
+
|Zeigt weniger Protokoll-Informationen
| and, or, not || Logische Filterverknüpfung
+
|-
| 'tcp[tcpflags] & tcp-syn != 0' || Nur TCP-SYN-Pakete
+
|'''-v'''
| 'ip[8] = 128' || Pakete mit TTL = 128
+
|'''v'''erbose
 +
|Zeigt mehr Informationen an, steigerbar bis '''-vvv'''
 
|}
 
|}
  
=Beispielbefehle für Analyse mit tcpdump=
+
==Filter==
 +
 
 +
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:
  
*Alle Pakete auf eth0 erfassen:
+
  'tcp[13] '''& 8''' == 8'
  tcpdump -i eth0
 
  
*Verkehr zu/von 192.168.1.100:
+
Man beachte die ' Zeichen um den Filter die dazu dienen das tcpdump das & auch anerkennt.
tcpdump host 192.168.1.100
 
  
*Nur Verkehr zu Port 443:
+
=Fallbeispiel=
tcpdump dst port 443
 
  
*Nur ICMP-Pakete (Ping etc.):
+
Wir wollen jetzt versuchen herauszufinden nach welchen Worten denn so gegoogelt auf unserem Rechner.
tcpdump icmp
+
Also fangen wir an den Verkehr beliebig lange in einer Datei zu speichern damit wir ihn anschließend ohne viel Stress filtern können.
  
*Verkehr von Subnetz 192.168.1.0/24:
+
root@zero:~# tcpdump -s 1500 -w beispiel.cap
  tcpdump net 192.168.1.0/24
+
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 1500 bytes
 +
199 packets captured
 +
199 packets received by filter
 +
  0 packets dropped by kernel
  
*Nur TCP-Pakete mit gesetztem SYN-Flag:
+
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.
tcpdump 'tcp[tcpflags] & tcp-syn != 0'
 
  
*Nur Pakete mit TTL = 128:
+
root@zero:~# tcpdump -ntr beispiel.cap '''src host 192.168.247.222'''
tcpdump 'ip[8] = 128'
 
  
*Verkehr von 192.168.1.100 auf Port 80 oder 443:
+
Das sind aber noch viel zu viele Pakete deswegen addieren wir die Ziel-Adresse
tcpdump src host 192.168.1.100 and \( port 80 or port 443 \)
 
  
*Verkehr ohne ICMP:
+
root@zero:~# tcpdump -ntr beispiel.cap src host 192.168.247.222 and '''dst host www.google.de'''
tcpdump not icmp
 
  
*Mitschnitt in Datei schreiben:
+
Das sollte das Ergebnis schon einigermaßen eingegrenzt haben.
tcpdump -i eth0 -s 0 -w traffic.pcap
 
  
*Mitschnitt aus Datei lesen:
+
Als nächstes fügen wir noch hinzu das wir Pakete die Daten enthalten suchen, durch den Flag-Filter
tcpdump -r traffic.pcap
 
  
*HTTP-Verkehr sichtbar machen (ASCII):
+
root@zero:~# tcpdump -ntr beispiel.cap src host 192.168.247.222 and dst host www.google.de and''' 'tcp[13] & 8 == 8' '''
tcpdump -A port 80
 
  
*Verkehr von/zu MAC-Adresse:
+
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.
tcpdump ether host 11:22:33:44:55:66
 
  
*Nur Pakete mit gesetztem PSH-Flag:
+
root@zero:~# tcpdump -'''A'''ntr beispiel.cap src host 192.168.247.222 and dst host www.google.de and 'tcp[13] & 8 == 8'
tcpdump 'tcp[tcpflags] & tcp-push != 0'
 
  
*Pakete mit TCP-ACK:
+
Damit sind wir unserem Ziel greifbar Nahe.
tcpdump 'tcp[tcpflags] & tcp-ack != 0'
 
  
*TCP-Verkehr mit Sequenznummer 12345678:
+
Wenn man sich das Ergebnis ansieht kann man schon ein Muster und unsere gesuchten Worte erkennen kann.
tcpdump 'tcp[4:4] = 12345678'
 
  
*TCP-Verkehr mit ACK-Nummer 87654321:
+
Jetzt nurnoch unsere tcpdump Ausgabe mit einer Pipe durch grep laufen lassen und wir haben was wir wollten:
tcpdump 'tcp[8:4] = 87654321'
 
  
*TCP-Quellport im Bereich 1024–65535:
+
root@zero:~# tcpdump ... '''| grep search'''
  tcpdump 'tcp[0:2] > 1023 and tcp[0:2] < 65536'
+
reading from file beispiel.cap, link-type EN10MB (Ethernet)
 +
......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=
  
*TCP-Zielport im Bereich 1024–65535:
+
Hier sieht man deutlich die benutzten Worte heraus.
tcpdump 'tcp[2:2] > 1023 and tcp[2:2] < 65536'
 

Version vom 10. Mai 2025, 08:50 Uhr


Benutzung

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:

-s size Legt die Maximale Größe der abgefangenen Pakete fest. Empfohlener Wert is 1500 bytes, das entspricht der maximalen Paketgröße eines IP-Pakets
-c count Bestimmt die Anzahl an Paketen die abgefangen werden sollen
-w write Speichert die Ausgabe in einer Datei. Da tcpdump eine Menge Daten abfängt, ist es oft ratsam die Daten in einer Datei unterzubringen
-r read Liest mit tcpdump erstellte Dateien
-n numeric Versucht nicht IP-Adressen in Hostnamen umzuwandeln, das beschleunigt die Ausgaberate erheblich
-t time Entfernt den Zeitstempel am Anfang jedes Pakets. Steigert die Übersichtlichkeit fals man nicht an Zeitstempeln interessiert ist
-i interface Hört das angegebene Interface ab.

Beispiele:

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
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 1500 bytes

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 -ntr 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

-A ASCII Zeigt die Pakete ohne ihre Header in ASCII an
-D Devices Zeigt eine Liste der Netwerkschnittstellen an auf denen tcpdump laufen könnte
-e ethernet Zeigt den Ethernet Header jedes Pakets an
-i interface Tcpdump benutzt das angegebene Interface ( -i eth0 )
-p promiscuous Tcpdump fängt nur Pakete ab die auch für den Rechner bestimmt sind
-q quick Zeigt weniger Protokoll-Informationen
-v verbose Zeigt mehr Informationen an, steigerbar bis -vvv

Filter

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

Filter Match
host IP IP-Adresse
port PORT Port-Nummer
net NET/CIDR Netz und Netznummer in CIDR Schreibweise
src (host IP|port PORT|net NET/CIDR) Quellen IP-Adresse, Port-Nummer oder Netz
dst (host IP|port PORT|net NET/CIDR) Ziel IP-Adresse,Port-Nummer oder Netz
! oder not Negation
&& oder and Und Verknüpfung
|| 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'

Man beachte die ' Zeichen um den Filter die dazu dienen das tcpdump das & auch anerkennt.

Fallbeispiel

Wir wollen jetzt versuchen herauszufinden nach welchen Worten denn so gegoogelt auf unserem Rechner. Also fangen wir an den Verkehr beliebig lange in einer Datei zu speichern damit wir ihn anschließend ohne viel Stress filtern können.

root@zero:~# tcpdump -s 1500 -w beispiel.cap
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 1500 bytes
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.

root@zero:~# tcpdump -ntr beispiel.cap src host 192.168.247.222

Das sind aber noch viel zu viele Pakete deswegen addieren wir die Ziel-Adresse

root@zero:~# tcpdump -ntr beispiel.cap src host 192.168.247.222 and dst host www.google.de

Das sollte das Ergebnis schon einigermaßen eingegrenzt haben.

Als nächstes fügen wir noch hinzu das wir Pakete die Daten enthalten suchen, durch den Flag-Filter

root@zero:~# tcpdump -ntr beispiel.cap src host 192.168.247.222 and dst host www.google.de and 'tcp[13] & 8 == 8' 

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.

root@zero:~# tcpdump -Antr beispiel.cap src host 192.168.247.222 and dst host www.google.de and 'tcp[13] & 8 == 8'

Damit sind wir unserem Ziel greifbar Nahe.

Wenn man sich das Ergebnis ansieht kann man schon ein Muster und unsere gesuchten Worte erkennen kann.

Jetzt nurnoch unsere tcpdump Ausgabe mit einer Pipe durch grep laufen lassen und wir haben was wir wollten:

root@zero:~# tcpdump ... | grep search
reading from file beispiel.cap, link-type EN10MB (Ethernet)
......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.