IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

Tcpdump com a eina de depuració

Normalment el més complicat de tcpdump és manejar correctament les seves opcions de filtratge per tal de trobar el que volem depurar entre la inmensitat de paquets que poden estar circulant per les interfícies de xarxa d'una màquina.

Anem doncs a veure uns quants exemples del que ens permeten les opcions de tcpdump:

La primera opció que veurem és la que ens permet indicar quina targeta de xarxa volem escoltar:

$ sudo tcpdump -i eth0

NOTA: Si tcpdump no us reporta cap informació sobre els paquets que circulen per les vostres interfícies de xarxa és molt possible que no estigueu escoltant la interfície correcta. Tingueu en compte que per defecte tcpdump escolta la eth0.

Si no volem veure els noms de màquines sinó les seves ips s'utilitza el paràmetre -n

$ sudo tcpdump -n -i eth0
12:10:36.574546 IP 192.168.0.10.22 > 192.168.0.7.44686: P 153808:153984(176) ack 145 win 404 <nop,nop,timestamp 16009908 49078064>
12:10:36.574599 IP 192.168.0.10.22 > 192.168.0.7.44686: P 153984:154160(176) ack 145 win 404 <nop,nop,timestamp 16009908 49078064>
12:10:36.574652 IP 192.168.0.10.22 > 192.168.0.7.44686: P 154160:154336(176) ack 145 win 404 <nop,nop,timestamp 16009908 49078064>
12:10:36.574704 IP 192.168.0.10.22 > 192.168.0.7.44686: P 154336:154496(160) ack 145 win 404 <nop,nop,timestamp 16009908 49078064>

Cal tenir en compte que tcpdump per defecte no mostra les dades dels paquets. Si volem veure el contingut dels paquets hem d'utilitzar les opcions -x i -X

$ sudo tcpdump -i eth0 -x
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
12:47:30.097707 IP 83.34.47.232.3595 > 192.168.0.7.80: S 3533943803:3533943803(0) win 5840 <mss 1452,sackOK,timestamp 3730529 0,nop,wscale 2>
        0x0000:  4500 003c 5f9a 4000 3906 9e68 5322 2fe8  
        0x0010:  c0a8 0007 0e0b 0050 d2a3 b3fb 0000 0000  
        0x0020:  a002 16d0 6bef 0000 0204 05ac 0402 080a  
        0x0030:  0038 ec61 0000 0000 0103 0302            
12:47:30.195600 IP 83.34.47.232.3595 > 192.168.0.7.80: . ack 203867639 win 1460 <nop,nop,timestamp 3730554 49299418>
        0x0000:  4500 0034 5f9b 4000 3906 9e6f 5322 2fe8  
        0x0010:  c0a8 0007 0e0b 0050 d2a3 b3fc 0c26 c5f7  
        0x0020:  8010 05b4 96b9 0000 0101 080a 0038 ec7a  
        0x0030:  02f0 3fda                                  

La primera línia és la capçalera del paquet (on es mostren les IPS d'origen i destinació) i la resta són els continguts del paquet en format hexadecimal. El paràmetre -X majúscula ens mostra el mateix però a més també ens mostra els continguts dels paquets en format ASCII:

$ sudo tcpdump -i eth0 -X
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
12:47:30.097707 IP 83.34.47.232.3595 > 192.168.0.7.80: S 3533943803:3533943803(0) win 5840 <mss 1452,sackOK,timestamp 3730529 0,nop,wscale 2>
        0x0000:  4500 003c 5f9a 4000 3906 9e68 5322 2fe8  E..<_.@.9..hS"/.
        0x0010:  c0a8 0007 0e0b 0050 d2a3 b3fb 0000 0000  .......P........
        0x0020:  a002 16d0 6bef 0000 0204 05ac 0402 080a  ....k...........
        0x0030:  0038 ec61 0000 0000 0103 0302            .8.a........
12:47:30.195600 IP 83.34.47.232.3595 > 192.168.0.7.80: . ack 203867639 win 1460 <nop,nop,timestamp 3730554 49299418>
        0x0000:  4500 0034 5f9b 4000 3906 9e6f 5322 2fe8  E..4_.@.9..oS"/.
        0x0010:  c0a8 0007 0e0b 0050 d2a3 b3fc 0c26 c5f7  .......P.....&..
        0x0020:  8010 05b4 96b9 0000 0101 080a 0038 ec7a  .............8.z
        0x0030:  02f0 3fda                                ..?. 

Què podem fer si volem mostrar només els paquets provinents o amb destinació a una màquina concreta? Doncs aleshores fem ús de les expressions. Per defecte tcpdump mostra tots els paquets que circulen per la targeta. Mitjançant expressions podem filtrar quins paquets podem consultar.

Una expressió es composa d'una o més primitives. Cada primitiva es compon de dos parts: un identificador i un qualificador (qualifier). Hi ha tres tipus de qualificadors:

  • type: Són qualificadors que indiquen de quin tipus són els identificadors. Exemples: host 147.83.2.3, net 192.168.0.0, port 30, portrange 30-40, etc.
  • dir: Són qualificadors que indiquen quina és la direcció del identificador. Exemples: src foo, net 192.168, src port ftp-data, etc.
  • proto: Filtres segons el protocol. Exemples: ether, fddi, tr, wlan, ip, ip6, arp, tcp, udp, etc.

Les primitives es poden combinar mitjançant operadors lògics (and, or, etc.) creant expressions.

Per mostrar només els paquets provinents d'una màquina origen concreta:

$ sudo tcpdump -i eth0 src 192.168.2.1 

Una altra opció molt utilitzada amb tcpdump és volcar mitjançant un redirecció els continguts d'una captura en un fitxer:

$ sudo tcpdump -i eth0 > captura_eth0

D'aquesta manera, a posteriori de la captura, podem fer un anàlisi més complert del que hem capturat.

Recursos