Vai al contenuto

4. Wireshark Essentials

Wireshark,1 precedentemente noto come Ethereal,2 è lo strumento di analisi dei pacchetti de facto. Wireshark può dissezionare un gran numero di protocolli comuni, tra cui Ethernet, IP, TCP, UDP e 802.11, e altri più esoterici come ATM3 ed EtherCAT.4 Gestisce la cattura in tempo reale su diversi mezzi, può aprire o salvare dati in numerosi formati di cattura e ci consente di effettuare analisi e grafici dei dati. I filtri di visualizzazione e di cattura ci permettono di restringere la quantità di dati visualizzati e ricevuti, il che risulta spesso molto utile.

Ultimo ma non meno importante, Wireshark è disponibile su un'ampia varietà di sistemi operativi sia come GUI sia come strumento da riga di comando chiamato TShark.5 Wireshark include altri strumenti da riga di comando, tra cui dumpcap,6, che gestisce la cattura dei pacchetti ma non esegue alcuna dissezione, e SSHdump, che semplifica la cattura remota dei pacchetti tramite SSH. Sono forniti anche numerosi altri utilità.

In questo modulo esploreremo le funzionalità di Wireshark specifiche per il Wi-Fi.

1 (Wireshark Foundation, 2021), https://www.wireshark.org/ ↩︎

2 (Linux.com, 2006), https://www.linux.com/news/ethereal-changes-name-wireshark ↩︎

3 (Wikipedia, 2021), https://en.wikipedia.org/wiki/Asynchronous_transfer_mode ↩︎

4 (Wikipedia, 2021), https://en.wikipedia.org/wiki/EtherCAT ↩︎

5 (Wireshark Foundation, 2021), https://www.wireshark.org/docs/man-pages/tshark.html ↩︎

6 (Wireshark Foundation, 2021), https://www.wireshark.org/docs/man-pages/dumpcap.html ↩︎

4.1. Per iniziare

Per cominciare, esploriamo la GUI di Wireshark e discutiamo varie funzionalità e impostazioni. Wireshark catturerà i pacchetti Ethernet per impostazione predefinita, anche quando utilizziamo un'interfaccia wireless. Per raccogliere solo frame wireless grezzi, l'adattatore Wi-Fi deve essere messo in modalità monitor prima di avviare Wireshark.

Text Only
kali@kali:~$ sudo ip link set wlan0 down

kali@kali:~$ sudo iwconfig wlan0 mode monitor

kali@kali:~$ sudo ip link set wlan0 up

Listing 1 - Comandi per la modalità monitor

4.1.1. Schermata di benvenuto

All'avvio, Wireshark presenta una schermata simile a quella mostrata nella Figura 1 di seguito.

6601e6e24e845cc6f36b9a66832d6d28.png

Figura 1: Schermata di avvio di Wireshark

Questa schermata mostra il Display Filter, i file aperti di recente, la configurazione del Capture Filter, l'elenco delle interfacce, gli sparkline del traffico e altre informazioni rilevanti. Gli sparkline mostrano l'attività di rete su ciascuna interfaccia e salgono e scendono a seconda della quantità di traffico. Wireshark aggiorna l'elenco delle interfacce man mano che vengono rimosse o aggiunte, ma non mostra quelle che sono disattivate.

A destra della casella di testo del filtro di cattura c'è un menu a discesa che mostra i diversi tipi di interfacce disponibili. Selezionando e deselezionando le voci si mostrano o nascondono determinate interfacce in base al loro tipo. Selezioneremo Wireless per concentrarci solo sul wireless.

98dd8860d180fbb40cb104048ab9d019.png

Figura 2: Selettore dei tipi di interfaccia

Le opzioni mostrate nella Figura 2 sono dinamiche e dipendono da ciò che è disponibile sul sistema corrente. Se non ci sono interfacce wireless, l'opzione Wireless non sarà presente. Potremmo vedere altre categorie come USB per dispositivi USB, Bluetooth per dispositivi Bluetooth e Virtual per interfacce relative a software di virtualizzazione.

Dopo aver chiuso il selettore del tipo di interfaccia, l'elenco delle interfacce sotto la casella di testo del filtro di cattura si aggiornerà. In questo caso, poiché è selezionato solo Wireless, rimane solo l'interfaccia wlan0mon.

Ci sono due modi per avviare la cattura. Possiamo fare doppio clic sull'interfaccia oppure selezionare l'interfaccia e poi cliccare sulla pinna di squalo subito sotto il menu File. La pinna di squalo diventerà blu una volta scelta un'interfaccia.

d5ccfef57a0ae811da3dfee197d1ae70.png

Figura 3: Selettore dei tipi di interfaccia

4.1.2. Visualizzazione dei pacchetti

Una volta avviata la cattura, i pacchetti iniziano a comparire nella nostra visualizzazione. Possiamo vedere la finestra di Wireshark organizzata in tre riquadri.

  • Packet List contiene un elenco di tutti i pacchetti catturati con dettagli in colonne personalizzabili che contengono informazioni come sorgente, destinazione, protocollo, ecc.
  • Packet Details contiene i dettagli dissezionati del pacchetto attualmente selezionato.
  • Packet Bytes contiene la rappresentazione esadecimale dei byte effettivi del pacchetto. Quando un elemento è selezionato in Packet Details, i byte corrispondenti vengono evidenziati in questo campo.

5ebff264cf7fe64c0ba9490a0637c348.png

Figura 4: Cattura - Elenco pacchetti

Nell'angolo in alto a sinistra della nostra visualizzazione, la barra degli strumenti ora ha il pulsante Start Capture disattivato. Il pulsante rosso Stop Capture e il pulsante verde Restart Capture sono ora attivi.

Il layout dell'elenco pacchetti può essere riorganizzato in vari modi. Selezioniamo Edit > Preferences > Appearance > Layout per scegliere un'altra disposizione.

10643ce7e6a165d5f11b07e8afb93bf2.png

Figura 5: Cattura - Layout dell'elenco pacchetti

Possiamo cambiare il layout, l'ordine o disabilitare i riquadri se lo desideriamo. Selezioneremo il secondo layout, che posiziona Packet Details e Packet Bytes affiancati. Questo sarà utile quando esaminiamo il contenuto dei frame.

2554d4fc8b8747de52bb7756c6e83999.png

Figura 6: Cattura - Opzione di layout dell'elenco pacchetti

4.1.3. Barra degli strumenti wireless

La barra degli strumenti wireless di Wireshark ci permetterà di cambiare canale manualmente e di impostare la larghezza del canale. Questa barra degli strumenti è disabilitata per impostazione predefinita, ma può essere abilitata selezionando View > Wireless Toolbar.

73821be73f071890d8608a64776012b9.png

Figura 7: Casella di controllo della barra degli strumenti wireless

Una volta selezionata, la barra degli strumenti viene aggiunta sotto la barra degli strumenti del filtro di visualizzazione.

6595eb69429716169ca3a40120fa0d60.png

Figura 8: Casella di controllo della barra degli strumenti wireless

Il pulsante 802.11 Preferences, all'estrema destra della barra degli strumenti, è una scorciatoia alle preferenze del protocollo 802.11, che contiene varie impostazioni 802.11. Le esamineremo più avanti in questo modulo.

Wireshark non esegue il channel hopping.1 Rimarrà sul canale su cui si trova attualmente l'adattatore wireless. Per scansionare rapidamente tutti i canali su 2,4 GHz, possiamo eseguire il seguente script shell in background in un terminale.

Text Only
for channel in 1 6 11 2 7 10 3 8 4 9 5
do
  iw dev wlan0mon set channel ${channel}
  sleep 1
done

Listing 2 - Script semplice di channel hopping per Wireshark

Potremmo anche usare airodump-ng2 per eseguire il channel hopping. Airodump-ng è pensato come strumento completo per catturare frame wireless e ha un comportamento predefinito utile di channel hopping senza salvare alcun dato. Eseguire sudo airodump-ng wlan0mon otterrà un risultato simile allo script shell sopra.

1 (The Free Dictionary, 2021), https://idioms.thefreedictionary.com/channel+hopping ↩︎

2 (Aircrack-ng, 2020), https://aircrack-ng.org/doku.php?id=airodump-ng ↩︎

4.1.4. Salvataggio ed esportazione dei pacchetti

Dopo aver effettuato una cattura di pacchetti, possiamo salvare l'intero contenuto dell'elenco pacchetti in un file usando File > Save o File > Save As.... Il formato più comune è PCAP.1 Il file di cattura può essere compresso con GZIP per risparmiare spazio su disco.

