Analizzatore di protocolli

Esercizi con Wireshark tratti dal libro di Kurose-Ross:
Analisi del protocollo HTTP
Analisi del protocollo TCP
Analisi del protocollo DNS

Un packet sniffer è lo strumento usato per osservare i messaggi scambiati tra le entità di protocollo in esecuzione su due sistemi connessi.

Un packet sniffer cattura ("annusa") i messaggi in transito sul canale collegato al computer sul quale è installato, e può visualizzare, o anche memorizzare per un'analisi successiva, il contenuto dei vari campi dei messaggi catturati.

Un packet sniffer agisce in modo passivo: rileva i messaggi che vengono scambiati dalle applicazioni e dai protocolli in esecuzione sul computer, ma non invia e non modifica i pacchetti. I pacchetti ricevuti non vengono mai esplicitamente indirizzati al packet sniffer, le applicazioni ne ignorano la presenza. Un packet sniffer intercetta i pacchetti e se ne fa una copia.

La Figura descrive la struttura di un packet sniffer. Sulla destra è rappresentato il modello TCP/IP. A livello Applicazione ci possono essere i programmi utente (browser, client di posta elettronica, client ftp, ecc.) in esecuzione sul computer.

All'interno del rettangolo tratteggiato è schematizzata la struttura del packet sniffer. Questo Funziona in aggiunta ai protocolli presenti sul computer, ed è costituito da due componenti: La libreria "Cattura dei pacchetti" riceve una copia di tutte le trame che attraversano il livello collegamento (livello 2 realizzato sulla scheda di rete) sia in trasmissione sia in ricezione.

I messaggi scambiati dai protocolli dei livelli superiori, quali HTTP, FTP, TCP, UDP, DNS, o IP, sono contenuti nelle trame del livello collegamento che viaggiano, o hanno viaggiato, sul mezzo trasmissivo.

Si assume che la rete sia di tipo Ethernet, quindi tutti i protocolli dei livelli superiori sono incapsulati in una trama di formato Ethernet. Quindi la cattura delle trame di livello collegamento consente di intercettare tutti i messaggi trasmessi o ricevuti dalle applicazioni e dai protocolli.

L'altro componente di un packet sniffer è l'analizzatore di protocolli, che si colloca a livello applicazione, il cui scopo è quello di mostrare il contenuto dei campi del messaggio. Per riuscire a scomporre i campi del messaggio, l'analizzatore di protocolli deve conoscere la struttura (il formato) in cui i protocolli organizzano i messaggi.

Ad esempio per mostrare i vari campi contenuti in un messaggio del protocolli HTTP, l'analizzatore deve conoscere il formato di una trama Ethernet e riconoscere il datagramma IP che vi è contenuto. Quindi deve conoscere anche il formato del datagramma IP in modo da estrarre il segmento TCP che vi è contenuto. Poi, conoscendo la struttura del segmento TCP riesce ad estrarre il messaggio HTTP che questo contiene. Infine, conoscendo anche la struttura del messaggio HTTP mostra i suoi singoli campi.

Wireshark è il packet sniffer di riferimento per analizzare i messaggi in transito sulla scheda di rete, generati dalle applicazioni e incapsulati nei protocolli TCP/IP. Wireshark è un programma applicativo che si serve di una libreria per la cattura dei pacchetti. L'analizzatore di protocolli Wireshark funziona sui sistemi operativi Windows, Linux/Unix, e Mac.

Wireshark è in grado di riconoscere moltissimi protocolli di rete, indipendentemente dalla topologia: Ethernet, Token-Ring, FDDI, seriale (PPP e SLIP), reti senza fili 802.11, e connessioni ATM.


Installare Wireshark

scaricare ed installare wireshark

scaricare ed installare winPcap


Avvio di Wireshark

Se durante l'installazione si è scelto di non avviare il servizio nella fase di boot, allora tentando di avviare il programma si ottiene la seguente segnalazione:

The NPF driver isn't running. You may have trouble capturing or listing interfaces.

Nella casella "Esegui", del menu Start di windows, scrivere cmd (bisogna essere amministratore) e nel prompt del DOS dare il comando sc qc npf.

Si dovrebbe ottenere questa risposta:

C:\Windows\system32>sc qc npf
[SC] QueryServiceConfig SUCCESS
        SERVICE_NAME: npf
        TYPE               : 1  KERNEL_DRIVER
        START_TYPE         : 2   AUTO_START
        ERROR_CONTROL      : 1   NORMAL
        BINARY_PATH_NAME   : system32\drivers\npf.sys
        LOAD_ORDER_GROUP   :
        TAG                : 0
        DISPLAY_NAME       : NetGroup Packet Filter Driver
        DEPENDENCIES       :
        SERVICE_START_NAME :

Se la riga Start_Type non contiene AUTO_START, il driver non è in esecuzione, attivarlo con il comando sc start npf.

Se si vuole che il servizio venga avviato automaticamente durante la fase di boot, dare il comando : sc config npf start=auto

Avviare WireShark facendo clic destro sul commando nel menu o sull'icona e scegliere esegui come amministratore.

Mandando in esecuzione Wireshark viene visualizzata la pagina suddivisa in quattro sezioni. La sezione Capture possiede tre icone:


Interfaccia grafica di Wireshark

L'interfaccia di Wireshark è suddivisa in cinque aree.

La barra dei menu è una comune barra contenente i menu a discesa. I principali sono il menu File e il menu Capture. Il menu File contiene le voci per salvare i pacchetti catturati oppure per aprire un file in cui sono stati salvati i pacchetti precedentemente catturati, oltre al comando per chiudere ed uscire dall'applicazione. Il menu Capture consente di avviare o di fermare la cattura dei pacchetti.

Packet List. Al di sotto della barra degli strumenti c'è un riquadro che contiene l'elenco dei pacchetti catturati, riepilogando su ogni riga un pacchetto catturato, contraddistinto da un numero assegnato da Wireshark. Attenzione che questo non è un numero di sequenza del pacchetto contenuto nell'intestazione del protocollo, ma è un'indicazione del momento in cui il pacchetto è stato catturato. Altre informazioni contenute su ciascuna riga di questo riquadro sono: gli indirizzi di origine e di destinazione del pacchetto, il tipo di protocollo e informazioni specifiche del protocollo contenute nel pacchetto. L'elenco dei pacchetti può essere ordinato secondo una qualsiasi di queste categorie cliccando su un nome di colonna. il campo tipo di protocollo mostra il protocollo di livello più alto che ha inviato, o dovrà ricevere il pacchetto.

Packet Details. Al di sotto di questo riquadro c'è il riquadro Intestazione del pacchetto che mostra l'intestazione del pacchetto selezionato (evidenziato) nel riquadro superiore, quello che contiene l'elenco dei pacchetti catturati. Le informazioni mostrate in questo riquadro riguardano la trama Ethernet e il datagramma IP contenuto nel pacchetto. I dettagli possono essere mostrati o nascosti usando i pulsanti a forma di freccia posizionati sulla sinistra della riga relativa alla trama o al datagramma. Se il pacchetto è stato trasportato in un segmento di livello 4, allo stesso modo si possono mostrare o nascondere i relativi dettagli. Infine, sono mostrati anche le informazioni di dettaglio relative ai protocolli di livello più alto.

Packet Bytes. Il terzo riquadro mostra l'intero contenuto, sia in codice ASCII che in esadecimale, della trama catturata.

Sotto la barra degli strumenti c'è una casella denominata Filtro, nella quale si può scrive il nome di un protocollo, o altre informazioni, allo scopo di mostrare solo i pacchetti che posseggono quel protocollo e nascondere gli altri pacchetti nel riquadro contenente l'elenco dei pacchetti catturati (e di conseguenza anche negli altri due riquadri).

Iniziare lo sniffing dei pacchetti.

