No results found
L’analisi del traffico di rete è un’operazione che sempre più spesso viene attuata nell’ottica di proteggere una rete locale aziendale da attacchi esterni; infatti permette di ottenere informazioni sullo stato e la vulnerabilità relativamente ad un certo contesto di rete, utili ai fini della risoluzione di problemi riscontrati o di rilevamento di eventuali attività malevole provenienti dall’esterno, di cui si sospetta l’esistenza.
Tale analisi viene svolta mediante strumenti come a Wireshark, che è un tool capace di fornire risultati di livello professionale e che è uno dei tra i più diffusi analizzatori di protocollo esistenti al mondo.
In questo tutorial verrà introdotto, descritto e spiegato nel suo utilizzo in un contesto di rete.
Gratuito e open source, Wireshark nasce come prosecuzione del progetto Ethereal fondato da Gerald Combs; per l’esattezza, Ethereal era il nome originario di Wireshark assegnato all’interno dell’allora compagnia all’interno della quale Combs lo sviluppò. Lasciata la compagnia, dovette dargli un nuovo nome, pur essendo, Whireshark, basato sullo stesso codice di base.
Nell’immagine seguente è proposta l’interfaccia utente di Wireshark.
Wireshark è una soluzione multipiattaforma, disponibile per Windows, Linux, macOS, Solaris, e BSD. Permette di effettuare molte operazioni relative all’analisi della rete:
Per quanto riguarda la decodifica diretta, è possibile solo a patto di essere in possesso delle chiavi private corrispondenti ai certificati utilizzati per lo scambio. Stessa cosa per la cattura di protocollo 802 11, quindi se si cattura traffico WiFi è possibile impostare la chiave di cifratura della rete e quindi vedere effettivamente il traffico che passa.
Wireshark viene molto utilizzato anche come strumento di debugging dei problemi di rete, quindi non solo di reverse engineering o analisi della sicurezza.
Per quanto riguarda la cattura del traffico, esistono varie modalità: la GUI (interfaccia utente) è quella che viene più immediata e che permette, oltre alla cattura, l’applicazione di filtri e l’analisi del traffico acquisito; vi sono poi altre modalità. In generale sono possibili:
Utilizzando la modalità promiscua dell’adattatore di rete, Wireshark permette di esaminare tutto il traffico presente sul segmento di rete (LAN) in oggetto, pur tenendo conto delle limitazioni e delle impostazioni di sicurezza applicate alla rete; in altre parole non si cattura soltanto il traffico indirizzato verso il nodo sul quale il software di cattura sta girando, ma in generale si riesce a catturare il traffico dell’intero dominio di collisione dell’interfaccia di rete utilizzata per l’ascolto.
Il dominio di collisione è, per l’interfaccia ethernet, il circuito su cui si chiude la rete, quindi se siamo connessi a un hub, il dominio di collisione è l’insieme di tutte le unità di rete connesse a quell’hub; nel caso del WiFi è l’etere, quindi tutto quel che si trova a portata radio.
Con Wireshark è possibile la cattura da remoto tramite utility che possono essere installate ad esempio su router Cisco, grazie alle quali catturare il traffico che vi passa e poi analizzarlo: un esempio è Cisco Dump.
Si può anche effettuare la cattura da remoto anche da sessione SSH, quindi lanciare l’eseguibile che opera la cattura del traffico sul nodo e poi effettuare l’analisi in tempo reale attraverso l’interfaccia utente di Wireshark.
Wireshark è strutturato a plugin, quindi oltre ai dissector (i parser di protocollo) integrati in esso è possibile scrivere propri plugin custom per un protocollo applicativo non standard; il linguaggio utilizzato per la creazione dei dissector è il LUA, ossia un linguaggio di scripting.
Utilizzare il software richiede un minimo di attenzione in più perché bisogna installare anche dei pacchetti. Semplificando, il funzionamento di Wireshark è il seguente:
Quindi Wireshark non incorpora il codice che serve a interfacciarsi con la scheda di rete per la cattura, pertanto quando si installa occorre installare le librerie suddette.
Per la fase di cattura dei pacchetti, Wireshark si appoggia ad una specifica API, che è pcap.
I sistemi Linux/Unix implementano pcap tramite la libreria “libpcap” e i sistemi Windows utilizzano, invece, WinPcap/Npcap.
Nell’immagine seguente è proposta la GUI di Wireshark aperta sulla sezione relativa alle interfacce di rete utilizzate per la cattura dei dati. Che si tratti di Linux o Windows, l’interfaccia utente è più o meno la stessa, con la pagina iniziale divisa in due parti: c’è una prima parte in cui mostra i file recenti (le catture recenti) perché tutto il traffico che viene catturato e analizzato o visualizzato, può essere poi salvato su file per essere condiviso e analizzato da altri; la seconda parte della GUI mostra tutte le interfacce di cattura, cioè le interfacce di rete sulle quali possiamo mettere il software in modalità di cattura.
In questa immagine vedete alcune interfacce di rete, fisiche e virtuali; vediamo anche CiscoDump installata, che rappresenta uno strumento di cattura remota. Inoltre ci sono interfacce USB (usbmon1, 2 ecc.) utili, ad esempio, per fare il debug di macchine embedded, nonché strumenti di cattura da SSH.
Il traffico che viene catturato appare dettagliato nella schermata principale del programma, per ciascuna interfaccia di rete; nell’immagine seguente è proposta la GUI su linux, dove nella sezione Capture appare il dettaglio del traffico (è evidenziata l’interfaccia loopback perché nello specifico si esegue l’ascolto da una macchina non collegata a Internet).
La correlazione tra le varie interfacce di acquisizione presenti consente di vedere subito qual è quella sulla quale passa più traffico e quindi concentrarsi magari su di essa.
Se avviamo la cattura, l’interfaccia di Wireshark apparirà divisa in tre pannelli, come mostrato nell’immagine seguente: Wireshark considera i dati che vengono catturati come un flusso continuo e poi effettua un parsing dei vari pacchetti che sono arrivati; il flusso di cattura viene mostrato nel pannello in alto, elencando in sequenza con un ordine temporale tutti i pacchetti che sono arrivati o che sono stati trasmessi attraverso l'interfaccia che abbiamo messo in cattura.
Il secondo pannello che vedete in basso a sinistra mostra invece, per il pacchetto selezionato in blu nel primo, la sua interpretazione in base ai vari layer, quindi, come potete vedere, andiamo veramente dal livello fisico (dal frame che è stato ricevuto) fino al livello più alto in base al pacchetto. Tale interpretazione viene fatta dai dissector, ossia i moduli che sono stati attivati per riconoscere e interpretare il flusso di dati che passa e nel caso in cui il parsing sia avvenuto con successo, nel pannello in basso a sinistra riusciamo a vedere effettivamente i vari campi.
Il pannello è sincronizzato con quello in basso a destra, che invece mostra i dati RAW, quindi l’esadecimale e l’husky dei dati che sono transitati e ci consente di vedere, per esempio per una query DNS, quali sono i dati che compongono la query stessa.
Quindi si dispone di uno strumento che opera anche a livello molto basso, perché di fatto possiamo salire e scendere dallo stack tutte le volte che vogliamo e analizzare il traffico a qualunque livello, ammesso che il traffico stesso sia stato interpretato correttamente.
L’interfaccia utente può essere modificata allo scopo di spostare i pannelli o di aggiungerne; la cosa si effettua dal comando di menu Edit>Preferences, accedendo così alla finestra di dialogo proposta nell’immagine seguente. Da qui, cliccando nel menu di sinistra della finestra su Layout, possiamo personalizzare le tre finestre (principale, ossia Lista dei pacchetti, in basso a sinistra -dettaglio del pacchetto- e in basso a destra - byte del pacchetto selezionato) e fare altro ancora.
Nel primo pannello è possibile personalizzare le colonne, aggiungendo o togliendo voci alla composizione predefinita (Time, Source, Destination ecc.); per esempio volendo aggiungere un parametro e quindi una sua colonna, basta cliccare col pulsante destro del mouse nel secondo pannello sul tipo di stream desiderato, quindi impartire dal menu contestuale che si apre il comando Add as column, ovvero si può procedere dalla finestra dell’immagine precedente, selezionando Columns.
Catturare indiscriminatamente ogni tipo di traffico può rendere difficile focalizzarsi su ciò che interessa veramente, per questo Wireshark mette a disposizione uno strumento che è la barra di filtro, la quale è quella che si posiziona, nella GUI, sotto i pulsanti della toolbar: in essa appare la scritta “apply a display filter”. Da questa è possibile applicare una gran quantità di filtri che permettono di visualizzare solo il tipo di traffico richiesto; questa funzionalità di Wireshark permette di rendere più agevole la lettura.
I filtri più semplici consistono nell’indicare il nome del protocollo o dei protocolli che vogliamo filtrare; nel caso dell’immagine precedente, ci interessa vedere lo scambio http, quindi si digita http nella barra dei filtri. Come vedete, nella riga evidenziata viene dettagliata la comunicazione con indirizzo IP sorgente (source) e destinazione (destination), nonché il tipo di chiamata (GET).
È molto importante conoscere l’utilizzo dei filtri di Wireshark, quindi quelli per un certo procotollo o indirizzo di rete, una certa scheda di rete ecc. Allo scopo sappiate che in Internet sono presenti molteplici risorse (ad esempio, https://cdn.comparitech.com/wp-content/uploads/2019/06/Wireshark-Cheat-Sheet-1.jpg ) che spiegano il sistema di filtraggio dei pacchetti in Wireshark (l’immagine seguente ne mostra una parte).
Molto utile, inoltre, è la possibilità di trovare sul web dei “sample” di traffico relativo a svariati protocolli, il che consente di comprendere il funzionamento di quest’ultimi.
Tutti i file in formato “pcap” possono essere visualizzati graficamente da Wireshark.
Di seguito un link dove è possibile trovare questi “sample”:
https://wiki.wireshark.org/SampleCaptures
Dall’interfaccia utente, cliccando sul pulsante Expression collocato a destra della barra di filtro è possibile visualizzare tutti i filtri disponibili e impostare il filtraggio addirittura per specifici campi di stringa che lo stesso, ovvero il relativo protocollo, prevede (immagine seguente).
È anche possibile -grazie a un editor incorporato- filtrare per uno specifico campo di uno specifico pacchetto relativo al protocollo selezionato; allo scopo, dopo aver definito il protocollo nella barra di filtro (per esempio http) si va a cliccare col pulsante destro del mouse, nel pannello in basso a sinistra, sul pacchetto desiderato: nell’esempio proposto dall’immagine seguente il filtro da applicare sarà relativo al metodo GET http, quindi si clicca col pulsante destro sul pacchetto relativo a GET e dal menu contestuale che si apre si va a scegliere Apply as a filter e quindi Select.
Questa filtrazione avanzata è molto comoda perché consente di selezionare nel dettaglio cosa analizzare, senza perdersi nella sintassi dei filtri, che è molto articolata e complessa.
Quindi, tipicamente quello che succede è che si individua il flusso da analizzare e si applicano dei filtri direttamente dal packet filter.
Notare che è possibile filtrare al contrario, cioè si può creare un filtro che escluda i pacchetti che rispondono a una determinata caratteristica che selezioniamo, semplicemente mettendo un “not” inizialmente, quindi un punto esclamativo nella sintassi dei filtri, come primo carattere.
Un altro aspetto importante è che Wireshark, anche nel caso in cui non sia messo in modalità promiscua o di monitoring, nella cattura da WiFi comunque acquisisce tutto quello che passa dall’interfaccia selezionata e tipicamente in un sistema multiprogrammato abbiamo più processi che interagiscono con la rete, magari siamo interessati a un flusso in particolare ma nella GUI li vediamo tutti e sono mostrati in ordine temporale, ossia di arrivo all’interfaccia. Allora possiamo selezionare un singolo flusso cliccando con il pulsante destro del mouse su uno dei pacchetti corrispondenti al flusso stesso e, dal menu contestuale che si apre, scegliendo la funzione Follow: quest’ultima apre un sotto-menu da cui si può decidere quale tipo di stream (TCP Stream, UDP Stream ecc.) seguire.
L’interfaccia utente aprirà una finestra in cui appariranno i pacchetti, nel caso HTTP, per esempio, con in rosso quelli relativi alle richieste e in blu quelli riguardanti le risposte.
Ci sono varie modalità con le quali possono essere visualizzati i dati nello stream; si possono anche esportare come array C (C arrays), cosa molto utile nel caso in cui si fa Reverse Engineering (per esempio se si desidera fare un replay di un pacchetto specifico in un tool scritto in C).
Oltre ad aver generato questa finestra, Wireshark ha anche create filtro, la cui sintassi viene compilata automaticamente nella barra di filtro; in pratica ogni volta che si imposta una selezione dal menu contestuale, Wireshark compila la barra di filtro in modo da aiutarci a imparare la sintassi corrispondente, cosicché ci sarà possibile in futuro operare dalla barra, se lo desideriamo.
Torniamo ora un momento sull’utilizzo delle colonne per spiegare che un loro utilizzo può essere quello di verificare i tempi di risposta di un server http; questo è utile perché con Wireshark i tempi di risposta osservati dal client sono considerati nel complesso, quindi il tempo che intercorre dal momento in cui il client effettua una richiesta al momento in cui il server risponde.
Quindi sono il risultato del somma dei tempi dovuti ai trasferimenti di rete e la somma del tempo di processing del server; riuscire a distinguere quali sono gli uni (latenza di rete) e quali gli altri tempi è verificabile attivando una colonna dedicata: facendo clic con il tasto destro del mouse sulla cattura corrispondente si apre il menu contestuale e si va su preferenze delle colonne, qui si clicca sul simbolo “più” e si crea la colonna dt (Delta Time) dove verrà visualizzato il Delta Time Display.
È una colonna dove viene calcolata la differenza di tempo che intercorre tra un pacchetto e il precedente, così come mostrata nella sequenza temporale dello stream attualmente visualizzato;
Restando in tema http, un’altra cosa interessante che si può fare per debugging è visualizzare la distribuzione del carico nel caso in cui si abbiano più server http che rispondono sotto lo stesso dominio: nel sottomenu Statistics si trova tutta una serie di statistiche che vengono calcolate da Wireshark sulla base dei dati che sono stati catturati e si può, per esempio, selezionare Load Distribution che fa vedere in percentuale quante richieste sono arrivate ai vari endpoint catturati (immagine seguente).
Un altro tool che può essere comodo è un compilatore di regole firewall integrato, quindi se abbiamo identificato un pacchetto che possiamo ritenere malevolo e vogliamo subito bloccarlo, possiamo selezionarlo, aprire il menu Tools e impartire il comando Firewall ACL rules, che ci mostra tutte le regole riguardanti questo particolare pacchetto, in modo da poter decidere in base a quello che vogliamo fare se vogliamo filtrare per porta, sorgente, destinazione e così via.
Le regole non vanno incollate pari-pari, ma l’editor è comunque uno strumento comodo se non ci ricordiamo la sintassi del firewall che stiamo utilizzando; le regole che si possono creare sono dia di IN che di OUT.
Nell’editor ci sono dei creator e delle rules per i firewall più famosi, quindi oltre a IP tables c’è la sintassi per Cisco IOS, IP firewall, Netfilter o Net SH (immagine seguente).
Un’altra maniera per capire cosa effettivamente succede a livello di cattura è creare un diagramma temporale (Flow Diagram) del traffico catturato, il che può essere comodo soprattutto se stiamo facendo Reverse Engineering e stiamo analizzando il flusso di un protocollo, per vedere quali sono gli attori coinvolti e come passano i pacchetti.
Per fare questo dobbiamo innanzitutto cliccare sulla riga dello stream di nostro interesse, quindi andare sulla voce di menu Statistics e impartire il comando Flow Graph: il diagramma che si apre mostra un flusso in cui i vari endpoint sono messi in alto e i vari pacchetti sono mostrati con una freccia che indica qual è il flusso che si è seguito.
A volte lavorare soltanto con gli indirizzi IP può essere poco comodo e quindi Wireshark ci consente di effettuare la risoluzione dei nomi; questo si effettua andando sul menu View e poi impartendo il comando Name Resolution. A questo punto possiamo attivare anche la risoluzione dei nomi oltre alla risoluzione fisica: con la risoluzione dei nomi, gli indirizzi IP verranno pian-piano trasformati in nomi DNS.
Ciò è molto importante perché può succedere che dal momento in cui è stata effettuata la cattura al momento in cui si fa l’analisi, magari il nome di dominio punti ad un IP address diverso (il record sia cambiato); Wireshark, invece, ci assicura che i nomi di dominio che vediamo siano quelli corretti. Attivando al momento della cattura quest’opzione, se attiviamo il Flow Graph possiamo vedere al posto dell’indirizzo IP il nome di dominio associato.
È anche possibile attivare la risoluzione degli indirizzi MAC e in questo caso i primi tre gruppi di numeri, che sono caratteristici del singolo costruttore di interfacce di rete, verranno sostituiti dal nome del relativo vendor; questa possibilità può essere comoda perché sapendo quali sono gli apparati coinvolti, possiamo vedere subito se il traffico passava ad esempio da un Access Point piuttosto che da un altro.