Sniffer I: tcpdump

De Wikijoan
Dreceres ràpides: navegació, cerca

Contingut

Introducció

Tcpdump és un sniffer de paquets en mode comanda. Un sniffer de paquets és un software que captura el tràfic d'entrada i de sortida en una xarxa TCP/IP. Tcpdump funciona en tots els sistemes Unix/Linux, i utilitza la llibreria libpcap (packet capture) per capturar el tràfic de xarxa. Instal.lar tcpdum a Ubuntu és molt fàcil:

# apt-get install tcpdump

També es pot utilitzar per fer un debug de la configuració de xarxa. Normalment tcpdump i wireshark s'utilitzen de forma conjunta (pràctica següent). Els administradors de xarxa capturen els paquets via tcpdump i aleshores utilitzen wireshark per veure/analitzar aquests paquets capturats. El paràmetretcpdump -w per escriure la sortida de tcpdump a un fitxer. Aquí hi ha una llista dels paràmetres que s'utilitzen normalment:

$ man tcpdump

Desenvolupament

Ens basem en:

Aquesta pràctica està documentada utiltizant una interfície de xarxa wireless. Per això tota l'estona estem utilitzant l'opció -i eth1.

Invocació

Has d'estar logat com a root, amb sudo bash o su.

Utilitzar tcpdump sense cap argument fa que capturi paquets en la primera interface (excloent lo), i mostra una curta descripció de cada paquet. Si estem connectats al servidor a través de la xarxa (SSH o telnet), produeix a més una informació extra que fa més difícil d'interpretar el output.

# tcpdump -i eth1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes

# tcpdump -i eth1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes
...
12:20:26.583081 IP joan-laptop.local.34601 > 171.219.106.212.static.jazztel.es.www: Flags [.], ack 279, win 108, options [nop,nop,TS val 2178796 ecr 419443182], length 0
...

Si actualtizem una pàgina web (F5), començarem a veure molta informació per la pantalla.

filtratge simple

Per filtar els paquets de SSH i Telnet:

# tcpdump -i eth1 not port 22
# tcpdump -i eth1 not port 23

Filtrar els ports 22 (SSH) o 23 (Telnet) es fa necessari quan utilitzem tcpdump en una màquina en la qual ens hem logat a través de SSH (o Telnet). La millor manera de veure-ho és que el professor faci un tcpdump en la màquina que hostatja joanillo.org, i veure el soroll que provoca el fet de fer tcpdump a través d'una connexió SSH.

Fem un telnet des d'una màquina externa al servidor de telnet que està corrent, i podem veure la diferència entre utilitzar l'opció not port 23 o no. S i no filtro telnet obtinc paquest del tipus:

12:29:07.566628 IP joan-laptop.local.telnet > joanillo32.local.38438: Flags [P.], seq 78:97, ack 120, win 91, options [nop,nop,TS val 2309042 ecr 7445881], length 19

Si no tens instal.lat un servidor de telnet, ara és el moment de fer-ho:

# apt-get install telnetd

Exemple: filtratge mysql

Ara filtrarem els paquets referents al port 3306 (Mysql). La pràctica és molt simple: tenim dues consoles de Linux: en la primera executem tcpdump:

# tcpdump -n -i wlan0 port 3306

i en la segona ens connectem al servidor mysql que està en el servidor 192.168.0.15:

# mysql -h 192.168.0.15 -u root -p

encara que no coneguis el password, genera tràfic de xarxa. Pots provar millor:

# mysql -h 192.168.0.15 -u alumne -pkeiL2lai langtrainer
# tcpdump -i lo port 22 -> sí
# tcpdump -i lo port 23 -> sí
# tcpdump -i lo port 80 -> sí
# tcpdump -i lo port 3306 -> no