Prima di iniziare una cattura di pacchetti relativi a pagine web è preferibile svuotare la cache del browser: nel menu strumenti scegliere "Cancella Cronologia recente".

  1. Scegliere la voce Options del menu Capture:

    • togliere la marca di spunta alla voce: Hide capture info dialog;

    • Nella casella Interface selezionare la scheda di rete interessata alla copia dei pacchetti in transito. Subito dopo deve comparire, accanto alla scheda di rete attiva, l'indirizzo IP del computer.

  2. Nel menu Capture (o sulla barra degli strumenti) dare il comando Start. Durante questa fase l'area della finestra di WireShark mostra tre sezioni:

    • La sezione Packet List, quella in alto, mostra i pacchetti acquisiti, ed è suddivisa in colonne:

      NumeroTimeSourceDestinationProtocolLengthInfo

      L'intestazione di colonna agisce anche come criterio di ordinamento, cioè, facendo clic su un titolo di colonna si ottiene l'elenco dei pacchetti ordinato in base ai valori di quella colonna.

    • La sezione Packet Details, quella centrale, mostra l'intestazione del pacchetto selezionato nella sezione Packet List,

    • la terza mostra, su righe di 16 byte, il contenuto del pacchetto sia in esadecimale, sia in codice ASCII.

  3. Accedere ad una pagina web, tramite il browser e, appena termina il caricamento della pagina iniziale del sito scelto, fermare la cattura dei pacchetti.

In pochissimi secondi sono stati acquisiti migliaia di pacchetti. Quando si ricerca uno specifico insieme di pacchetti conviene isolare quelli che interessano applicando un Filtro.

Al di sotto della barra degli strumenti c'è la casella Filter. Scrivere, ad esempio, http e poi premere il pulsante Apply, che si trova sulla destra della casella Filter..

Nella colonna info individuare il pacchetto GET, quello che ha originato la richiesta di ottenere la pagina web.

Menu Edit → Find Packet.

Selezionare la riga contenente il messaggio GET del protocollo HTTP nel riquadro Packet List. Nella finestra centrale, verranno mostrati: la trama Ethernet, il datagramma IP, il segmento TCP e l'intestazione del pacchetto http.


Formato del pacchetto IP.

  bit 0-3 bit 4-7 bit 8-15 bit 16-18 bit 19-31
0 Version Internet
Header length
Type of
Service
Total
Length
32 Identification Flags Fragment Offset
64 Time to Live Protocol Header Checksum
96 Source Address
128 Destination Address
160 Options (optional)
160
o
192+
 
Data
 
ad esempio un host poteva scegliere una bassa latenza, mentre un altro preferire un'alta affidabilità. Nella pratica il campo TOS non si usa.
questi 8 bit hanno la funzione di controllare la congestione, necessaria per le nuove tecnologie basate sullo streaming dei dati in tempo reale, come per esempio il Voice over IP usato per lo scambio interattivo dei dati vocali.
Da notare che questo indirizzo potrebbe non essere quello del "vero" mittente nel caso di traduzioni mediante NAT. Infatti, qualora un host intermedio effettui questa traduzione, sostituisce l'indirizzo del mittente con uno proprio, premurandosi poi di ripristinare l'indirizzo originario su tutti i messaggi di risposta che gli arrivano destinati al mittente originario.
Si ricorda che il valore del campo IHL deve essere sufficientemente grande da includere anche tutte le opzioni e, nel caso queste siano più corte di una word, il padding necessario a completare i 32 bit. Inoltre, nel caso in cui la lista di opzioni non coincida con la fine dell'header, occorre aggiungere in coda ad essa un marcatore EOL (End of Options List).
C'è da notare infine che, potendo causare problemi di sicurezza, l'uso delle opzioni LSSR e SSRR (Loose e Strict Source and Record Route) è scoraggiato e molti router bloccano i datagrammi che contengono queste opzioni.

Analizzare i pacchetti Ethernet

Avviare WireShark, avviare il browser, ed iniziare la cattura dei pacchetti con WireShark aprendo una pagina web. Quando la pagina è completamente caricata nel browser interrompere la cattura dei pacchetti.

Individuare la riga con la richiesta di apertura della pagina (pacchetto GET). Selezionarla e ricordare il numero di riga.

Si vuole analizzare il protocollo di livello Collegamento. I pacchetti uscenti a livello 2 incapsulano i pacchetti provenienti dai livelli superiori. Allo scopo di isolare i frame di livello 2, configurare WireShark per visualizzare le informazioni relative ai protocolli di livello 2:

Nella sezione centrale espandere la riga Ethernet II.