Due dei formati meno comuni, come PCAPng2 e nanosecond PCAP, possono entrambi essere precisi al nanosecondo. Sono mille volte più precisi di PCAP, che usa la precisione al microsecondo. Detto questo, il formato PCAP regolare funziona benissimo per la maggior parte degli scenari e ha anche un'eccellente compatibilità con altri strumenti che gestiscono le catture di pacchetti.

Wireshark offre la possibilità di filtrare ciò che viene salvato in un file. Possiamo modificare questa opzione usando File > Export Specified Packets....

55ae95589bcdab079dcb1d71a0304ce3.png

Figura 9: Esportazione dei pacchetti specificati

Questo è simile a Save e Save as... ma con diverse opzioni mostrate nella casella in basso a sinistra. Selezionando Displayed si salvano solo i pacchetti mostrati come risultato di un filtro attualmente applicato. Captured salva tutti i pacchetti.

Possiamo affinare ulteriormente la scelta dei pacchetti usando i pulsanti di opzione.

  • All packets è l'opzione predefinita
  • Selected packets only salva uno o più pacchetti selezionati con il tasto B.
  • Marked packets only include i pacchetti contrassegnati nell'elenco pacchetti facendo clic destro e selezionando Mark/Unmark Packet.
  • First to last marked salva tutti i pacchetti tra il primo e l'ultimo pacchetto contrassegnato.
  • Range include i pacchetti i cui numeri di pacchetto rientrano in un intervallo specifico (ad esempio, pacchetti 5-10).
  • Remove ignored packets escluderà i pacchetti ignorati. Per ignorare un pacchetto, facciamo clic destro su di esso e selezioniamo Ignore/Unignore Packet.

Esercizi

  1. Collegare la scheda wireless e abilitare la modalità monitor.
  2. Aprire Wireshark e avviare la cattura dei frame.
  3. Abilitare la barra degli strumenti wireless e passare tra i canali 1, 6 e 11.
  4. Salvare il file di cattura per un uso successivo.

1 (Wireshark Foundation, 2015), https://wiki.wireshark.org/Development/LibpcapFileFormat ↩︎

2 (M. Tuexen, et al, 2021), https://datatracker.ietf.org/doc/html/draft-tuexen-opsawg-pcapng-02 ↩︎

4.2. Filtri di Wireshark

Come scopriremo, una cattura di pacchetti consiste nel raccogliere molti dati. I filtri ci permettono di ridurre la quantità di dati con cui dobbiamo confrontarci, in modo da occuparci solo di ciò che è necessario o rilevante. Wireshark usa due tipi di filtri per limitare ciò che deve essere analizzato: i display filters, che limitano i pacchetti visualizzati, e i capture filters, che limitano la quantità di dati catturati.

4.2.1. Filtri di visualizzazione di Wireshark

I display filters1 influenzano quali pacchetti sono visibili nell'elenco pacchetti di Wireshark. Questi filtri hanno impatto solo su ciò che viene visualizzato, il che significa che Wireshark potrebbe catturare pacchetti aggiuntivi che non sono visibili.

I filtri di visualizzazione vengono applicati e modificati nella barra degli strumenti Filter situata tra la barra degli strumenti Main e l'elenco pacchetti.

a32a7321adab48e0273102ba78a52891.png

Figura 10: Colonne dell'elenco pacchetti

Useremo i filtri di visualizzazione in diverse funzionalità per personalizzare Wireshark e semplificare il nostro lavoro.

Espressione del filtro di visualizzazione

Il modo migliore per comprendere la sintassi dei filtri di visualizzazione di Wireshark è crearne uno con la schermata Display Filter Expression. Selezioniamo Analyze > Display Filter Expression... per aprire la schermata con tutti i filtri disponibili.

07dbd1d0d9d9bc17b92a488f9342ada0.png

Figura 11: Costruttore di Display Filter Expression

Ogni filtro di visualizzazione ha un field name e una relation, nonché un value, se applicabile. La casella di testo evidenziata in verde è dove viene visualizzata l'espressione del filtro.

Possiamo pensare al field come a un oggetto con uno o più elementi. Il campo può essere costruito usando la dot-notation. Questo è simile a ciò che vedremmo nei linguaggi di programmazione orientati agli oggetti. Il Field Name mostra l'oggetto e una breve descrizione.

Passando il mouse nella finestra Relation viene visualizzato un pop-up che fornisce maggiori dettagli.

fbead0221b1b1a6ad901bd941f007e04.png

Figura 12: Costruttore di Display Filter Expression - Spiegazioni delle relazioni

La relation di un'espressione del filtro di visualizzazione può essere una delle seguenti: is present, ==, !=, <, >, >=, <=, contains, matches o in. A seconda del campo selezionato, non tutte le relazioni saranno disponibili.

Il campo Search, situato sotto l'elenco Field Name, è utile quando non riusciamo a ricordare un filtro specifico. Restringerà l'elenco dei nomi dei campi mentre digitiamo e mostrerà i risultati corrispondenti sia dai nomi che dalle loro descrizioni.

187a5f5350972b7786b7e726bfe0af57.png

Figura 13: Costruttore di Display Filter Expression - Ricerca di 'wlan.fc'

La finestra Predefined Values contiene diverse opzioni relative a diversi valori di byte in determinati campi dei pacchetti. Ad esempio, wlan.fc.type può avere quattro valori diversi: 0, 1, 2 e 3. Questi corrispondono rispettivamente ai frame Management, Control, Data e Extension. Il nostro filtro scelto "wlan.fc.type == 2" nella Figura 13 ha "byte value 2", che filtra i data frames.

Cliccando OK si aggiornano i contenuti della barra degli strumenti del filtro di visualizzazione con il filtro selezionato e i pacchetti risultanti, come mostrato nella Figura 14.

524b2a4d7037efa1a4fb8d8224f66eba.png

Figura 14: Costruttore di Display Filter Expression - Filtro applicato 'wlan.fc.type == 2'

Dettagli del pacchetto

Possiamo anche costruire filtri basati su elementi di un pacchetto selezionato. Illustriamo questo creando un filtro per pacchetti data frame. Inizieremo selezionando un pacchetto data dall'elenco pacchetti.

7888ba6564ff16e6102883432f6766d3.png

Figura 15: Costruttore di Display Filter Expression - Data frame

Nella finestra dei dettagli del pacchetto, espandiamo il campo IEEE 802.11 Data, Flags e il Frame Control Field, poi facciamo clic destro sull'elemento Type: Data frame (2). Infine, selezioneremo Apply as Filter (selezionando Analyze nella barra degli strumenti Main vengono mostrate anche queste opzioni).

6fece73963d8cd4bc51ceb9cfd0cab51.png

Figura 16: Sottomenu Apply as Filter

Ora abbiamo diverse opzioni tra cui scegliere.

  • Selected cancella la barra del filtro di visualizzazione da eventuali query esistenti e genera una nuova query per cercare questo valore specifico. Ad esempio, wlan.fc.type con un valore di "2" genera "wlan.fc.type == 2" nella barra del filtro di visualizzazione.
  • ... and Selected aggiunge a qualsiasi query esistente usando una condizione AND (&&). Prendendo la query creata sopra e aggiungendo un valore wlan.fc.subtype di "0" si genera "(wlan.fc.type == 2) && (wlan.fc.subtype== 0)" nella barra del filtro di visualizzazione.
  • ... or Selected fa la stessa cosa del filtro sopra ma invece di usare un AND, usa una condizione OR (||).

Tutte le scelte contenenti "Not" negano il loro equivalente in forma positiva. Ad esempio, se abbiamo "wlan.fc.type == 2" come filtro esistente e usiamo ... and not Selected con wlan.fc.subtype e valore "0", il filtro diventa "(wlan.fc.type == 2) && !(wlan.fc.subtype == 0)".

Si noti che Apply as filter costruisce e applica il filtro immediatamente. Prepare a filter, invece, aggiorna solo i contenuti della barra del filtro di visualizzazione e non applica il filtro finché non clicchiamo Apply display filter alla fine della casella di testo del filtro di visualizzazione.

dea2e284c8ec7b537bddad8589fc4395.png

Figura 17: Sottomenu Apply as Filter

Prepare a filter è utile quando vogliamo costruire un filtro complesso che richiederà più passaggi. Man mano che l'elenco dei pacchetti raccolti si allunga, può richiedere tempo elaborare ogni nuovo sottofiltro applicato. Potrebbe essere più semplice attendere di applicare il filtro dopo aver terminato di scrivere la query completa.

Barra degli strumenti del filtro di visualizzazione

Possiamo anche creare e accedere ai filtri di visualizzazione direttamente nella barra degli strumenti Display Filter. A sinistra, un'icona a forma di nastro blu ci porta ai filtri salvati nei segnalibri.

18ee9ce051fef81d074245348746098b.png

Figura 18: Barra Display Filter

