TCPdump

 

TCPdump è la versione di UNIX di un decodificatore di pacchetti. Originalmente scritto da Van Jacobsen per analizzare problemi di performance di TCP, ed oggi giorno grazie a versioni più aggiornate viene ancora largamente utilizzato.TCPdump deve potere mettere l'interfaccia (tipicamente un Ethernet) in maniera promiscua per leggere tutto il traffico della rete.

 

Usi del TCPdump

 

Il più semplice modo per usare TCPdump è di eseguirlo ponendo un ` -i ' switch per specificare quale interfaccia della rete dovrebbe essere usata. Esso darà delle informazioni riassuntive per ogni pacchetto ricevuto o trasmesso sull'interfaccia.TCPdump prevede molte importanti opzioni, così come l'abilità di specificare un'espressione per restringere la serie di pacchetti che si desidera studiare.


Problemi riscontrabili


a)Nessun output

 

Controllare che sia stata specificata l'interfaccia della rete in modo corretto settando lo switch "-i". Se si hanno problemi di DNS, TCPdump potrebbe sospendere provando a migliorare la chiamata al DNS per indirizzi IP, provando le opzioni -f o -n per disabilitare questa caratteristica. Se il problema non è risolto si deve controllare l'interfaccia del KERNEL -poichè TCPdump potrebbe essere mal-configurato per il sistema usato.


b)Pacchetti lasciati cadere

 

Alla fine dell'esecuzione,TCPdump informerà, se qualche pacchetto sia stato lasciato nel KERNEL. Se questo diviene un problema, è probabile che l'HOST non può tenere alto il traffico della rete e decodificarlo allo stesso tempo. Si prova ad usare l'opzione -w di TCPdump per aggirare la decodifica e scrivere i pacchetti grezzi in un archivio,per poi decodificarli in un secondo momento attraverso l'opzione -r.

 

 

 

 

Esempi con tcpdump

 

Per catturare tutti i pacchetti  sull'interfaccia di loopback si può digitare:

            tcpdump -i lo
 

L'interfaccia di loopback è un dispositivo di rete virtuale che permette di riferirsi a se stesso. 

L'output ottenuto è il seguente:
  

Considerando la prima riga (in grassetto):

15:46:49.086648 - E' il tempo in cui il pacchetto è stato catturato. 

localhost.1029 > localhost.ftp - Indica che il pacchetto è stato spedito da un'applicazione su localhost associata alla porta 1029 ad un'applicazione ancora su localhost (stiamo sniffando dal loopback) associata alla porta riservata ai servizi ftp.

Ci sono altri dettagli di TCP come i numeri di sequenza della connessione (3015740888) o il valore di particolari bit. Con queste opzioni tcpdump non prende in considerazione la parte dati. Se invece si esegue:

    tcpdump -i lo -s 200 -x -q

l'output fornito sarà del tipo :
 

-s 200 specifica di catturare 200 byte di ogni pacchetto

-x specifica di stampare (in esadecimale) l'inizio di ogni pacchetto

-q  fornisce una stampa meno invadente dell'output (mancano i numeri di sequenza e altri dettagli)

Per catturare solo i pacchetti tcp sull'interfaccia di rete eth0 e destinati alla porta 23 (telnet) e salvare tutto l'output su un file si può digitare:
 

tcpdump -i eth0 -w file tcp port 23

Si può successivamente digitare tcpdump -r file per visualizzare l'output in maniera standard.

Uno sniffer vede i pacchetti grezzi, cioè senza nessuna interpretazione dei vari strati del protocollo per cui il pacchetto è stato costruito. Lo sniffer dovrà quindi interpretare una strana sequenza di byte.

 

Consideriamo un pacchetto grezzo cosi come restituito allo sniffer e vediamo come può essere interpretato. (Se abbiamo a disposizione un file salvato da tcpdump possiamo visualizzare il pacchetto grezzo digitando: od -x file )

 

 

Sequenza grezza

Significato (di alcuni byte)


 
 

c3d4 a1b2 0002 0004 0000 0000 0000 0000 00c8 0000 0000 0000 6ecf 3936 6744 000a  0040  0000  0040  0000 0000 0008 0045 3c00 5201 0040 0640 683b 007f  0100 007f 0100 0904 1700 a01e 0301 0000 0000 02a0 6079 caa7 0000 0402 2c0f 0204 0a08 0a00 94fb 0000 0000 0301 0003 6ecf 3936 67c3 000a 0040 0000 0040 0000  0000 0008  00453c00 5301 0040 0640 673b 007f 0100 007f 0100 1700 0904 c51e 5034 a01e 0401 12a0 6079 0559 0000 0402 2c0f 0204 0a08 0a00 94fb 0a00 94fb 0301 0003 6ecf 3936 67f5 000a 0038 0000 0038 0000 0000 0008  0045 3400  5401 0040 0640 6e3b 007f 0100 007f 0100 0904 1700 a01e 0401 c51e 5134 1080 6079 4291 0000 0101 0a08 0a00 94fb 0a00 94fb 6ecf 3936 88cc 000a 0040 0000 0040 0000 0000 0008  ....

................. 

 0045 7200 6901 0040 0640 1b3b 007f 0100 007f 0100 1700 0904  c51e 8734 a01e 9701 1880 6079 8eea 0000 0101 0a08 0a00 9efb 0a00 9cfb fbff 5701 6c65 6f63 656d  7420 206f 7553 4553 4c20 6e69 7875 3620 322e 2820 3369 3638 2029 202d 654b 6e72 6c65 3220 322e 312e 2030 7028 7374 302f 2e29 0a0d 

a1 b2 c3 d4

Numero magico, usato per vedere se è necessario convertire da big-endian a little-endian (deve essere a1 b2 c3 d4) altrimenti i long vanno letti eseguendo uno scambio)

0002 0004

pcap versione 2,4

00c8

Lunghezza snap (200)

0000

dlc = 0

 3936  6ecf 

 tempo in cui il pacchetto è stato catturato (16:10:23)

000a 6744

Nanosecondi relativi alla cattura

0045

(Inizio Header IP)
00 - TOS
4 - IP versione 4
5 - Lunghezza header IP
5 (word) = 20 byte

003c

Lunghezza totale (in byte) del datagramma IP (60)

4006

40h = 64  Time to live
06 = Numero di Protocollo incapsulato  6 = TCP (cioè quello che è incapsulato nel datagramma IP  è un segmento TCP)

007F  0100

7F = 127, 00  = 0, 00 = 0,01 = 1
IP Origine = 127.0.0.1
(E' un unsigned long in formato di rete)

007F  0100

IP Destinazione 
(Fine header IP)

0409

(Inizio header TCP)
0904 = 1033 Porta origine

1700

0017 = 23 Porta destinazione
(Telnet)

02A0

A = 10  Lunghezza del header TCP (in  word) 40 byte
Bit di opzione in questo caso una richiesta di connessione

001  \b  \n  \0  \n 373 236  \0  
\n 373 234 377 373 001
Welcome to  SuSE  Linux  6.2  (i386)-Kernel  2.2.10 (pts/0).
\r\n 

Dati di TCP ma comandi e dati di telnet

I dati che viaggiano su un singolo pacchetto possono essere visualizzati direttamente mentre in connessioni come telnet ad ogni pressione di un tasto corrisponde un pacchetto con il corrispondente carattere come dati,per questo in questi casi per visualizzare i dati è necessario ricompattare i vari pacchetti. 

 

 

 

Anche se tcpdump è molto potente e versatile, interpretare direttamente il suo output non è pratico. Se si è interessati a visualizzare e raggruppare i dati sniffati si possono usare dei tool che facilitano queste operazioni.

 

 

Vediamo un tipico esempio di cattura:

 

 

Lo scenario iniziale è il seguente:


LUtente A e lUtente B vogliono comunicare e lUtente R, che ha accesso di root, vuole sniffare il traffico. Per fare ciò avvia TCPDUMP:



A questo punto TCPDUMP è in attesa.

Lutente A si connette allutente B attraverso un operazione di FTP:



Da questo momento in poi tutti i pacchetti sono catturati dallutente R. Poiché vi è un sistema di identificazione con UserID e password, esse saranno catturate:



Dalla figura si vede la cattura dei pacchetti contenenti la UserID e la password dell'Utente A.

Ora lUtente A trasferisce dei file conteneti e-mail dalla macchina dellUtente B:



Anche questi pacchetti vengono catturati dallutente R:




Quando l'Utente R interromperà l'esecuzione di TCPdump gli saranno fornite informazioni sui pacchetti catturati, ad esempio la quantità dei pacchetti catturati; a questo punto potrà analizzare quanto sniffato!