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.
Dopo averlo installato (sui dispositivi Linux dovrebbe esser già presente) notiamo subito che ha moltissime opzioni, che inizialmente risulteranno incomprensibili
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:
Alcune delle opzioni degne di nota in tcpdump sono:
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.
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.