A destra della barra del filtro c'è una freccia e un'icona a discesa. La freccia applicherà il filtro, mentre il menu a discesa mostrerà i filtri di visualizzazione più recenti.

6eb4d1a50e5d0a5d3e751097fa6318e1.png

Figura 19: Barra Display Filter - Menu a discesa dei filtri recenti

Quando si crea un filtro, l'autocompletamento di Wireshark mostra filtri validi mentre l'espressione viene digitata.

3d08c4d44793282bc4efe5b0ddf7efc5.png

Figura 20: Autocompletamento del filtro di visualizzazione

La barra degli strumenti fornisce suggerimenti di filtraggio con sfondi colorati. Un filtro valido viene visualizzato con uno sfondo verde. Un filtro non valido è indicato da uno sfondo rosso. Ad esempio, il filtro "wlan.fc.type = 1" è sintatticamente errato perché usa un solo "=", quindi appare con uno sfondo rosso.

58e870a318b4d02aebe9ad4700ba12c8.png

Figura 21: Filtro non valido

Uno sfondo giallo indica un filtro possibilmente discutibile.

e8f0574097a4c3a61ee875e9a3e0823b.png

Figura 22: Filtro con risultati possibilmente inattesi

Il giallo non significa sempre che il filtro sia errato. Nella maggior parte dei casi sarà corretto, poiché la maggior parte dei filtri fa riferimento a un singolo campo. In questo esempio specifico, è corretto e mostrerà i pacchetti con un wlan.fc.type con un valore diverso da "1". È buona pratica usare il doppio uguale e poi negare l'intera espressione. Questo si scriverebbe come "!(wlan.fc.type == 1)".

Segnalibri dei filtri di visualizzazione

Quando si filtrano molti pacchetti, potremmo voler riutilizzare i filtri. È qui che entrano in gioco i segnalibri. Ci permettono di salvare i filtri di visualizzazione per un uso successivo. Il pulsante dei segnalibri si trova a sinistra della barra degli strumenti Display Filter.

a22c304bac3e6c0ffc82c8989ce2317a.png

Figura 18: Barra Display Filter

Cliccando sul segnalibro si visualizza un set predefinito di filtri di visualizzazione e eventuali filtri salvati aggiuntivi.

4685a14e88f9c3dff36932f6a8fcaf4e.png

Figura 23: Barra Display Filter

Quando un filtro valido è nella barra degli strumenti Display Filter, Save this filter è cliccabile nel menu a discesa dei segnalibri. Salvare il filtro apre la schermata Display Filters e il nuovo filtro viene visualizzato in fondo all'elenco. Selezionando OK si salva il filtro nell'elenco dei segnalibri.

6833c40a8097fab57f71d63713999e1f.png

Figura 24: Finestra del filtro di visualizzazione - Salvataggio del filtro

Possiamo creare e salvare un nuovo filtro selezionando Manage Display Filters dal menu a discesa dei segnalibri oppure tramite Analyze > Display Filters.... Entrambe le opzioni aprono la schermata Display Filters.

Possiamo modificare un filtro esistente selezionandolo e applicando modifiche valide. Le modifiche valide sono indicate dallo sfondo verde (o giallo) nel campo Filter. I filtri dall'elenco possono essere eliminati con il pulsante meno ("-") o duplicati con il pulsante Copy.

Pulsanti del filtro di visualizzazione

Possiamo aggiungere una scorciatoia alla barra degli strumenti Display Filter per i filtri usati frequentemente selezionando l'icona più ("+") situata all'estrema destra della barra degli strumenti. Questo apre un pannello Create Shortcut Button.

94c7e57a5d76a02bae6913392f15607f.png

Figura 25: Impostazioni del pulsante Display Filter

Inseriremo il nome della scorciatoia nel campo Label e il filtro nel campo Filter. Il campo Comment è per una descrizione che appare quando si passa il mouse sulla scorciatoia.

Creiamo un pulsante "Data" usando il nostro filtro per data frame "wlan.fc.type == 2" e un commento "802.11 data frames".

a50e3262eeb527b45b8351fe8346bf6f.png

Figura 26: Creazione del pulsante Display Filter

Selezionando OK si crea il nostro pulsante Data a destra nella barra degli strumenti Display Filter. Passando il mouse sul pulsante viene visualizzato il commento del filtro.

72b26162f93f3e5df55e2cea596bd30e.png

Figura 27: Pulsante Display Filter

Cliccando sul nostro nuovo pulsante si imposta il contenuto della barra degli strumenti del filtro su "wlan.fc.type == 2". Facendo clic destro sul pulsante abbiamo opzioni per modificare, disabilitare o rimuovere il pulsante.

d7ab7f35210fc9cb695b10e6fed8f262.png

Figura 28: Preferenze dei pulsanti Display Filter

La modifica di un pulsante riaprirà il pannello di creazione sotto la barra Display Filter. Questa volta, il pannello di creazione sarà precompilato con le impostazioni esistenti del pulsante.

I pulsanti del filtro possono anche essere creati, eliminati o modificati tramite Edit > Preferences... e selezionando Filter Buttons nel pannello sinistro.

a516a2a641c156fcb3ea1e7c47a91ace.png

Figura 29: Preferenze dei pulsanti Display Filter

Esercizio

Configurare l'AP di laboratorio per usare la crittografia WPA, con TKIP o CCMP (a volte mostrato come AES). Assicurarsi che la scheda wireless sia in modalità monitor sullo stesso canale dell'AP.

Con una cattura in corso, creare un filtro di visualizzazione per il BSSID dell'AP di laboratorio. Il BSSID è solitamente stampato su un'etichetta sul retro dell'AP, ma può anche essere trovato nei frame cercando i Beacon frame con il proprio SSID.

1 (Wireshark Foundation, 2017), https://wiki.wireshark.org/DisplayFilters ↩︎

4.2.2. Filtri di cattura di Wireshark

I Capture Filters1 permettono a Wireshark di raccogliere solo un tipo specifico di dati. I filtri di visualizzazione, di cui abbiamo appena discusso, riducono la quantità di dati visualizzati, mentre i filtri di cattura limitano la quantità di dati ricevuti. Sebbene possano sembrare simili, ci sono diverse ragioni per cui potremmo optare per i filtri di cattura invece dei filtri di visualizzazione.

Warning

I filtri di cattura sono anche talvolta chiamati Berkeley Packet Filters (BPF).2

Durante la cattura, Wireshark e tshark memorizzano temporaneamente e dissezionano ogni pacchetto in memoria (salvo diversa indicazione nelle opzioni). Man mano che la quantità di dati aumenta, crescono i requisiti di memoria e CPU. Se i pacchetti non possono essere dissezionati, potrebbero essere scartati, e uno di quei pacchetti scartati potrebbe contenere informazioni cruciali. Usare un filtro di cattura ci permette di ridurre la quantità di dati catturati in modo da concentrarci sui dati di cui abbiamo realmente bisogno.

Un'altra ragione per usare un filtro di cattura è quando ci è permesso guardare solo traffico specifico, ad esempio quando si isola il traffico di uno o più dispositivi.

Dobbiamo fare attenzione quando creiamo questo tipo di filtro, poiché non possiamo recuperare dati che non catturiamo. Se commettiamo un errore con un filtro di visualizzazione, possiamo semplicemente rimuovere il filtro per "mostrare" i pacchetti necessari.

I filtri di cattura per il Wi-Fi sono limitati al filtraggio su indirizzi MAC e su tipi/sottotipi di frame. Sono documentati nella man page pcap-filter.3

Esempio: Filtrare i Beacon

Il tipo più comune di frame Wi-Fi sono i beacon. Ogni AP li invia circa 10 volte al secondo per annunciare la propria presenza. I Beacon frame non sono particolarmente utili quando si esamina il traffico e sono spesso il primo tipo di frame escluso usando i filtri di visualizzazione. Possiamo risparmiare un po' di tempo filtrandoli in anticipo. Selezioniamo la nostra interfaccia wireless (wlan0mon) e poi inseriamo "not subtype beacon" nel campo del filtro di cattura.

26eb23fdd6def353709e35c13b143f94.png

Figura 30: Filtro di cattura - ignorare i beacon

Poi clicchiamo la pinna di squalo per avviare la nostra cattura senza Beacon frame, eliminando così traffico e dati non necessari.

310a9d4df3885bc595538d3e178ba81c.png

Figura 31: Filtro di cattura - Cattura

I filtri di cattura affinano i nostri risultati in base ai valori in ogni frame che riceviamo. Uno di questi valori contenuti in un frame wireless è compreso tra uno e quattro indirizzi MAC.4 Per catturare solo i frame di un dispositivo specifico, dovremo costruire un filtro che corrisponda a uno di questi indirizzi.