El tràfic generat és:

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlan0, link-type EN10MB (Ethernet), capture size 65535 bytes
19:34:33.112477 IP 192.168.10.231.43154 > 192.168.0.15.3306: Flags [S], seq 670781949, win 14600, options [mss 1460,sackOK,TS val 3731739 ecr 0,nop,wscale 4], length 0
19:34:33.119238 IP 192.168.0.15.3306 > 192.168.10.231.43154: Flags [S.], seq 1764438617, ack 670781950, win 14480, options [mss 1460,sackOK,TS val 46229802 ecr 3731739,nop,wscale 4], length 0
19:34:33.119323 IP 192.168.10.231.43154 > 192.168.0.15.3306: Flags [.], ack 1, win 913, options [nop,nop,TS val 3731741 ecr 46229802], length 0
19:34:33.153067 IP 192.168.0.15.3306 > 192.168.10.231.43154: Flags [P.], seq 1:96, ack 1, win 905, options [nop,nop,TS val 46229805 ecr 3731741], length 95
19:34:33.153238 IP 192.168.10.231.43154 > 192.168.0.15.3306: Flags [.], ack 96, win 913, options [nop,nop,TS val 3731749 ecr 46229805], length 0
19:34:33.156634 IP 192.168.10.231.43154 > 192.168.0.15.3306: Flags [P.], seq 1:85, ack 96, win 913, options [nop,nop,TS val 3731750 ecr 46229805], length 84
19:34:33.185924 IP 192.168.0.15.3306 > 192.168.10.231.43154: Flags [.], ack 85, win 905, options [nop,nop,TS val 46229814 ecr 3731750], length 0
19:34:33.211687 IP 192.168.0.15.3306 > 192.168.10.231.43154: Flags [P.], seq 96:174, ack 85, win 905, options [nop,nop,TS val 46229817 ecr 3731750], length 78
19:34:33.211771 IP 192.168.10.231.43154 > 192.168.0.15.3306: Flags [F.], seq 85, ack 174, win 913, options [nop,nop,TS val 3731764 ecr 46229817], length 0
19:34:33.214852 IP 192.168.0.15.3306 > 192.168.10.231.43154: Flags [F.], seq 174, ack 85, win 905, options [nop,nop,TS val 46229817 ecr 3731750], length 0
19:34:33.214911 IP 192.168.10.231.43154 > 192.168.0.15.3306: Flags [.], ack 175, win 913, options [nop,nop,TS val 3731764 ecr 46229817], length 0
19:34:33.217951 IP 192.168.0.15.3306 > 192.168.10.231.43154: Flags [.], ack 86, win 905, options [nop,nop,TS val 46229827 ecr 3731764], length 0

13 packets captured
13 packets received by filter
0 packets dropped by kernel

Com pots veure s'ha establert una comunicació entre la màquina 192.168.10.231 (portàtil a l'A35) i el servidor 192.168.0.15. Es van alternant les peticions del client al servidor, i les respostes del servidor al client. Recorda que el caràcter > serpara l'origen del destí. Recorda de l'any passat que ack significa acknowledge, i és que en un protocol de comunicació entre dues parts sempre hi ha d'haver el Enterado per poder continuar la comunicació.

Llegir la sortida de tcpdump

Per defecte tcpdump produeix una línia per cada paquet que intercepta. Cada línia comença amb un timestamp, que dóna una informació molt precisa de quan un paquet arriba.

Després ve el nom del protocol. tcpdump no sap distingir entre segons quin protocol, per exemple HTTP i FTP.

Després del protocol ve l'origen i destí dels paquets.

Finalment, mostra diversa informació dels paquets, com ara TCP sequence numbers, flags, ARP/ICMP commands, etc. Per exemple, una sortida típica seria (stream HTTP):

17:50:03.089893 IP 69.61.72.101.www > 212.150.66.73.48777: P 1366488174:1366488582
(408) ack 2337505545 win 7240 <nop,nop,timestamp 1491222906 477679143>

Invocació II

Si volem escoltar per totes les interfícies de xarxa:

# tcpdump -i any 
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 96 bytes
...

Turning off name resolution

tcpdump intenta resoldre el nom que hi ha darrera dels paquets. Això produeix una sortida molt més gran, a part de ralentir el procés de captura. A més, si hi ha algun problema amb els servidors de DNS la captura s'atura, hi ha un coll de botella. Per evitar fer la resolució de noms s'utilitza l'opció -n:

# tcpdump -i eth1 -n

12:42:05.554548 IP 46.4.38.82.80 > 192.168.1.131.40783: Flags [P.], seq 10081:11521, ack 874, win 59, options [nop,nop,TS val 743322706 ecr 2503515], length 1440

ara quan refresquem el Firefox només veiem direccions IP.

Limitar el número de paquets a interceptar

Quan fem F5 amb el Mozilla Firefox la quantitat d'informació ens inunda, i no ens cal tanta per saber quina és la pàgina web d'origen. Utilitzem l'opció -c per limitar el número de paquets:

# tcpdump -ni eth1 -c 10 not port 22

Guardar els paquets capturats

opció -w:

# tcpdump -ni eth1 -w file.cap not port 22

Per defecte només es guarden els primers 68 bytes del paquet. A vegades la informació important es pot perdre. Amb l'opció -s diem quants bytes volem guardar, i si utilitzem -s 0 vol dir que volem guardar tot el paquet:

# tcpdump -ni eth1 -w file.cap -s 0 -c 1000 not port 22

Llegir des del fitxer de captura

Un cop tenim tàfic guardat en el fitxer, podem llegir el fitxer i mirar-lo de forma més detinguda:

# tcpdump -r file.cap

Mirar dins els paquets

tcpdump no entén massa bé els diferents protocols TCP, i per tant la informació que s'obté és molt críptica. És per això que sovint s'utilitza amb Wireshark, que si que sap interpretar els protocols TCP (i ens ensenya la capçalera TCP i la capçalera dels protocols).

tcpdump té algunes opcions que controlen la manera de presentar els paquets.

capçalera Ethernet de cada paquet:

# tcpdump -e -n -i eth1 not port 22

Controlant el timestamp Hi ha quatre opcions que controlen la manera com tcpdump mostra el timestamp.

verbositat. En funció de la verbositat que volem, podem utilitzar -v, -vv, -vvv, -vvvv

mostrar el contingut amb hexadecimal. Utilitzarem l'opció -x o -xx

Filtratge de paquets

Packet matching

Més qualificadors

Amb les opcions src o dst podem veure els paquets que són origen o que són destí:

# tcpdump -n -i eth1 dst port 80

Podem especificar rang de ports. Per exemple, per capturar tots els paquets SSH o Telnet:

# tcpdump -n -i eth1 dst portrange 22-23

Utilitzant dst host o src host podem utilitzar noms de domini en comptes de IP. Per exemple, veure quina diferència hi ha entre utilitzar src host google.com i dst host google.com:

# tcpdump -i eth1 src host google.com

listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes
13:17:36.987715 IP fra07s07-in-f105.1e100.net.www > joan-laptop.local.39434: Flags [.], ack 1178233068, win 162, options [nop,nop,TS val 2848513539 ecr 3036363], length 0

# tcpdump -i eth1 dst host google.com

13:17:14.217379 IP joan-laptop.local.39434 > fra07s07-in-f105.1e100.net.www: Flags [P.], seq 630:1485, ack 15508, win 623, options [nop,nop,TS val 3030704 ecr 2848489939], length 855

altres qualificadors:

# tcpdump -ni eth1 greater 1000

captura només els paquets de més de 1000 bytes.

Expressions de filtre complexes

Podem construir expressions més complexes combinant expressions més simples, utilitzant and o or. També podem utilitzar parèntesi per agrupar diferents expressions.

Per exemple, anem a veure una expressió de filtratge que captura paquets de més de 100 bytes provinents de google.com o de microsoft.com.

# tcpdump -i eth1 -XX greater 100 and \(src host google.com or src host microsoft.com\)

Entrega

No s'ha d'entregar res. Aquesta pràctica s'acaba amb la següent: wireshark


creat per Joan Quintana Compte, novembre 2011

Eines de l'usuari
Espais de noms
Variants
Accions
Navegació
Institut Jaume Balmes
Màquines recreatives
CNC
Informàtica musical
joanillo.org Planet
Eines