A Beginners Guide to tcpdump | Cerca per titolo, autore, parola chiave | ||||||||
A Beginners Guide to tcpdump Andy Wagoner. Per poter eseguire lo sniffing, cioè la cattura di pacchetti di dati in una rete locale, è necessario essere su quella rete ed è necessario che quella rete sia connessa ad un hub oppure ad uno switch che abbia il port mirroring attivato. Occorre ricordare che la funzione prima di un hub di rete e di uno switch è in pratica la stessa, ma un hub, che opera al livello physical layer del modello OSI, trasmette le informazioni a tutti i dispositivi della rete (uno hub non sa eseguire il routing del traffico dati), mentre uno switch è in grado di aumentare il livello di sicurezza della rete garantendo che tali informazioni vengano indirizzate ad uno specifico dispositivo. Quindi, quando un computer invia un pacchetto dati ad un altro computer collegato ad un hub, il pacchetto di dati viene inviato, attraverso l'hub, in broadcast a tutti i computer collegati all'hub. Il segnale ricevuto su una porta qualsiasi dell'hub, viene elettricamente rigenerato ed inviato a tutte le altre porte. Il dominio di collisione in una LAN realizzata tramite hub è l'intera rete. Attualmente gli hub sono praticamente in disuso, essendo sostituiti nella stragrande maggioranza dei casi dagli switch. Uno switch, a differenza di un hub, lavora al livello datalink (collegamento dati) nel modello OSI. Esso è in grado di riconoscere un frame nel flusso di bit, immagazzinarlo, riconoscere l'indirizzo MAC del destinatario, decidere su quale porta inoltrare il frame, trasferirlo verso una porta in uscita, trasmetterlo. Per poter svolgere questo lavoro, lo switch registra in una tabella volatile (che quindi viene azzerata allo spegnimento del dispositivo) gli indirizzi MAC dei dispositivi presenti in rete associandoli alle porte. Uno switch separa i domini di collisione connessi alle sue porte, ovvero se due nodi collegati a porte diverse trasmettono contemporaneamente, non si verifica una collisione, e i due frame possono attraversare lo switch contemporaneamente. Le collisioni si possono avere solo tra i nodi che cercano di comunicare tra loro. Uno switch, inoltre, sa accettare il traffico dati su una porta specifica. Se si desidera catturare il traffico da uno switch, quindi, bisogna abilitare il port mirroring, in modo che lo switch duplichi il traffico, inviandolo alla porta specificata, dove sarà installato lo sniffer. Un bridge (letteralmente ponte) è un dispositivo in grado di collegare tra di loro due o più reti diverse (solitamente delle LAN) in modo che possano comunicare tra di loro. Esso si colloca al livello datalink (collegamento dati) nel modello OSI. Il comportamento di un bridge è analogo a quello di uno switch. Infine, il Router lavora al livello 3, il livello network, dello stack ISO OSI. Un router non utilizza gli indirizzi fisici delle schede di rete, i MAC address, bensì gli indirizzi IP. Questo accade perché un router può connettere computer appartenenti a reti diverse, computer, quindi, anche non fisicamente collegati da un cavo. Se uno switch connette più computer per creare una rete locale, un router connette più switches, e le reti ad essi collegate, per creare una rete più vasta (la rete più vasta possibile è Internet), composta da più reti locali. Grazie agli header dei pacchetti di dati e alle tabelle di instradamento (forwarding tables), un router è in grado di determinare il miglior percorso su cui instradare un pacchetto di dati, per raggiungere la rete di destinazione. Inoltre, un router utilizza protocolli quali ICMP (Internet Control Message Protocol) per comunicare con gli altri router, al fine di configurare il miglior instradamento tra due computer host. Per eseguire tcpdump, eseguire: tcpdump dalla riga di comando. Se non si specifica una scheda di rete, una porta, un tipo di traffico, tcpdump selezionerà la scheda con il più basso numero di indice, tutte le porte e tutti i tipi di traffico: eth0 wlan0 enp3s0 wlp2s0 È possibile specificare la scheda di rete di cui catturare il traffico: tcpdump –i eth0 Ecco un esempio dell'output: 17:35:50.098668 192.168.0.102.50022 > 192.168.0.101.1095: P 73168:73328(160) ack 801 win 20976 (DF) [tos0x10] Il primo campo contiene l'orario di cattura: hh:mm:ss:fraction 17:35:50.098668 Il secondo campo mostra indirizzo e porta di origine del messaggio, seguito dal campo contenente indirizzo e porta di destinazione: 192.168.0.102.50022 > 192.168.0.101.1095 Il terzo campo mostra la flag P che, nel mondo TCP, indica "pushing data". PUSH: se in un datagramma è attivo il bit PUSH, il datagramma è un datagramma che contiene i dati dell'applicazione che ha originato la connessione: il computer mittente invierà immediatamente i dati appena ricevuti dall'applicazione stessa, senza attendere altri dati per saturare il buffer, mentre il computer destinatario dovrà elaborare il datagramma immediatamente e passarlo all'applicazione appropriata, mentre, in circostanze normali, TCP preferirebbe, prima di inviare i dati all'applicazione di destinazione, salvare i dati ricevuti in una struttura più grande, quale un file completo. Il bit PUSH, insomma, chiede a TCP di comportarsi, con quel datagramma, un po' come se si trattasse di un datagramma UDP. Immediatamente dopo troviamo i numeri di sequenza e la quantità di dati inviati, espressi in byte: : P 73168:73328(160) TCP numera ciascun byte di dati trasmesso con un numero sequenziale unico. In questo modo, trasmittente e ricevente potranno sempre indicare all'altra parte il byte preciso cui si riferisce (per esempio: “il 103esimo byte inviato”). Il primo numero di sequenza (Initial Sequence Number, o ISN) viene selezionato, all'inizio della sessione di connessione, in modo random o semi-random. Per il resto della sessione di connessione, a ciascun byte verrà assegnato un numero sequenziale pari al numero sequenziale del byte precedente incrementato di 1. Il numero di sequenza del primo byte inviato sarà sempre pari a ISN + 1. Quindi, se lo ISN fosse 3003873, il 103esimo byte avrebbe numero sequenziale pari a (3003873 + 103) 3003976. Il campo successivo contiene la flag ack, seguita dalle dimensioni della finestra (win 20976) utilizzata: ack 801 win 20976 Numero di ricevuta TCP, 32 bit. ACK ( ACKnowledge ) number. Se il computer mittente mantiene un contatore che incrementa di uno per ogni pacchetto di dati inviato, il computer di destinazione, per ogni pacchetto di dati ricevuto, invia un messaggio di avvenuta ricezione al computer mittente, inviando un numero di ricevuta, che è pari all'ultimo numero di sequenza ricevuto dal computer mittente. E' come se il computer di destinazione dicesse al computer mittente: ho ricevuto i tuoi pacchetti di dati, fino a questo numero di sequenza. Dimensione della finestra, 16 bit. La finestra è il buffer dati, espresso in ottetti e attivo su entrambi gli host, che specifica il numero di byte che l'host mittente può conservare anche senza aver ricevuto la conferma di ricezione ( ACK, acknowledge ). La finestra è ciò che determina quanti byte il mittente possa ancora inviare: la sua dimensione è pari alla somma dei bytes inviati, per i quali, però, non è stato ancora ricevuto il messaggio ACK ( Acknowledge ), ed i byte di cui il destinatario è in attesa, ma che non sono ancora stati spediti. Non appena il mittente riceve un messaggio di conferma ACK ( ACKnowledgment ), sarà autorizzato ad inviare una stessa quantità di byte, tra quelli in attesa. Se il messaggio di ACK era relativo a cinque byte di dati, per esempio, e le dimensioni della finestra non sono cambiate, il mittente potrà mettere in spedizione altri cinque byte di dati. Chi determina la dimensione della finestra? In caso di deterioramento delle condizioni di rete, il computer di destinazione può dire al computer mittente di ridurre la dimensione della finestra ( sliding window, finestra scorrevole ). Allo stesso modo, in caso di miglioramento delle condizioni di rete, il computer di destinazione può segnalare al mittente di aumentare la dimensione della finestra. Infine, leggiamo il campo (DF) (don’t fragment the packet) e (tos) o il tipo di servizio TCP. Il nostro pacchetto di dati mostrato nell'esempio, non mostra il processo di instaurazione di una connessione: three-way handshake, caratterizzato dalla flag TCP: S = SYN e seguito da un ACK e da un SYN ACK. Per aprire una sessione, un computer client identifica una porta locale e genera un Initial Sequence Number (ISN), un numero intero casuale compreso tra 0 e 4,294,967,295. 17:38:56.273633 192.168.0.100.2904 > 192.168.0.102.netbios-ssn: S 2363130086:2363130086(0) win64240 <mss 1460,nop,nop,sacOK> (DF) In questo esempio, stiamo chiedendo di connetterci ad un server Samba, con il comando: tcpdump –i eth0 port 139 In questo primo pacchetto, è possibile notare la “S” (SYN), che segnala che questo pacchetto di dati rappresenta la prima parte nel processo chiamato three way hand shake. Subito dopo, troviamo il numero di sequenza dei byte: S 2363130086:2363130086(0) le dimensioni della finestra, il maximum segment size, più altre informazioni: win64240 <mss 1460,nop,nop,sackOK> (DF) In questa fase, SYNcronizzazione o inizializzazione della connessione, i due host si scambiano i rispettivi ISN. Ciasuno dei due host, inoltre, dovrà impostare anche un secondo contatore: acknowledgement (ACK). Nel contesto di un singolo pacchetto di dati, come nel nostro esempio, il sequence number viene impostato dall'host mittente (2363130086), mentre l'acknowledgement number viene impostato dall'host destinatario. Ecco quale potrebbe essere la risposta dell'host destinatario: 17:38:56.273711 192.168.0.102.netbios-ssn > 192.168.0.100.2904: S 4279673549:4279673549(0) ack 2363130087 win 5840 <mss 1460,nop,nop,sackOK> (DF) La risposta è molto simile alla richiesta, con le eccezioni dei sequence number e dell'ack. L'host di destinazione, infatti, ha inviato all'hosty richiedente, i suoi propri sequence byte. Siamo in fase di sincronizzazione, quindi, anche nella risposta, è presente la flag “S”. Il pacchetto di dati finale, quello che chiude il processo three-way handshake sarà del tipo: 17:38:56.273885 192.168.0.100.2904 > 192.168.0.102.netbios-ssn: . ack 1 win 64240 (DF) Anche l'host che ha richiesto la connessione ha impostato il suo ACK. La connessione tra i due host è stata completata. In questo pacchetto di dati non è evidenziata alcuna flag TCP: al suo posto, troviamo un punto: . ack 1 che indica l'assenza di flag TCP. Usando l'opzione –w (write) si chiede a tcpdump di scrivere l'output nel file specificato: tcpdump –i eth0 –w tdump1 L'opzione –w salva nel file specificato i byte catturati (binary format), senza preoccuparsi di tradurli in un linguaggio comprensibile. In questo modo, sarà poi possibile dare il file in pasto ad uno dei programmi che analizzano il traffico di rete, quali: Ethereal, o Snort. Per convertire l'output in un formato leggibile da un essere umano, è sufficiente aggiungere un filtro e leggere il file appena creato con l'opzione : tcpdump –r tdump1>tdump2 In questo caso, il contenuto binario del file tdump1 verrà tradotto in una forma comprensibile, che, a sua volta, verrà salvata nel file tdump2. Naturalmente, è possibile leggere a terminale lo stesso contenuto, senza salvarlo in un secondo file: tcpdump –r tdump1 È possibile applicare al file binario tutte le opzioni previste per la cattura dei pacchetti al volo. Per esempio, per convertire anche i byte in esadecimale e ASCII eseguire: tcpdump –r file1 –X -nn dove l'opziopne –nn evita che i numeri di protocollo e i numeri di porta siano convertiti nei rispettivi nomi.
|
|||||||||
A Beginners Guide to tcpdump | Disclaimer: questo è un link a contenuti ospitati su server esterni. |