Proviamo a catturare il traffico wireless del dispositivo 3A:30:F9:0F:E1:95. Avvieremo la nostra cattura con il seguente filtro. Per assicurarci di catturare tutto il traffico rilevante, includiamo tutte e quattro le possibili posizioni in cui potrebbe comparire il nostro indirizzo MAC.

Text Only
(wlan addr1 3A:30:F9:0F:E1:95) or (wlan addr2 3A:30:F9:0F:E1:95) or (wlan addr3 3A:30:F9:0F:E1:95) or (wlan addr4 3A:30:F9:0F:E1:95)

Listing 3 - Filtraggio per un dispositivo

Le parentesi incluse qui sono opzionali, ma rendono il filtro un po' più facile da leggere.

bb59ad7903afd365e179c6b92f8c08d4.png

Figura 32: Filtro di cattura - Cattura di un dispositivo specifico

Nella Figura 32, vediamo che il nostro filtro ha avuto successo. Stiamo catturando solo frame relativi al dispositivo specificato.

Combiniamo il nostro filtro di cattura del dispositivo con il filtro dei Beacon frame.

((wlan addr1 3A:30:F9:0F:E1:95) or (wlan addr2 3A:30:F9:0F:E1:95) or (wlan addr3 3A:30:F9:0F:E1:95) or (wlan addr4 3A:30:F9:0F:E1:95)) and (not subtype beacon)

Listing 4 - Filtro di cattura del dispositivo con il filtro dei Beacon frame

Stiamo ancora catturando frame di controllo di cui non abbiamo bisogno, come acknowledgement, request to send (rts), clear to send (cts), ecc. Possiamo filtrarli con "not type control".

Ci sono altri frame che possiamo filtrare. Escludiamo i frame di gestione di cui non abbiamo bisogno, come probe request e response. Possiamo farlo con "not subtype probe-req" e "not subtype probe-resp". Li aggiungeremo al nostro filtro di cattura.

((wlan addr1 3A:30:F9:0F:E1:95) or (wlan addr2 3A:30:F9:0F:E1:95) or (wlan addr3 3A:30:F9:0F:E1:95) or (wlan addr4 3A:30:F9:0F:E1:95)) and not (subtype beacon) and not (type ctl) and not (subtype probe-req) and not (subtype probe-resp)

Listing 5 - Il nostro filtro di cattura esteso

Il filtro di cattura è piuttosto lungo, quindi potremmo volerlo salvare per un uso futuro. Cliccheremo sul segnalibro per visualizzare l'opzione Save this filter nonché un set predefinito di filtri di cattura e eventuali filtri salvati in precedenza.

261bdc47ab3577a32ba11a07e8f974c3.png

Figura 33: Filtro di cattura - Segnalibri dei filtri di cattura

Selezioneremo l'opzione di salvataggio, che apre la schermata Manage Capture Filters. Salviamo il nostro nuovo filtro di cattura come "wifu".

b5f366156ea379ca2009a7486634030a.png

Figura 34: Filtro di cattura - Salvataggio di un filtro di cattura

Infine, applicheremo il filtro salvato. Ora la nostra cattura raccoglie solo frame rilevanti.

3dd0c13f07e11ea7f96e7ad8f159811c.png

Figura 35: Filtro di cattura - frame rilevanti

Esercizio

Avviare una cattura di pacchetti in Wireshark con un filtro di cattura per:

  1. Beacon
  2. Probe (request e response)
  3. Association (request e response)
  4. Data (qualsiasi)
  5. Un indirizzo MAC specifico

1 (Wireshark Foundation, 2016), https://wiki.wireshark.org/CaptureFilters ↩︎

2 (Wikipedia, 2021), https://en.wikipedia.org/wiki/Berkeley_Packet_Filter ↩︎

3 (Tcpdump Group, 2021), https://www.tcpdump.org/manpages/pcap-filter.7.html ↩︎

4 (Wi-Fi Notebook, 2013), http://80211notes.blogspot.com/2013/09/understanding-address-fields-in-80211.html ↩︎

4.3. Wireshark da riga di comando

Sebbene Wireshark sia una GUI, ha numerosi parametri utili da riga di comando. Per visualizzare un elenco di tutti i parametri possibili, possiamo eseguire wireshark --help dalla riga di comando. Il Listing 6 mostra alcune delle opzioni più utili di Wireshark.

Text Only
kali@kali:~$ wireshark --help
Wireshark 3.2.1 (Git v3.2.1 packaged as 3.2.1-1)
Interactively dump and analyze network traffic.
See https://www.wireshark.org for more information.

Usage: wireshark [options] ... [ <infile> ]

Capture interface:
  -i <interface>, --interface <interface>
                           name or idx of interface (def: first non-loopback)
  -f <capture filter>      packet filter in libpcap filter syntax
  -s <snaplen>, --snapshot-length <snaplen>
                           packet snapshot length (def: appropriate maximum)
...
  -k                       start capturing immediately (def: do nothing)
...
  -I, --monitor-mode       capture in monitor mode, if available
...
  -D, --list-interfaces    print list of interfaces and exit
...

Listing 6 - Elenco delle interfacce di Wireshark

Esaminiamo gli elementi mostrati nel listing sopra.

L'opzione -D elenca tutte le interfacce disponibili insieme ai loro numeri di indice.

Text Only
kali@kali:~$ sudo wireshark -D
Capture-Message: 14:05:44.552: Capture Interface List ...
Capture-Message: 14:05:44.697: Loading External Capture Interface List ...
1. eth0
2. lo (Loopback)
3. any
4. wlan0mon
5. nflog
6. nfqueue
7. ciscodump (Cisco remote capture)
8. dpauxmon (DisplayPort AUX channel monitor capture)
9. randpkt (Random packet generator)
10. sdjournal (systemd Journal Export)
11. sshdump (SSH remote capture)
12. udpdump (UDP Listener remote capture)

Listing 7 - Elenco delle interfacce di Wireshark

L'opzione -i serve a specificare il nome o l'indice dell'interfaccia su cui catturare. Deve essere seguita dal nome o dall'indice dell'interfaccia. Usare un singolo trattino, -, come nome dell'interfaccia catturerà su STDIN. Questo sarà utile quando si usano le pipe, come spiegheremo più avanti.

È comune usare l'opzione -k dopo -i. L'opzione -k avvia automaticamente la cattura. Con la nostra interfaccia wireless in modalità monitor, possiamo avviare la nostra cattura con il seguente comando.

Text Only
kali@kali:~$ sudo wireshark -i wlan0mon -k
QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root'
...

Listing 8 - Avvio della cattura su wlan0mon

Questo aprirà automaticamente la GUI con la cattura di pacchetti in esecuzione.

Uno scenario in cui potremmo usare -i senza -k è quando vogliamo avviare Wireshark, selezionare un'interfaccia che non è ancora attiva e poi avviare manualmente la cattura una volta che l'interfaccia è attiva. Per ora, continuiamo a usare -k.

Aggiungiamo l'opzione -I, che abilita la modalità monitor nell'interfaccia wireless selezionata.

Text Only
kali@kali:~$ sudo wireshark -i wlan0 -I -k
QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root'
...

Listing 9 - Impostazione di wlan0 in modalità monitor e avvio della cattura

Possiamo anche usare l'opzione -i con l'indice di un'interfaccia. Abbiamo verificato l'indice nel Listing 7. Sostituiamo wlan0mon con il numero di indice corrispondente, 4.

Text Only
kali@kali:~$ sudo wireshark -i 4 -I -k
QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root'
...

Listing 10 - Avvio della cattura con l'indice dell'interfaccia

Continuiamo ad aggiungere a questo comando. Possiamo aggiungere un filtro di cattura per Beacon frame con l'opzione -f.

Text Only
kali@kali:~$ sudo wireshark -i wlan0mon -k -f "not subtype beacon"
QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root'

Listing 11 - Avvio della cattura con un filtro di cattura per Beacon frame

Wireshark può catturare i primi byte di ogni frame invece dell'intero frame con l'opzione -s seguita dalla lunghezza in byte.

Text Only
kali@kali:~$ sudo wireshark -i wlan0mon -k -s 60
QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root'

Listing 12 - Avvio della cattura con una lunghezza snapshot di 60 byte

Possiamo anche usare Wireshark semplicemente per aprire file di cattura, con o senza parametri aggiuntivi. Se usiamo parametri, dobbiamo specificarli prima del nome del file di cattura. I file di cattura di solito hanno un'estensione .cap o .pcap.

Text Only
kali@kali:~$ wireshark wifi.pcap 
16:36:29.699          Warn Invalid borders specified for theme pixmap:
        /usr/share/themes/Kali-Dark/gtk-2.0/assets/trough-scrollbar-horiz.png,
