Sniffare il traffico con Tcpdump

Tempo di lettura: 9 minuti

Tcpdump è uno dei software più completi e utilizzati per l’analisi del traffico su una rete locale, insieme a Wireshark. In questo tutorial andrò ad utilizzare la versione per linux, ma esiste un’ottima alternativa anche per Windows, ossia Windump.

Tcpdump è un software che ci permette di osservare il traffico che passa su di una rete. Le informazioni principali vengono ricavare dal TCP header, il quale contiene l’indirizzo di destinazione e di sorgente, le informazioni di stato, il protocollo utilizzato, etc.

Introduzione

Dopo averlo installato (sui dispositivi Linux dovrebbe esser già presente) notiamo subito che ha moltissime opzioni, che inizialmente risulteranno incomprensibili

tcpdumphelp
tcpdumphelp

L’informazione principale che dobbiamo conoscere è su quale interfaccia vogliamo intercettare il traffico. Se siamo su una rete Ethernet, selezioneremo eth0, mentre utilizzando il Wi-Fi sarà wlan0. Per saperlo basta digitare

root@kali:~# ifconfig 
eth0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether 78:[..]:df  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.5.50.31  netmask 255.255.255.0  broadcast 10.5.50.255
        inet6 fe80:[..]:d4df  prefixlen 64  scopeid 0x20
        ether cc:[..]:29  txqueuelen 1000  (Ethernet)
        RX packets 397945  bytes 514295529 (490.4 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 339053  bytes 35641479 (33.9 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Nel mio caso sono connesso con il Wi-Fi, perciò utilizzerò wlan0 (per gli utenti Windows bisogna digitare nel terminale ipconfig).

Per intercettare il traffico su una determinata porta (ad esempio, vogliamo intercettare il traffico ftp)

tcpdump -i wlan0 port 21 -vv

Dove l’opzione -i indica l’interfaccia, port indica la porta su cui intercettarlo e -vv dice al programma che voglio un output “prolisso” e completo.

root@kali:~# tcpdump -i wlan0 port 21 -vv
tcpdump: listening on wlan0, link-type EN10MB (Ethernet), capture size 262144 bytes
16:17:38.231730 IP (tos 0x0, ttl 64, id 37022, offset 0, flags [DF], proto TCP (6), length 60)
    kali.42984 > ftp.hq.nasa.gov.ftp: Flags [S], cksum 0x701d (correct), seq 694116358, win 29200, options [mss 1460,sackOK,TS val 1175704 ecr 0,nop,wscale 7], length 0

    kali.42984 > ftp.hq.nasa.gov.ftp: Flags [.], cksum 0x4dcf (correct), seq 1, ack 200, win 229, options [nop,nop,TS val 1176252 ecr 2773945888], length 0
16:17:40.424657 IP (tos 0x0, ttl 51, id 24218, offset 0, flags [DF], proto TCP (6), length 497)
    ftp.hq.nasa.gov.ftp > kali.42984: Flags [P.], cksum 0x01bb (correct), seq 200:645, ack 1, win 46, options [nop,nop,TS val 2773945888 ecr 1176200], length 445: FTP, length: 445
	 
     This is NASA HQ ANONYMOUS FTP SERVER.
	 
     Please read the README file located in the initial server root directory.
	 
     IF you place files into the /incoming directory, it is IMPERATIVE that you
     notify ftp-admin@hq.nasa.gov that you have done so and of your intended
     disposition of those files.  Absent such notification, all files placed
     in /incoming that cannot be identified will be immediately deleted.

Questo è il risultato ottenuto intercettando il traffico sulla porta 21, dove:

  • 16:17:38.231730 indica l’orario di passaggio del pacchetto;
  • kali.42984 > ftp.hq.nasa.gov.ftp indica l’host di partenza (il mio dispositivo) e l’host di arrivo (sito ftp della nasa)
  • Flag [S]: la connessione è iniziata (SYN)
  • altri dati più o meno importanti come il time-to-live o il checksum.

Comandi principali

Alcune delle opzioni degne di nota in tcpdump sono:

  • -n non converte gli indirizzi in nomi;
  • -S stampa la sequenza dei messaggi TCP che passano sulla rete;
  • host 1.2.3.4 osserva il traffico che passa da quell’indirizzo (ad esempio se abbiamo un obbiettivo specifico su una rete locale);
  • port e proto: ad esempio se vogliamo intercettare il traffico passante per la porta 139 e il protocollo udp, digitiamo tcpdump udp port 139 (la parola proto non si digita);
  • filtraggio in base alla grandezza dei pacchetti: se vogliamo intercettare solo i pacchetti minori o maggiori di una certa quantità basta digitare tcpdump >128 o tcpdump < 32;
  • -q stampa solo le informazioni essenziali, eliminando flags e gli altri dati;
  • -w salva i dati catturati in un file, in modo che si possano analizzare anche in futuro.

Sniffare una rete con connesse decine di persone e migliaia di richieste al secondo non ha ovviamente senso, nessuno riuscirebbe ad analizzare tutti quei dati. Ciò che consiglio è eventualmente di selezionare uno o due host (è possibile unire espressioni con &&) e analizzare il loro traffico su specifiche porte. Altri comandi utili possono essere trovati nel manuale di tcpdump, sul sito sans, e in un’ottima guida di Demetro Milea.

Esempi pratici

Nel caso volessi sniffare il traffico in una rete molto frequentata e trovare credenziali di login inserite da qualcuno, il metodo migliore potrebbe essere questo:

root@kali:~# tcpdump port http or port ftp -l -A | egrep -i 'pass=|pwd=|log=|login=|user=|username=|pw=|passw=|passwd=|password=|pass:|user:|username:|password:|login:|pass |user '

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlan0, link-type EN10MB (Ethernet), capture size 262144 bytes
referer=http%3A%2F%2Fforum.tntvillage.scambioetico.org%2Findex.php%3Fs%3D45243e9814b6b21fecf176c46a6eae4a%26act%3DLogin%26CODE%3D00&UserName=hacking&PassWord=123456&CookieDate=1

Come si può notare, in un sito che non utilizza HTTPS ma solo HTTP si possono intercettare le credenziali in chiaro. Questo è uno dei motivi per cui non bisogna mai connettersi ad un Wi-Fi non sicuro o accessibile a chiunque e connettersi a siti senza certificato.

In questo caso intercetto tutto il traffico (l’opzione -A stampa i pacchetti in ASCII) e filtro solo le richieste POST, che solitamente sono inserimenti di password.

root@kali:~# tcpdump -n -A | grep -e 'POST'

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlan0, link-type EN10MB (Ethernet), capture size 262144 bytes
17:17:41.682796 IP 10.5.50.31.33988 > 217.[..].80: Flags [P.], seq 1:624, ack 1, win 229, options [nop,nop,TS val 2076567 ecr 3454258046], length 623: HTTP: POST /wp-login.php HTTP/1.1
.......~POST /wp-login.php HTTP/1.1

Noto che c’è un indirizzo IP che si connette ad un sito Wordpress tramite HTTP. Ora potrei selezionare solo l’indirizzo tramite l’opzione host e sniffare tutto il suo traffico.

Ora intercetto tutto il traffico sulla porta 21 (utilizzata solitamente per le connessioni ftp)

root@kali:~# tcpdump -i wlan0 port 21

17:19:53.796145 IP markmallett.[..].ftp > kali.57082: Flags [P.], seq 1:24, ack 1, win 114, options [nop,nop,TS val 266397953 ecr 2109557], length 23: FTP: 220 FTP Server ready.
17:20:05.495585 IP kali.57082 > markmallett.[..].ftp: Flags [P.], seq 1:13, ack 24, win 229, options [nop,nop,TS val 2112520 ecr 266397953], length 12: FTP: USER admin
17:20:05.702646 IP kali.57082 > markmallett.[..].ftp: Flags [P.], seq 13:25, ack 57, win 229, options [nop,nop,TS val 2112572 ecr 266409862], length 12: FTP: PASS admin

Se qualcuno si connette in chiaro, è semplicissimo trovare le credenziali. Per evitare ciò, si può usare il servizio SFTP, il quale non permette lo sniffaggio di credenziali crittografando i dati.

Ricordo che per sniffare tutto il traffico che passa su una rete l’opzione da inserire è -I. In questo modo la nostra scheda wireless monitora tutta la rete esterna. In un portatile questo è solitamente possibile con una chiavetta esterna, visto che una scheda non supporta (di solito) la modalità monitor insieme ad una connessione già presente. Un esempio di scheda wireless USB potrebbe essere questo.