Cercare il pacchetto contenente OK nel campo Info.


Analisi del protocollo ARP.

Aprire il prompt dei comandi e digitare arp -a. Si ottiene l'elenco delle associazioni indirizzo IP - indirizzo MAC che il computer ha memorizzato per comunicare con le macchine della sua sottorete.

Se nella cattura precedente non sono presenti le righe relative ai pacchetti ARP, bisogna preparare una nuova cattura.

Appena viene completato il caricamento della pagina nel browser fermare la cattura dei pacchetti.

Nel riquadro Packet List, individuare le righe corrispondenti ai pacchetti ARP. Nella sezione centrale, della finestra di WireShark, espandere le varie righe: Frame, Ethernet, ecc.

Individuare il pacchetto ARP replay:


Analisi di pacchetti UDP.

Per acquisire i pacchetti UDP collegarsi in streaming per ricevere un video. Avviare la cattura dei pacchetti ed arrestarla dopo aver ricevuto i primi pacchetti. Impostare il filtro UDP. Scegliere un pacchetto ed espandere la riga UDP, nella sezione dettagli.

  1. selezionare un pacchetto e determinare il numero e i nomi dei campi presenti nell'intestazione del pacchetto.

  2. Nella sezione inferiore della finestra determinare il contenuto del pacchetto e il numero dei byte.

  3. Osservare l'intestazione e determinare il numero del protocollo UDP.

  4. Confrontare i pacchetti e interpretare il significato del campo "Length".

  5. Quanti byte possono essere trasferiti con un pacchetto UDP?

  6. Qual è il valore più grande che può avere la porta sorgente?

  7. Individuare una coppia di pacchetti in relazione request-response e individuare il numero di porta di entrambi.

  8. Eseguire manualmente il calcolo del Checksum


Analisi di pacchetti TCP.

TCP Header
Bit offset bit 0-3 bit 4-7 bit 8-15 bit 16-31
0 Source port Destination port
32 Sequence number
64 Acknowledgment number
96 Data offset Reserved CWR ECE URG ACK PSH RST SYN FIN Window Size
128 Checksum Urgent pointer
160 Options (optional)
160/192+  
Data
 

Scaricare un file di testo mentre si è avviata la cattura dei pacchetti. Impostare il filtro "tcp" (in minuscolo). Impostare il doppio filtro "tcp.proto==80". In questo modo si selezionano i pacchetti trasferiti con il protocollo TCP e poi si selezionano quelli che hanno utilizzato la porta 80, cioè il server web.

  1. individuare l'indirizzo IP del server che sta inviando il file.

  2. individuare l'indirizzo IP e il numero di porta del computer che sta ricevendo il file.

  3. individuare le tre fasi dell'handshake

    1. quale elemento identifica un segmento come segmento SYN?

    2. qual è il numero di sequenza del segmento TCP SYN che è utilizzato per inizializzare la connessione tra i due computer?

    3. qual è il numero di sequenza del segmento SYN-ACK inviato dal client in risposta al segmento SYN?

    4. cosa identifica questo segmento con SYN-ACK? quel è il valore del campo ACK?

  4. analizzare la sequenza di trasmissione dei dati del file.

    1. come viene individuato il segmento http POST?

    2. qual è il numero di sequenza TCP?

    3. individuare i successivi tre segmenti: quali sono i numeri di sequenza e qual è la loro dimensione?

    4. Individuare, per ciascuno, il corrispondente messaggio ACK e indicare il valore dell'ACK number.

    5. qual è la lunghezza di ognuno dei primi sei segmenti TCP?

  5. mostrare un grafico:

    1. selezionare un segmento TCP inviato dal server,

    2. selezionare Statistics → TCP Stream Graph → Round Trip Time Graph.

  6. Analizzare le differenze tra messaggio trasmesso e ricevuto, indicare il valore di RTT per i segmenti analizzati prima.

  7. Determinare la dimensione minima del buffer che viene indicata come disponibile in grado di ricevere l'intera traccia

  8. In questa trasmissione si è verificata la situazione di mancanza di spazio nel buffer ricevente che ha provocato un rallentamento della trasmissione?

  9. Calcolare il throughput per questa connessione.