borders don't fit within the image
...

Listing 13 - Apertura di wifi.pcap

Wireshark non necessita di privilegi elevati (sudo) quando apre file, a meno che i permessi del file non lo richiedano.

Esercizi

Avviare Wireshark dalla riga di comando usando le seguenti opzioni:

  1. Avviare la cattura immediata con l'interfaccia wireless.
  2. Avviare la cattura immediata e impostare l'interfaccia wireless in modalità monitor.
  3. Avviare la cattura immediata con un filtro di cattura.
  4. Aprire un file .pcap.

4.4. Cattura remota dei pacchetti

Non solo possiamo usare Wireshark per catturare pacchetti che passano attraverso un'interfaccia locale, ma può anche catturare pacchetti in remoto dall'interfaccia di un altro sistema. Questo è utile quando il sistema locale non ha la capacità di catturare pacchetti, o quando stiamo cercando di diagnosticare un problema da remoto.

Ci sono diversi modi per catturare pacchetti in remoto. Il primo, usando la riga di comando, è eseguire un comando in remoto tramite SSH, inviare l'output e canalizzarlo verso Wireshark. Potremmo anche usare lo strumento integrato di Wireshark, SSHdump,1 per ottenere lo stesso risultato della riga di comando.

SSHdump è più semplice e conveniente, ma le opzioni da riga di comando sono più stabili.

Diamo un'occhiata rapida ad altri due metodi per la cattura remota. Per prima cosa, potremmo usare un RPCAP URI.2 Questo funziona solo su Windows, dove la cattura di pacchetti Wi-Fi è severamente limitata. In secondo luogo, potremmo usare udpdump3 per ricevere dati tramite un listener UDP. Entrambi questi metodi hanno un uso molto limitato e non saranno pratici per i nostri scopi.

1 (Dario Lombardo), https://www.wireshark.org/docs/man-pages/sshdump.html ↩︎

2 (WinPcap, 2007), https://www.winpcap.org/docs/docs_40_2/html/group__remote.html ↩︎

3 (Wireshark Foundation, 2021), https://www.wireshark.org/docs/man-pages/udpdump.html ↩︎

4.4.1. Configurazione della cattura remota dei pacchetti

Iniziamo a lavorare verso la cattura remota dei pacchetti. Cominceremo localmente, coprendo come catturare e inviare pacchetti wireless su STDOUT. Poi copriremo come canalizzare i pacchetti wireless da STDOUT verso Wireshark. Infine, copriremo come combinare queste due operazioni, eseguendo la prima parte in remoto e la seconda localmente.

Cattura e output dei pacchetti su STDOUT

Possiamo usare qualsiasi strumento in grado di catturare dati e inviarli su STDOUT. Quelli che dimostreremo qui saranno tcpdump, dumpcap e tshark.

Poiché non tutti gli strumenti saranno disponibili su tutti i sistemi, è importante per noi sapere come usare ciascuno di essi. Un'altra cosa da considerare è l'utilizzo della CPU. Dumpcap ha un overhead inferiore rispetto a tcpdump e tshark. La differenza nell'utilizzo della CPU tra questi strumenti può essere trascurabile quando si usa un desktop o un laptop come dispositivo di cattura remota. È più probabile che noteremo una differenza quando iniziamo a trasferire più traffico o se usiamo dispositivi a basso consumo come router, single-board computer (SBC),1 o access point come dispositivi di cattura.

Iniziamo con tcpdump. Supponendo di aver abilitato la modalità monitor, possiamo specificare la nostra interfaccia di cattura con -i wlan0mon. Scriveremo i pacchetti grezzi in un file con -w ma su STDOUT con un trattino, -, piuttosto che in un nome file. Poi, l'opzione -U invia ogni pacchetto appena arriva. Quest'ultima opzione è utile poiché il comportamento predefinito è attendere che il buffer del sistema si riempia prima di inviare burst di output dei pacchetti.

Text Only
kali@kali:~$ sudo tcpdump -i wlan0mon -w - -U
�ò�tcpdump: listening on wlan0mon, link-type IEEE802_11_RADIO (802.11 plus radiotap header), capture size 262144 bytes

Listing 14 - Output di TCPdump su stdout

Esaminiamo un po' l'output di tcpdump. I caratteri non stampabili sono il .pcap grezzo che verrà decodificato da Wireshark.

Per inciso, questo messaggio del link type viene inviato su STDERR per l'output nel terminale. I caratteri non stampabili vengono inviati su STDOUT e saranno ciò che useremo con Wireshark.

Usciamo da tcpdump con C+c e le statistiche della cattura vengono visualizzate nella console.

Text Only
151 packets captured
160 packets received by filter
0 packets dropped by kernel
1 packet dropped by interface

Listing 15 - Statistiche di TCPdump all'uscita da Wireshark

L'utilizzo dello strumento dumpcap è simile a tcpdump quando si inviano i dati catturati su STDOUT. Una differenza è che dumpcap richiede l'opzione -P per inviare i dati in formato PCAP.

Text Only
kali@kali:~$ sudo dumpcap -w - -P -i wlan0mon
Capturing on 'wlan0mon'
�ò�File: -
9UY^m*.Hl   �������������5����5��1�d
...

Listing 16 - Output di dumpcap su stdout

Per fare la stessa cosa con tshark, useremmo il comando seguente.

Text Only
kali@kali:~$ sudo tshark -w - -i wlan0mon
Running as user "root" and group "root". This could be dangerous.
Capturing on 'wlan0mon'

�M<+���������6Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz (with SSE4.2)Linux 5.4.0-kali3-amd64:Dumpcap (Wireshark) 3.2.1 (Git v3.2.1 packaged as 3.2.1-1)�wlan0mon
...

Listing 17 - Output di tshark su stdout

Canalizzare i pacchetti verso Wireshark

Ora che comprendiamo le basi della cattura di pacchetti su STDOUT, il passo successivo è canalizzare i pacchetti verso Wireshark.

Le pipe sono una forma di oggetti di Inter-Process Communication (IPC) di cui esistono due tipi: named pipe e unnamed pipe.

Le named pipe, note anche come oggetti IPC First in, First out (FIFO), sono presenti nel filesystem e consentono comunicazioni bidirezionali.

Le unnamed pipe, note anche come oggetti IPC senza nome, usano la funzione pipe(). Un modo in cui potremmo usare questa funzione è quando concateniamo comandi nei terminali usando il carattere pipe (|).2

La scelta tra un tipo o l'altro dipende dall'applicazione, dalle sue opzioni e dalle sue capacità.3 Alcune applicazioni potrebbero non supportarne nessuna e altre potrebbero supportare solo un tipo. Nel caso di Wireshark, entrambe le opzioni sono disponibili.

Unnamed pipe

Le unnamed pipe ci permettono di concatenare comandi passando l'output di un comando all'input di un altro. Mostreremo un esempio con il seguente comando.

Text Only
kali@kali:~$ ls /var/log | more

Listing 18 - Esempio di pipe

Nel Listing 18, abbiamo eseguito due comandi. Il primo è ls /var/log, che elenca il contenuto della directory /var/log. Poiché l'output del comando potrebbe essere troppo lungo per adattarsi al display del terminale, canalizzare l'output verso il comando more ci permetterà di scorrere i risultati pagina per pagina. In questo caso, l'output del primo comando diventa l'input per il secondo comando.

Non siamo limitati all'uso di una singola pipe. Esploriamo un po' le possibilità costruendo sul comando precedente. Inseriremo sort tra ls /var/log e more per ordinare l'elenco di file e directory in ordine inverso. Dopo averlo fatto, more ci permetterà di scorrere i risultati appena ordinati.

Text Only
kali@kali:~$ ls /var/log | sort -r | more

Listing 19 - Concatenazione di comandi usando più pipe

Applichiamo questo concetto alla cattura di pacchetti avviando il nostro comando tcpdump (o un equivalente dumpcap o tshark) e canalizzando l'output verso Wireshark.

Text Only
kali@kali:~$ sudo tcpdump -U -w - -i wlan0mon | wireshark -k -i -
tcpdump: listening on wlan0mon, link-type IEEE802_11_RADIO (802.11 plus radiotap header), capture size 262144 bytes

Listing 20 - Cattura del traffico e canalizzazione verso Wireshark

Wireshark si avvia e visualizza i frame wireless in arrivo man mano che arrivano.

f58d26e60140903c1e7e854f03c59694.png

Figura 36: Output live di tcpdump canalizzato verso Wireshark

Poiché le pipe trasferiscono solo STDOUT, quei dati diventano STDIN per ciò che viene visualizzato in Wireshark. Tutto ciò che vediamo nel terminale dei comandi è STDERR.

