Originariamente, è stato scritto nel 1988 da quattro lavoratori del Network Research Group presso il Lawrence Berkeley Laboratory in California. È stato organizzato undici anni dopo da Micheal Richardson e Bill Fenner nel 1999, che hanno creato il sito tcpdump. Tcpdump funziona su tutti i sistemi operativi Unix-like. La versione Windows di Tcpdump si chiama WinDump e usa WinPcap, l'alternativa Windows a libpcap.
Usa lo snap per installare tcpdump:
$ sudo snap install tcpdumpUsa il tuo gestore di pacchetti per installare tcpdump:
$ sudo apt-get install tcpdump (Debian/Ubuntu)$ sudo dnf install tcpdump (CentOS/RHEL 6&7)
$ sudo yum install tcpdump (Fedora/CentOS/RHEL 8)
Vediamo diversi usi e output mentre esploriamo tcpdump!
UDP
Tcpdump può anche scaricare pacchetti UDP. Useremo uno strumento netcat (nc) per inviare un pacchetto UDP e poi scaricarlo.
$ echo -n "tcpdumper" | nc -w 1 -u localhost 1337Nel comando sopra indicato, inviamo un pacchetto UDP costituito dalla stringa “tcpdumper” alla porta UDP 1337 attraverso localhost. Tcpdump acquisisce il pacchetto inviato sulla porta UDP 1337 e lo visualizza.
Ora scaricheremo questo pacchetto usando tcpdump.
$ sudo tcpdump -i lo udp port 1337 -vvv -XQuesto comando catturerà e mostrerà i dati catturati dai pacchetti in formato ASCII e esadecimale.
tcpdump: ascolto su lo, tipo di collegamento EN10MB (Ethernet), lunghezza snapshot 262144 byte04:39:39.072802 IP (tos 0x0, ttl 64, id 32650, offset 0, flag [DF], proto UDP (17), lunghezza 37)
localhost.54574 > localhost.1337: [csum udp errato 0xfe24 -> 0xeac6!] UDP, lunghezza 9
0x0000: 4500 0025 7f8a 4000 4011 bd3b 7f00 0001 E… %… @.@… ;…
0x0010: 7f00 0001 d52e 0539 0011 fe24 7463 7064… 9… $tcpd
0x0020: 756d 7065 72 umper
Come possiamo vedere, il pacchetto è stato inviato alla porta 1337 e la lunghezza era 9 come stringa tcpdumper è di 9 byte. Possiamo anche vedere che il pacchetto è stato visualizzato in formato esadecimale.
DHCP
Tcpdump può anche eseguire indagini sui pacchetti DHCP sulla rete. DHCP utilizza la porta UDP n. 67 o 68, quindi definiremo e limiteremo tcpdump solo per i pacchetti DHCP. Supponiamo di utilizzare un'interfaccia di rete wifi.
Il comando utilizzato qui sarà:
tcpdump: ascolto su wlan0, tipo di collegamento EN10MB (Ethernet), lunghezza snapshot 262144 byte
03:52:04.004356 00:11:22:33:44:55 > 00:11:22:33:44:66, ethertype IPv4 (0x0800), lunghezza 342: (tos 0x0, ttl 64, id 39781, offset 0, flag [DF ], proto UDP (17), lunghezza 328)
192.168.10.21.68 > 192.168.10.1.67: [udp sum ok] BOOTP/DHCP, Richiesta da 00:11:22:33:44:55, lunghezza 300, xid 0xfeab2d67, Flag [nessuno] (0x0000)
Client-IP 192.168.10.16
Indirizzo-Ethernet-Cliente 00:11:22:33:44:55
Estensioni venditore-rfc1048
Biscotto magico 0x63825363
Messaggio DHCP (53), lunghezza 1: rilascio
ID server (54), lunghezza 4: 192.168.10.1
Nome host (12), lunghezza 6: "pappagallo"
FINE (255), lunghezza 0
PAD (0), lunghezza 0, si verifica 42
DNS
DNS, noto anche come Domain Name System, conferma di fornirti ciò che stai cercando abbinando il nome di dominio con l'indirizzo di dominio. Per ispezionare la comunicazione a livello DNS del tuo dispositivo su Internet, puoi utilizzare tcpdump nel modo seguente. Il DNS utilizza la porta UDP 53 per la comunicazione.
$ sudo tcpdump -i wlan0 udp port 53tcpdump: ascolto su wlan0, tipo di collegamento EN10MB (Ethernet), lunghezza snapshot 262144 byte
04:23:48.516616 IP (tos 0x0, ttl 64, id 31445, offset 0, flag [DF], proto UDP (17), lunghezza 72)
192.168.10.16.45899 > uno.uno.uno.uno.dominio: [udp sum ok] 20852+ A? mozilla.cloudflare-dns.come. (44)
04:23:48.551556 IP (tos 0x0, ttl 60, id 56385, offset 0, flag [DF], proto UDP (17), lunghezza 104)
uno.uno.uno.uno.dominio > 192.168.10.16.45899: [udp sum ok] 20852 q: A? mozilla.cloudflare-dns.come. 2/0/0 mozilla.cloudflare-dns.come. [24s] A 104.16.249.249, mozilla.cloudflare-dns.come. [24s] A 104.16.248.249 (76)
04:23:48.648477 IP (tos 0x0, ttl 64, id 31446, offset 0, flag [DF], proto UDP (17), lunghezza 66)
192.168.10.16.34043 > uno.uno.uno.uno.dominio: [udp sum ok] 40757+ PTR? 1.1.1.1.in-addr.arpa. (38)
04:23:48.688731 IP (tos 0x0, ttl 60, id 56387, offset 0, flag [DF], proto UDP (17), lunghezza 95)
uno.uno.uno.uno.dominio > 192.168.10.16.34043: [udp sum ok] 40757 q: PTR? 1.1.1.1.in-addr.arpa. 1/0/0 1.1.1.1.in-addr.arpa. [26m53s] PTR uno.uno.uno.uno. (67)
ARP
Il protocollo di risoluzione degli indirizzi viene utilizzato per scoprire l'indirizzo del livello di collegamento, come un indirizzo MAC MAC. È associato a un determinato indirizzo di livello Internet, in genere un indirizzo IPv4.
Stiamo usando tcpdump per acquisire e leggere i dati trasportati nei pacchetti arp. Il comando è semplice come:
$ sudo tcpdump -i wlan0 arp -vvvtcpdump: ascolto su wlan0, tipo di collegamento EN10MB (Ethernet), lunghezza snapshot 262144 byte
03:44:12.023668 ARP, Ethernet (len 6), IPv4 (len 4), Richiedi chi ha 192.168.10.1 dire 192.168.10.2, lunghezza 28
03:44:17.140259 ARP, Ethernet (len 6), IPv4 (len 4), Richiedi chi ha 192.168.10.21 dire 192.168.10.1, lunghezza 28
03:44:17.140276 ARP, Ethernet (len 6), IPv4 (len 4), risposta 192.168.10.21 is-at 00:11:22:33:44:55 (oui Unknown), lunghezza 28
03:44:42.026393 ARP, Ethernet (len 6), IPv4 (len 4), Richiedi chi ha 192.168.10.1 dire 192.168.10.2, lunghezza 28
ICMP
ICMP, noto anche come Internet Control Message Protocol, è un protocollo di supporto nella suite di protocolli Internet. ICMP viene utilizzato come protocollo informativo.
Per visualizzare tutti i pacchetti ICMP su un'interfaccia, possiamo usare questo comando:
$ sudo tcpdump icmp -vvvtcpdump: ascolto su wlan0, tipo di collegamento EN10MB (Ethernet), lunghezza snapshot 262144 byte
04:26:42.123902 IP (tos 0x0, ttl 64, id 14831, offset 0, flag [DF], proto ICMP (1), lunghezza 84)
192.168.10.16 > 192.168.10.1: richiesta echo ICMP, id 47363, seq 1, lunghezza 64
04:26:42.128429 IP (tos 0x0, ttl 64, id 32915, offset 0, flag [nessuno], proto ICMP (1), lunghezza 84)
192.168.10.1 > 192.168.10.16: risposta echo ICMP, id 47363, seq 1, lunghezza 64
04:26:43.125599 IP (tos 0x0, ttl 64, id 14888, offset 0, flag [DF], proto ICMP (1), lunghezza 84)
192.168.10.16 > 192.168.10.1: richiesta echo ICMP, id 47363, seq 2, lunghezza 64
04:26:43.128055 IP (tos 0x0, ttl 64, id 32916, offset 0, flag [nessuno], proto ICMP (1), lunghezza 84)
192.168.10.1 > 192.168.10.16: risposta echo ICMP, id 47363, seq 2, lunghezza 64
NTP
NTP è un protocollo di rete progettato specificamente per sincronizzare l'ora su una rete di macchine. Per catturare il traffico su ntp:
$ sudo tcpdump dst port 12304:31:05.547856 IP (tos 0x0, ttl 64, id 34474, offset 0, flag [DF], proto UDP (17), lunghezza 76)
192.168.10.16.ntp > time-b-wwv.nista.governo.ntp: [udp sum ok] NTPv4, Client, lunghezza 48
Indicatore di salto: orologio non sincronizzato (192), strato 0 (non specificato), poll 3 (8s), precisione -6
Ritardo alla radice: 1.000000, dispersione radice: 1.000000, ID di riferimento: (non specificato)
Timestamp di riferimento: 0.00000000
Data e ora dell'autore: 0.00000000
Ricevi timestamp: 0.00000000
Trasmettere Timestamp: 3825358265.547764155 (2021-03-21T23:31:05Z)
Originatore - Ricevi timestamp: 0.00000000
Originatore - Trasmissione Timestamp: 3825358265.547764155 (2021-03-21T23:31:05Z)
04:31:05.841696 IP (tos 0x0, ttl 56, id 234, offset 0, flag [nessuno], proto UDP (17), lunghezza 76)
tempo-b-wwv.nista.governo.ntp > 192.168.10.16.ntp: [udp sum ok] NTPv3, Server, lunghezza 48
Indicatore di salto: (0), Strato 1 (riferimento primario), sondaggio 13 (8192s), precisione -29
Ritardo alla radice: 0.000244, dispersione radice: 0.000488, ID di riferimento: NIST
Data e ora di riferimento: 3825358208.00000000 (2021-03-21T23:30:08Z)
Data e ora dell'autore: 3825358265.547764155 (2021-03-21T23:31:05Z)
Ricevi timestamp: 3825358275.028660181 (2021-03-21T23:31:15Z)
Trasmettere Timestamp: 3825358275.028661296 (2021-03-21T23:31:15Z)
Originatore - Ricevi timestamp: +9.480896026
Originatore - Trasmissione Timestamp: +9.480897141
SMTP
SMTP o Simple Mail Transfer Protocol viene utilizzato principalmente per le e-mail. Tcpdump può usarlo per estrarre informazioni utili sulla posta elettronica. Ad esempio, per estrarre destinatari/mittenti di posta elettronica:
$ sudo tcpdump -n -l porta 25 | grep -i 'MAIL FROM\|RCPT TO'IPv6
IPv6 è la "prossima generazione" di IP, che fornisce un'ampia gamma di indirizzi IP. IPv6 aiuta a raggiungere la salute a lungo termine di Internet.
Per acquisire il traffico IPv6, utilizzare il filtro ip6 specificando i protocolli TCP e UDP utilizzando proto 6 e proto-17.
$ sudo tcpdump -n -i qualsiasi ip6 -vvvtcpdump: tipo di collegamento dati LINUX_SLL2
tcpdump: ascolto su qualsiasi, tipo di collegamento LINUX_SLL2 (Linux cotto v2), lunghezza dello snapshot 262144 byte
04:34:31.847359 lo In IP6 (etichetta di flusso 0xc7cb6, hlim 64, intestazione successiva UDP (17) lunghezza payload: 40) ::1.49395 > ::1.49395: [csum udp errato 0x003b -> 0x3587!] UDP, lunghezza 32
04:34:31.859082 lo In IP6 (etichetta di flusso 0xc7cb6, hlim 64, intestazione successiva UDP (17) lunghezza payload: 32) ::1.49395 > ::1.49395: [csum cksum udp 0x0033 -> 0xeaef!] UDP, lunghezza 24
04:34:31.860361 lo In IP6 (etichetta di flusso 0xc7cb6, hlim 64, intestazione successiva UDP (17) lunghezza payload: 40) ::1.49395 > ::1.49395: [csum udp errato 0x003b -> 0x7267!] UDP, lunghezza 32
04:34:31.871100 lo In IP6 (etichetta di flusso 0xc7cb6, hlim 64, intestazione successiva UDP (17) lunghezza payload: 944) ::1.49395 > ::1.49395: [csum udp errato 0x03c3 -> 0xf890!] UDP, lunghezza 936
4 pacchetti catturati
12 pacchetti ricevuti dal filtro
0 pacchetti eliminati dal kernel
Il '-c 4' fornisce un conteggio dei pacchetti fino a un massimo di 4 pacchetti. Possiamo specificare il numero di pacchetti in n e catturare n pacchetti.
HTTP
Hypertext Transfer Protocol viene utilizzato per trasferire dati da un server Web a un browser per visualizzare pagine Web. HTTP utilizza la comunicazione in formato TCP. Nello specifico, viene utilizzata la porta TCP 80.
Per stampare tutti i pacchetti HTTP IPv4 da e verso la porta 80:
tcpdump: ascolto su wlan0, tipo di collegamento EN10MB (Ethernet), lunghezza snapshot 262144 byte03:36:00.602104 IP (tos 0x0, ttl 64, id 722, offset 0, flag [DF], proto TCP (6), lunghezza 60)
192.168.10.21.33586 > 192.168.10.1.http: Flags [S], cksum 0xa22b (corretto), seq 2736960993, win 64240, opzioni [mss 1460,sackOK,TS val 389882294 ecr 0,nop,wscale 10], lunghezza 0
03:36:00.604830 IP (tos 0x0, ttl 64, id 0, offset 0, flag [DF], proto TCP (6), lunghezza 60)
192.168.10.1.http > 192.168.10.21.33586: Bandiere [S.], cksum 0x2dcc (corretto), seq 4089727666, ack 2736960994, win 14480, options [mss 1460,sackOK,TS val 30996070 ecr 389882294,nop,wscale 3], length 0
03:36:00.604893 IP (tos 0x0, ttl 64, id 723, offset 0, flag [DF], proto TCP (6), lunghezza 52)
192.168.10.21.33586 > 192.168.10.1.http: Bandiere [.], cksum 0x94e2 (corretto), seq 1, ack 1, win 63, opzioni [nop,nop,TS val 389882297 ecr 30996070], length 0
03:36:00.605054 IP (tos 0x0, ttl 64, id 724, offset 0, flag [DF], proto TCP (6), lunghezza 481)
Richieste HTTP..
192.168.10.21.33586 > 192.168.10.1.http: Bandiere [P.], cksum 0x9e5d (corretto), seq 1:430, ack 1, win 63, opzioni [nop,nop,TS val 389882297 ecr 30996070], lunghezza 429: HTTP, lunghezza: 429GET / HTTP/1.1
Ospite: 192.168.10.1
Agente utente: Mozilla/5.0 (Windows NT 10.0; RV: 78.0) Geco/20100101 Firefox/78.0
Accetta: text/html,application/xhtml+xml,application/xml;q=0.9,immagine/webp,*/*;q=0.8
Accetta-Lingua: en-US,en;q=0.5
Accetta-codifica: gzip, deflate
DNT: 1
Connessione: keep-alive
Cookie: _TESTCOOKIESUPPORT=1; SID=c7ccfa31cfe06065717d24fb544a5cd588760f0cdc5ae2739e746f84c469b5fd
Richieste di upgrade-non sicure: 1
E anche le risposte vengono catturate
192.168.10.1.http > 192.168.10.21.33586: Bandiere [P.], cksum 0x84f8 (corretto), seq 1:523, ack 430, win 1944, opzioni [nop,nop,TS val 30996179 ecr 389882297], lunghezza 522: HTTP, lunghezza: 522HTTP/1.1 200 OK
Server: server web ZTE 1.0 ZTE corp 2015.
Intervalli di accettazione: byte
Connessione: chiusa
Opzioni X-Frame: SAMEORIGIN
Controllo cache: no-cache, no-store
Contenuto-Lunghezza: 138098
Set-Cookie: _TESTCOOKIESUPPORT=1; PERCORSO=/; SoloHttp
Tipo di contenuto: text/html; set di caratteri=utf-8
X-Content-Type-Options: nosniff
Content-Security-Policy: frame-ancestors 'self' 'unsafe-inline' 'unsafe-eval';img-src 'self' data:;
Protezione X-XSS: 1; modalità=blocco
Set-Cookie: SID=;scadenza=gio, 01-gen-1970 00:00:00 GMT;percorso=/; SoloHttp
TCP
Per catturare i pacchetti solo TCP, questo comando farà tutto il bene:
$ sudo tcpdump -i wlan0 tcptcpdump: ascolto su wlan0, tipo di collegamento EN10MB (Ethernet), lunghezza snapshot 262144 byte
04:35:48.892037 IP (tos 0x0, ttl 60, id 23987, offset 0, flag [nessuno], proto TCP (6), lunghezza 104)
tl-in-f189.1e100.netto.https > 192.168.10.16.50272: Bandiere [P.], cksum 0xc924 (corretto), seq 1377740065:1377740117, ack 1546363399, win 300, opzioni [nop,nop,TS val 13149401 ecr 3051434098], lunghezza 52
04:35:48.892080 IP (tos 0x0, ttl 64, id 20577, offset 0, flag [DF], proto TCP (6), lunghezza 52)
192.168.10.16.50272 > tl-in-f189.1e100.netto.https: Bandiere [.], cksum 0xf898 (corretto), seq 1, ack 52, win 63, opzioni [nop,nop,TS val 3051461952 ecr 13149401], lunghezza 0
04:35:50.199754 IP (tos 0x0, ttl 64, id 20578, offset 0, flag [DF], proto TCP (6), lunghezza 88)
192.168.10.16.50272 > tl-in-f189.1e100.netto.https: Bandiere [P.], cksum 0x2531 (corretto), seq 1:37, ack 52, win 63, opzioni [nop,nop,TS val 3051463260 ecr 13149401], lunghezza 36
04:35:50.199809 IP (tos 0x0, ttl 64, id 7014, offset 0, flag [DF], proto TCP (6), lunghezza 88)
192.168.10.16.50434 > hkg12s18-in-f14.1e100.netto.https: Bandiere [P.], cksum 0xb21e (corretto), seq 328391782:328391818, ack 3599854191, win 63, opzioni [nop,nop,TS val 3656137742 ecr 2564108387], lunghezza 36
4 pacchetti catturati
4 pacchetti ricevuti dal filtro
0 pacchetti eliminati dal kernel
Normalmente l'acquisizione di pacchetti TCP genera molto traffico; puoi specificare in dettaglio le tue esigenze aggiungendo filtri alla cattura, come ad esempio:
Porta
Specifica la porta da monitorare
IP di origine
Per visualizzare i pacchetti da una sorgente specificata
IP di destinazione
Per visualizzare i pacchetti verso una destinazione specificata
Salvataggio dell'acquisizione dei pacchetti in file
Per salvare l'acquisizione del pacchetto per eseguire l'analisi in un secondo momento, possiamo usare l'opzione -w di tcpdump che richiede un parametro del nome del file. Questi file vengono salvati in un formato di file pcap (acquisizione di pacchetti), che può essere utilizzato per salvare o inviare acquisizioni di pacchetti.
Per esempio:
$ sudo tcpdumpPossiamo aggiungere filtri per catturare i pacchetti TCP, UDP o ICMP, ecc.
Lettura dell'acquisizione di pacchetti da file
Sfortunatamente, non puoi leggere il file salvato tramite i comuni comandi "leggi file" come cat, ecc. L'output è tutt'altro che incomprensibile ed è difficile dire cosa c'è nel file. '-r' è usato per leggere i pacchetti salvati nel .pcap file, memorizzato in precedenza da '-w' o altro software che memorizza pcaps:
$ sudo tcpdump -rQuesto stampa i dati raccolti dai pacchetti catturati sullo schermo del terminale in un formato leggibile.
Cheatsheet di Tcpdump
Tcpdump può essere utilizzato con altri comandi Linux come grep, sed, ecc., per estrarre informazioni utili. Ecco alcune utili combinazioni e parole chiave amalgamate in uso con tcpdump per ottenere preziose informazioni.
Estrai agenti utente HTTP:
$ sudo tcpdump -n | grep "User-Agent:"Gli URL richiesti su HTTP possono essere monitorati utilizzando tcpdump come:
$ sudo tcpdump -v -n | egrep -i "POST / |GET / |Host:"Puoi anche Estrai le password HTTP nelle richieste POST
$ sudo tcpdump -nn -l | egrep -i "POST /|pwd=|passwd=|password=|Host:"I cookie lato server o lato client possono essere estratti utilizzando:
$ sudo tcpdump -n | egrep -i 'Set-Cookie|Host:|Cookie:'Acquisisci richieste e risposte DNS utilizzando:
$ sudo tcpdump -i wlp58s0 -s0 porta 53Stampa tutte le password in testo semplice:
$ sudo tcpdump porta http o porta ftp o porta smtp o porta imap o porta pop3 o porta telnet -l -A | egrep -i -B5 'pass=|pwd=|log=|login=|user=|user |username=|pw=|passw=|passwd=|password=|pass:|user:|username:|password:| login:|pass 'Filtri Tcpdump comuni
- -UN Mostra i pacchetti in formato ASCII.
- -c Numero di pacchetti da catturare.
- -contare Stampa il conteggio dei pacchetti solo durante la lettura di un file acquisito.
- -e Stampa indirizzi MAC e intestazioni a livello di collegamento.
- -h o -help Stampa le informazioni sulla versione e sull'utilizzo.
- -versione Mostra solo le informazioni sulla versione.
- -io Specificare l'interfaccia di rete su cui acquisire.
- -K Impedisci i tentativi di verificare i checksum di qualsiasi pacchetto. Aggiunge velocità.
- -m
Specifica il modulo da utilizzare. - -n Non convertire gli indirizzi (i.e., indirizzi host, numeri di porta, ecc.) ai nomi.
- -numero Stampa un numero di pacchetto opzionale all'inizio di ogni riga.
- -p Proibire all'interfaccia di entrare in modalità promiscua.
- -Q Scegli la direzione per i pacchetti da catturare. Invia o ricevi.
- -q Uscita silenziosa/veloce. Stampa Meno informazioni. Le uscite sono più brevi.
- -r
Usato per leggere i pacchetti da un pcap . - -t Non stampare un timestamp su ogni riga di dump.
- -v Stampa ulteriori informazioni sull'output.
- -w
Scrivi i pacchetti raw su file to. - -X Stampa output ASCII.
- -X Stampa ASCII con esadecimale.
- -liste-interfacce Mostra tutte le interfacce di rete disponibili in cui i pacchetti possono essere catturati da tcpdump.
Cessazione
Tcpdump è stato uno strumento molto utilizzato nella ricerca e nelle applicazioni di sicurezza/rete. L'unico inconveniente tcpdump ha "Nessuna GUI", ma è troppo bello per essere tenuto fuori dalle classifiche. Come scrive Daniel Miessler, "Gli analizzatori di protocollo come Wireshark sono fantastici, ma se vuoi davvero padroneggiare il pacchetto fu, devi prima diventare tutt'uno con tcpdump."