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.
scaricare ed installare wireshark
scaricare ed installare winPcap
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:
Interface List: mostra le schede di rete installate sul computer; selezionare quella che interessa.
Start: inizia la cattura dei pacchetti in transito
Capture Options: specifica alcune modalità da applicare all'acquisizione dei pacchetti.
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).
Prima di iniziare una cattura di pacchetti relativi a pagine web è preferibile svuotare la cache del browser: nel menu strumenti scegliere "Cancella Cronologia recente".
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.
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:
Numero | Time | Source | Destination | Protocol | Length | Info |
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.
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.
Espandere la prima riga per leggere i dettagli del frame, poi ricompattare la riga e passare ad esaminare le righe successive
Elencare alcuni dei protocolli dei pacchetti catturati;
Usare la colonna Time per misurare il numero di secondi trascorsi tra GET e response;
Leggere l'indirizzo IP del sito visitato e l'indirizzo IP del computer client.
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 |
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:
Nel menu Analize cliccare sulla voce Enabled Protocols.
Si apre una scheda con l'elenco dei protocolli appartenenti ai pacchetti visualizzati. Al di sotto della casella con l'elenco dei protocolli c'è la segnalazione che avverte "disabilitando un protocollo, non verranno visualizzati i protocolli di livello superiore". Nel caso specifico i protocolli di livello 2 si trovano al di sotto del protocollo di rete (IPv4),
togliere la marca di spunta alla riga IPv4.
Premere il pulsante Apply
premere Ok.
Nella sezione centrale espandere la riga Ethernet II.
Quanto è lungo il pacchetto? (confrontare la voce Frame Length e il valore nella colonna Length);
Leggere gli indirizzi MAC sorgente e destinazione. Dovrebbero essere quelli della scheda di rete del computer e quello dell'interfaccia del router (o del gateway predefinito).
Individuare il campo Type e trasformare in binario il codice esadecimale. Interessa osservare quali sono i bit a livello 1.
Verificare se è stato necessario riempire il campo PAD.
Cercare il pacchetto contenente OK nel campo Info.
Qual è la lunghezza del pacchetto?
Leggere gli indirizzi MAC sorgente e destinazione.
Interpretare i bit del campo Type.
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.
Cancellare la tabella ARP, per costringere il computer a ricostruirla, eseguendo il comando: arp -d *.*
Cancellare anche la cronologia recente del browser,
avviare WireShark, avviare la cattura dei pacchetti e accedere ad una pagina web.
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.
Qual è la lunghezza del pacchetto?
Qual è l'indirizzo MAC sorgente del pacchetto ARP request?
Qual è l'indirizzo destinazione del pacchetto ARP request?
Calcolare l'offset del campo Opcode e leggere il valore;
Qual è l'indirizzo IP del computer di cui si vuole conoscere l'indirizzo MAC?
Individuare il pacchetto ARP replay:
Qual è la lunghezza del pacchetto?
Qual è la lunghezza della risposta?
Qual è l'offset del campo Opcode? qual è il valore?
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.
selezionare un pacchetto e determinare il numero e i nomi dei campi presenti nell'intestazione del pacchetto.
Nella sezione inferiore della finestra determinare il contenuto del pacchetto e il numero dei byte.
Osservare l'intestazione e determinare il numero del protocollo UDP.
Confrontare i pacchetti e interpretare il significato del campo "Length".
Quanti byte possono essere trasferiti con un pacchetto UDP?
Qual è il valore più grande che può avere la porta sorgente?
Individuare una coppia di pacchetti in relazione request-response e individuare il numero di porta di entrambi.
Eseguire manualmente il calcolo del Checksum
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.
individuare l'indirizzo IP del server che sta inviando il file.
individuare l'indirizzo IP e il numero di porta del computer che sta ricevendo il file.
individuare le tre fasi dell'handshake
quale elemento identifica un segmento come segmento SYN?
qual è il numero di sequenza del segmento TCP SYN che è utilizzato per inizializzare la connessione tra i due computer?
qual è il numero di sequenza del segmento SYN-ACK inviato dal client in risposta al segmento SYN?
cosa identifica questo segmento con SYN-ACK? quel è il valore del campo ACK?
analizzare la sequenza di trasmissione dei dati del file.
come viene individuato il segmento http POST?
qual è il numero di sequenza TCP?
individuare i successivi tre segmenti: quali sono i numeri di sequenza e qual è la loro dimensione?
Individuare, per ciascuno, il corrispondente messaggio ACK e indicare il valore dell'ACK number.
qual è la lunghezza di ognuno dei primi sei segmenti TCP?
mostrare un grafico:
selezionare un segmento TCP inviato dal server,
selezionare Statistics → TCP Stream Graph → Round Trip Time Graph.
Analizzare le differenze tra messaggio trasmesso e ricevuto, indicare il valore di RTT per i segmenti analizzati prima.
Determinare la dimensione minima del buffer che viene indicata come disponibile in grado di ricevere l'intera traccia
In questa trasmissione si è verificata la situazione di mancanza di spazio nel buffer ricevente che ha provocato un rallentamento della trasmissione?
Calcolare il throughput per questa connessione.