Dispositivi named pipe

Le named pipe sono simili alle unnamed pipe. Permettono anche a due o più processi di comunicare, ma, come suggerisce il nome, hanno un nome e (nel caso dei sistemi operativi *Nix) sono presenti nel filesystem. Questo ha il vantaggio aggiuntivo di permetterci di impostare i permessi e limitare l'accesso.

Il nostro focus è su Linux, ma le named pipe esistono anche su Windows, dove sono gestite in modo leggermente diverso.4

Creiamo la named pipe usando mkfifo seguito dal percorso scelto.

Text Only
kali@kali:~$ mkfifo /tmp/named_pipe

kali@kali:~$ ls -l /tmp/named_pipe
prw-r--r-- 1 kali kali 0 Jul 27 20:47 /tmp/named_pipe

Listing 21 - Creazione e verifica della named pipe

La "p" all'inizio dei permessi del file indica che si tratta di una pipe.

L'opzione -i di Wireshark è piuttosto versatile. Usiamo questa named pipe come nostra interfaccia.

Text Only
kali@kali:~$ sudo wireshark -k -i /tmp/named_pipe

Listing 22 - Avvio della cattura con Wireshark su una named pipe

Dopo aver eseguito il comando, Wireshark si avvia ma non visualizzerà pacchetti finché un altro strumento di cattura non scrive dati nella named pipe.

Un'altra opzione è configurare la nostra named pipe dall'interno di Wireshark. Nel menu di Wireshark, navigheremo verso Capture > Options....

6027fc9f084370395954975dcb1cf602.png

Figura 37: Elenco delle interfacce di cattura

Clicchiamo sul pulsante Manage Interfaces, selezioniamo la scheda Pipes e clicchiamo su + per creare una nuova pipe. Infine, inseriremo il percorso della named pipe, /tmp/named_pipe.

5c531c61335396dfdac3f96d2bd2e9e8.png

Figura 38: Gestione interfacce - Named pipe

Una volta fatto, clicchiamo OK e la pipe viene aggiunta all'elenco delle interfacce.

cda7943bcb827ad2fcc14abf8506562e.png

Figura 39: Elenco delle interfacce di cattura con named pipe aggiunta

Selezioniamo la named pipe e clicchiamo Start. Ancora una volta, Wireshark non visualizzerà pacchetti wireless finché uno strumento di cattura non scrive dati nella named pipe.

Avviamo la cattura dei pacchetti in un terminale.

Text Only
kali@kali:~$ sudo tcpdump -U -w - -i wlan0mon > /tmp/named_pipe

Listing 23 - Avvio della cattura su wlan0mon e invio dei dati alla named pipe

I pacchetti wireless verranno ora visualizzati in Wireshark.

Per riassumere, la differenza tra i due metodi di pipe è che la unnamed pipe scrive i dati dello strumento di cattura direttamente in Wireshark. D'altra parte, Wireshark usa la named pipe come interfaccia e poi i dati dello strumento di cattura vengono scritti nella named pipe.

Eseguire il comando in remoto

Ora che abbiamo una buona base, vediamo come appare quando coinvolgiamo effettivamente un sistema remoto su cui abbiamo accesso SSH. SSH è versatile e, sebbene sia utile per amministrare sistemi remoti con una shell interattiva, ha anche la capacità di eseguire un comando, visualizzare l'output su STDOUT e poi uscire.

Con l'interfaccia wireless di un sistema remoto in modalità monitor, avviare una cattura remota è solo questione di mettere insieme i pezzi con una sessione SSH.

Per prima cosa, ci connettiamo al sistema remoto con il comando SSH seguito dal nostro comando tcpdump. Poi canalizziamo questo in wireshark.

È sempre una buona idea racchiudere il comando tra virgolette doppie per assicurarsi che i parametri non diventino accidentalmente parametri SSH.

Text Only
kali@kali:/$ ssh root@10.11.0.196 "sudo -S tcpdump -U -w - -i wlan0mon" | sudo wireshark -k -i -
QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root'
root@10.11.0.196's password:******
tcpdump: listening on wlan0mon, link-type IEEE802_11_RADIO (802.11 plus radiotap header), capture size 262144 bytes

Listing 24 - Cattura del traffico con tcpdump su host remoto e canalizzazione verso Wireshark

Una volta eseguito il comando, Wireshark si avvia sulla nostra macchina locale e il terminale richiede la password SSH del sistema remoto. Dopo aver inserito la password, i dati catturati vengono scritti in Wireshark, che visualizza i frame wireless man mano che arrivano.

Esercizi

  1. Usando una unnamed pipe, eseguire tcpdump con il dispositivo wireless e indirizzarlo verso Wireshark.
  2. Usando una named pipe, eseguire tcpdump con il dispositivo wireless e indirizzarlo verso Wireshark.
  3. Avviare un comando tcpdump SSH remoto e canalizzare la cattura verso Wireshark. Questo può essere eseguito tramite localhost, verso un'altra macchina virtuale o verso un altro sistema su cui si ha accesso SSH.

1 (Wikipedia, 2021), https://en.wikipedia.org/wiki/Single-board_computer ↩︎

2 (Brandon Wamboldt, 2014), https://web.archive.org/web/20210424033800/https://brandonwamboldt.ca/how-linux-pipes-work-under-the-hood-1518/ ↩︎

3 (Jyoti Singh, 2018), https://web.archive.org/web/20200429051020/https://www.embhack.com/pipe-and-fifo/ ↩︎

4 (Wireshark Foundation, 2020), https://wiki.wireshark.org/CaptureSetup/Pipes ↩︎

4.4.2. Wireshark integrato

Esaminiamo come effettuare la cattura remota dei pacchetti con SSH all'interno di Wireshark. Se in precedenza abbiamo isolato i nostri dispositivi solo alle interfacce wireless, possiamo rifocalizzarci sui dispositivi External Capture. Selezioneremo External Capture e poi deselezioneremo tutti gli altri nel menu a discesa delle interfacce.

0a66710377ef60ef0279a8ea12d98f42.png

Figura 40: Interfacce virtuali esterne nel menu a discesa

Poi clicchiamo sull'ingranaggio a sinistra di SSH remote capture: sshdump in fondo alla sezione Capture per aprire la finestra delle opzioni.

4fa38c905543026c2b13516ade45984c.png

Figura 41: Interfacce virtuali esterne

Warning

Wireshark tipicamente cattura dalle interfacce sul sistema locale. Queste interfacce "External Capture" usano ExtCap,1 che permette agli eseguibili di essere visti come interfacce di cattura. Tutti questi sono binari separati: ciscodump, dpauxmon, randpkt, sdjournal, sshdump e udpdump. Forniscono dati in formato PCAP e si trovano nella directory /usr/lib/x86_64-linux-gnu/wireshark/extcap/ (su un Kali a 64 bit). Alcuni di questi strumenti hanno man page ma tutti vengono eseguiti con pochi argomenti. Tutti sono configurati in modo simile nella GUI di Wireshark.

In questa prima schermata, configuriamo l'indirizzo IP dell'host remoto. Il campo Remote SSH server port è obbligatorio, quindi inseriremo il valore predefinito della porta 22.

12899439e767107d4c6ec0045cb97820.png

Figura 42: SSHdump - Scheda Server

Nella scheda Authentication, inseriamo le credenziali SSH per l'host remoto. SSHdump gestisce sia l'autenticazione basata su password sia quella basata su chiave.

04349791f30775361b8ec70f2b1cd2be.png

Figura 43: SSHdump - Scheda Authentication

L'autenticazione basata su chiave SSH e ProxyCommand sono anche opzioni, ma limiteremo la nostra cattura all'uso di username e password.

In questo esempio, ci autentichiamo al sistema remoto come root. Per usare un utente standard, sarà necessario eseguire 'sudo dpkg-reconfigure wireshark-common / yes' per riconfigurare il pacchetto wireshark e 'sudo usermod -a -G wireshark kali' per aggiungere l'utente (kali in questo esempio) al gruppo wireshark

Poi inseriamo i parametri richiesti nella scheda Capture.

20a1c6c936fe11c12c9108e5b4621602.png

Figura 44: SSHdump - Scheda Capture

Lo strumento SSHDump è fondamentalmente un'applicazione che costruisce un argomento da riga di comando sshdump. La casella di testo Remote interface equivale ad aggiungere -i wlan0mon nella casella di testo Remote capture command.

L'utente sul sistema remoto deve essere in grado di avviare una cattura o avere accesso a sudo. Se è quest'ultimo caso, selezionare la casella di controllo Use sudo on the remote machine.

In questo esempio, useremo dumpcap per minimizzare l'utilizzo della CPU, sebbene potremmo usare qualsiasi strumento di cattura purché sia disponibile sul dispositivo di cattura remoto.

L'ultima scheda serve per abilitare il debug e specificare dove salvare i messaggi di log in caso di errori.

0c0034009fecbafd727766b1960bd65d.png

Figura 45: SSHdump - Scheda Debug

Una volta pronti, clicchiamo Start. Se i parametri sono corretti e il sistema remoto è raggiungibile, la cattura inizierà a breve.

Quando Save parameter(s) on capture start è selezionato, la prossima volta che SSHdump viene usato, non chiederà le impostazioni e si avvierà automaticamente. Se le impostazioni non sono configurate correttamente e si verifica un errore, Wireshark non rende facile il ripristino ai valori predefiniti. Possono essere ripristinati tramite Edit > Preferences... > Advanced. Nella casella di testo Search: risultante, digitiamo "sshdump". Poi facciamo doppio clic su ogni parametro modificato (qualsiasi cosa in grassetto) per riportare SSHDump ai valori predefiniti. Clicchiamo su OK e SSHDump torna alla sua configurazione predefinita.

Esercizio

Usando l'opzione SSH di Wireshark, avviare una cattura dumpcap su un sistema remoto. Questo può essere eseguito tramite localhost, verso un'altra macchina virtuale o verso un altro sistema su cui si ha accesso SSH.

1 (Wireshark Foundation, 2021), https://www.wireshark.org/docs/man-pages/extcap.html ↩︎

4.5. Preferenze avanzate

Wireshark ha un gran numero di opzioni disponibili che possiamo configurare per migliorare il nostro flusso di lavoro. Nelle prossime sezioni, copriremo alcune delle preferenze più comuni che usiamo.

4.5.1. Regole di colorazione

Per semplificare l'analisi, possiamo applicare evidenziazioni colorate ai pacchetti nell'elenco pacchetti. Per attivare o disattivare i colori, attiveremo/disattiveremo View > Colorize Packet List. Possiamo modificare le regole in View > Coloring rules.

3c0b8263d1b472aba49b9c3037246e6b.png

Figura 46: Menu delle regole di colorazione

Le regole di colorazione predefinite di Wireshark sono per lo più per reti Ethernet, ma possiamo aggiungere regole aggiuntive per i frame wireless.

69d9a6c656caf1649663b23cb07e7d90.png

Figura 47: Regole di colorazione

Wireshark elabora le regole in ordine finché non trova una corrispondenza, applica la colorazione e poi si ferma. Salta anche le regole disabilitate (non selezionate).

Per aggiungere una regola, cliccheremo sul pulsante +, compileremo il filtro di visualizzazione e lo nomineremo. Per selezionare i colori, clicchiamo semplicemente sulle caselle contenenti Foreground (per il colore del carattere) e Background dove possiamo usare i colori preselezionati o usare il selettore colori per aggiungerne di diversi. Una volta cliccato OK, dovremmo vedere i colori applicati alla cattura corrente purché ci siamo ricordati di selezionare l'opzione View > Colorize Packet List.

Il pulsante rosso X eliminerà la regola attualmente selezionata, e il pulsante accanto duplicherà la regola attualmente selezionata. Il pulsante seguente cancella l'intero elenco. Spostare le regole è solo questione di cliccarle e spostarle su e giù.

Piuttosto che creare una serie di regole, un'opzione semplice è importare un file di regole di colorazione wireless dalla wiki delle regole di colorazione di Wireshark.1 Per farlo, scaricheremo e salveremo il file sul sistema, selezioneremo Import..., navigheremo al file delle regole di colore e selezioneremo Open. Una volta viste le nuove regole wireless visualizzate insieme alle regole di colore predefinite, possiamo selezionare OK per applicarle.

1c8a438098bf9780feb3755bd24600d8.png

Figura 48: Elenco pacchetti usando le regole di colorazione WLAN

È molto più facile notare rapidamente il traffico importante grazie alla colorazione. Ora, guardando il traffico in flusso, riconosciamo i tipi di frame di interesse. Colorare reassociation, authentication, deauthentication, disassociation, eapol, eap, ecc., li fa risaltare. Possiamo anche usare le regole di colore per analizzare il traffico.

1

(Wikipedia, 2015), https://wiki.wireshark.org/ColoringRules ↩︎

4.5.2. Colonne di Wireshark

Se lo desideriamo, possiamo spostare, ridimensionare, rimuovere, nascondere e aggiungere nuove colonne nell'elenco pacchetti di Wireshark.

Possiamo creare una colonna da qualsiasi elemento di interesse all'interno di un pacchetto. Ad esempio, possiamo aggiungere una colonna del canale da un pacchetto probe request. Espandiamo il campo 802.11 radio information, facciamo clic destro su Channel 11 e selezioniamo Apply as a column.

c0f67fdbfa023b00a1288aaed71171cd.png

Figura 49: Nuova colonna aggiunta da 802.11 radio information

Possiamo vedere la colonna Channel comparire nella finestra Packet List. Possiamo anche creare una colonna selezionando l'elemento e poi selezionando Analyze > Apply as a column.

a142cb509c2fbd3d05c51aaeaac93897.png

Figura 50: Nuova colonna aggiunta da 802.11 radio information

Possiamo spostare una colonna trascinandola a sinistra o a destra e poi rilasciandola dove vogliamo.

Per rimuovere una colonna, facciamo clic destro sull'intestazione della colonna selezionata e selezioniamo Remove This Column in fondo al menu pop-up. Deselezionando la colonna nella sezione sopra la nascondiamo.

78635c9fff6b1f12d834db73cd9bfa2c.png

Figura 51: Clic destro sulla colonna Channel

Possiamo anche gestire le colonne in Preferences andando in Edit > Preferences.... Nel pannello sinistro, all'interno della voce Appearance, apriremo Columns. Creare e modificare una colonna in questo modo segue gli stessi principi generali di prima.

e9e21e378a1b4cd6fa28f1ca735ef4b3.png

Figura 52: Gestione delle colonne in Preferences

4.5.3. Snaplen di cattura

Impostare uno snaplen,1 o lunghezza snapshot, ci permette di limitare quanti dati catturiamo per ogni pacchetto. Wireshark, tshark, dumpcap e tcpdump possono tutti impostare lo snaplen per una cattura.

Per motivi simili all'uso di un filtro di cattura, lo snaplen è utile quando non ci è permesso catturare l'intero pacchetto di un obiettivo o non abbiamo bisogno dell'intero payload.

C'è un avvertimento riguardo allo snaplen. Dobbiamo configurarlo quando impostiamo la cattura e non possiamo cambiarlo mentre la cattura è in esecuzione.

Warning

Fare attenzione quando si imposta il valore snaplen. Le intestazioni dei frame wireless possono variare in lunghezza a causa del DLT (la cui dimensione varia tra i driver), QoS,2 e crittografia. Dovremo impostare il valore snaplen in modo appropriato per evitare di tagliare il pacchetto troppo corto. Otterremo inevitabilmente i primi byte di alcuni payload dei pacchetti.

L'impostazione snaplen di Wireshark non è disponibile nella schermata di benvenuto. Deve essere configurata in Capture Interfaces tramite Capture > Options....

fba9c6cf6bb22c1ef7106a168fa0c31e.png

Figura 53: Menu Capture > Options...

Nella schermata Capture Interfaces, facciamo doppio clic sul valore default nella colonna Snaplen (B) dell'interfaccia per impostarne il valore (in byte). Per catturare la maggior parte dei frame senza il loro payload, possiamo aggiungere 24 alla dimensione delle intestazioni radiotap. Attualmente, con la scheda wireless raccomandata per il corso, la dimensione delle intestazioni radiotap è di 36 byte, il che porta lo snaplen a 60.

f5f512f99e558933791a36b1e19ab61a.png

Figura 54: Capture Interfaces - Impostazione snaplen a 48

Per ripristinare la cattura al valore snaplen predefinito, inserire 262144 nel campo Snaplen (B).

Usando la riga di comando, l'opzione per impostare lo snaplen è -s seguito dal valore in byte. Wireshark, tshark, dumpcap e tcpdump usano tutti la stessa opzione da riga di comando.

1 (Wireshark Foundation, 2010), https://wiki.wireshark.org/SnapLen ↩︎

2 (mrn-cciew, 2014), https://mrncciew.com/2014/10/13/cwap-802-11-data-frame-types/ ↩︎

4.5.4. Preferenze IEEE 802.11

Nei protocolli IEEE 802.11, possiamo cambiare varie impostazioni riguardanti 802.11.

Come abbiamo visto prima, possiamo accedere alle preferenze tramite la scorciatoia a destra della barra degli strumenti wireless oppure tramite Edit > Preferences, poi espandendo Protocols e cliccando su IEEE 802.11.

a8f5a997def8edcdad8e2966e7a9dc5c.png

Figura 55: Preferenze 802.11

Quando passiamo il mouse sulle diverse caselle di controllo e pulsanti di opzione, Wireshark visualizza suggerimenti utili.

Sebbene alcune opzioni siano orientate a gestire cose come vecchi bug dei driver, alcune potrebbero essere utili. Quando riceviamo una grande quantità di dati, l'utilizzo della CPU aumenterà. Per risparmiare sull'utilizzo della CPU, possiamo disabilitare Call subdissector for retransmitted 802.11 frames e Ignore vendor-specific HT elements per aumentare le prestazioni.

4.5.5. Decrittazione WEP e WPA1/2

Wireshark è in grado di decrittare catture WEP e WPA1/2. Come mostrato nella Figura 55, dobbiamo selezionare Enable decryption e fornire le chiavi di decrittazione. Per farlo, possiamo cliccare su Edit... situato a destra di Decryption keys.

Per aggiungere una chiave WEP, selezioniamo wep in Key type, poi compiliamo il campo Key con la chiave WEP in esadecimale. Se è utile, possiamo separare ogni byte con i due punti come mostrato nella Figura 56.

b0ac6250467c65c014ca28233b4e593b.png

Figura 56: Aggiunta di una chiave WEP

Il wpa-pwd è per le passphrase WPA. Il formato è PASSPHRASE:ESSID.

001d28a6eb6311225118df630b171eaf.png

Figura 57: Aggiunta di una chiave WPA PSK con SSID

Possiamo omettere l'ESSID e specificare solo la passphrase. In questo caso, Wireshark applica questa passphrase a qualsiasi rete, usandola insieme all'ultimo ESSID trovato nell'elenco pacchetti.

d28d5b216a3172b2721b25a950df60c3.png

Figura 58: Aggiunta di una chiave WPA PSK senza SSID

L'ultima opzione, wpa-psk, ci permette di inserire la Pairwise Master Key (PMK) in esadecimale. Questo è utile quando si decrittano pacchetti WPA1/2 Enterprise, quando si usa PSK e l'ESSID, o quando la passphrase contiene un carattere due punti (:). Discuteremo la creazione di una PMK nella sezione successiva.

6ac30852a5658cc9f3c35b0ba7194c34.png

Figura 59: Aggiunta di una WPA PMK

Per rimuovere una chiave, la selezioniamo e poi clicchiamo sull'icona rossa X. L'icona successiva ci permette di duplicare una voce, e entrambe le frecce permettono di riordinare. L'ultima icona cancella tutte le voci. Per aggiungere una nuova chiave, clicchiamo sull'icona +. Passando il mouse sull'intestazione della colonna Key vengono visualizzati i formati delle chiavi e, se la chiave non è valida, il Key type diventa rosso.

Dopo aver aggiunto le chiavi, possiamo cliccare OK e chiudere le preferenze. Wireshark applica le chiavi ai pacchetti e poi li decritta.

Ci sono alcune limitazioni alla decrittazione. Per prima cosa, a causa di come è stato progettato WPA/WPA2, possiamo decrittare le sessioni solo dopo un handshake a 4 vie completo. In secondo luogo, Wireshark di solito può gestire fino a 256 associazioni quando decritta WPA/WPA2, ma potrebbe fallire se ci sono troppe associazioni. Infine, i pacchetti decrittati non possono essere esportati.

wpa_passphrase

wpa_passphrase1 fa parte di wpa_supplicant2 e possiamo usarlo per generare la PMK.3 È pensato per creare un file di configurazione wpa_supplicant, ma possiamo usarlo anche con Wireshark. È abbastanza semplice da usare.

Text Only
kali@kali:~$ wpa_passphrase
usage: wpa_passphrase <ssid> [passphrase]

If passphrase is left out, it will be read from stdin

Listing 25 - Utilizzo di wpa_passphrase

Il comando wpa_passphrase richiede un parametro, l'SSID. Il secondo parametro, una passphrase, è opzionale. Se non forniamo una passphrase, chiederà l'input dell'utente. Per motivi di sicurezza, non raccomandiamo di fornire la passphrase poiché ogni comando digitato in una shell viene salvato nella cronologia.

Come esempio, prendiamo l'SSID "test" con la passphrase "abcdefg:".

Text Only
kali@kali:~$ wpa_passphrase test abcdefg:
network={
    ssid="test"
    #psk="abcdefg:"
    psk=a1c425c0f4e5ff3746920c90cc55d17f4773512b6c1ed415526a3bcea3351b5b
}

Listing 26 - Esempio di utilizzo di wpa_passphrase

Ora, dobbiamo solo aggiungere una nuova voce con una chiave di tipo wpa-psk e copiare il contenuto di psk nel valore Key. Non vogliamo fornire un ESSID.

1 (die.net, 2007), https://linux.die.net/man/8/wpa_passphrase ↩︎

2 (Jouni Malinen, 2013), https://w1.fi/wpa_supplicant/ ↩︎

3 (Wikipedia, 2021), https://en.wikipedia.org/wiki/Pairwise_Master_Key#Protocol_operation ↩︎

4.5.6. Statistiche WLAN

Come suggerisce il nome, WLAN Statistics visualizza una panoramica di tutti i frame wireless nell'elenco pacchetti. Le informazioni possono essere focalizzate su determinati pacchetti o dispositivi usando i filtri di visualizzazione.

Possiamo vedere le statistiche in Wireless > WLAN traffic. Se usiamo wpa-Induction.pcap1 dai file di esempio di Wireshark, questi sono i risultati che verranno visualizzati.

1b1e7529641b4fc032dcea5d3d5040d0.png

Figura 60: Statistiche WLAN

Possiamo usare un filtro di visualizzazione per focalizzare le statistiche su determinati pacchetti o dispositivi. Nell'esempio seguente, useremo il filtro "wlan.bssid == 00:0c:41:82:b2:55" per concentrarci sull'SSID Coherer.

a0b63b2af31ac21a87b84066a1b976ff.png

Figura 61: Statistiche WLAN con filtro di visualizzazione

Espandendo l'unico BSSID rimasto si rivelano tutti gli indirizzi MAC collegati ad esso. Questo includerà l'indirizzo broadcast e il BSSID stesso come indicato da "Base station" nell'ultima colonna.

Possiamo esportare il riepilogo cliccando su Save as.... Il file risultante contiene quanto segue.

Text Only
==========================================================================================================================================
Wireless LAN Statistics - wpa-Induction.pcap:
BSSID  Channel  SSID  Percent Packets  Percent Retry  Retry  Beacons  Data Pkts  Probe Reqs  Probe Resp  Auths  Deauths  Other  Protection
------------------------------------------------------------------------------------------------------------------------------------------
00:0c:41:82:b2:55        1  Coherer       100.000000       4.908836     35      398        284           0          26      2        0      3  TKIP      
------------------------------------------------------------------------------------------------------------------------------------------

Listing 27 - Contenuto dei dati esportati dalle Statistiche WLAN

Esercizi

  1. Aprire wpa-Induction.pcap e abilitare le regole di colorazione con le regole disponibili sul sito web di Wireshark. Individuare e identificare i frame di authentication (rosa), association (azzurro chiaro e verde chiaro) e i quattro EAPoL (verde scuro). Tutti questi frame dovrebbero essere vicini.
  2. Usando i filtri di visualizzazione, usare "eapol" per individuare i frame EAPoL e "wlan.fc.type_subtype in {0x0 0x1 0xb}" per individuare i frame di association request/response e authentication.
  3. Aggiungere una colonna per il data rate, che si trova in 802.11 radio information, e cercare frame con un rate di 54 (Mbit).
  4. Configurare un access point WPA con una passphrase a scelta contenente caratteri speciali. Avviare una cattura di pacchetti e connettere un dispositivo. Navigare sul web per un po', poi fermare la cattura.
  5. Usare wpa_passphrase per generare la PMK, poi aggiungerla in Wireshark per decrittare la cattura. Se tutti e quattro i frame EAPoL e i beacon sono presenti, dovrebbero essere visualizzate query DNS, HTTP, TLS e altri protocolli.

1 (Wireshark Foundation, 2020), https://wiki.wireshark.org/uploads/__moin_import__/attachments/SampleCaptures/wpa-Induction.pcap ↩︎

4.6. Conclusione

In questo modulo, abbiamo iniziato con la funzionalità di base di cattura dei pacchetti 802.11 in Wireshark. Abbiamo coperto i diversi modi per configurare la cattura remota dei pacchetti, i filtri di visualizzazione e di cattura, nonché le loro differenze e i loro usi. Infine, abbiamo appreso altre funzionalità di Wireshark relative all'802.11.