:: Sicurezza nelle reti - tcpdump ::
tcpdump serve per mettere la scheda di rete in modalità promiscua e catturare il flusso tcp che gli passa davanti, inclusi i pacchetti non destinati a quella scheda di rete.
Possiamo decidere di catturare a schermo, oppure catturare su di un file per successive analisi. La seconda cosa è spesso la più intelligente e la più richiesta all'esame, perché possiamo filtrare il contenuto a nostro piacimento in un secondo momento:
tcpdump -w nomefile
Il nomefile può essere quello che volete, nessuno si fa problemi sull'estensione, tanto è un file binario.
tcpdump -i eth0 -w braobaobab
dice a tcpdump di catturare il traffico solo su eth0. Lui si mette di default ad ascoltare sulla scheda con il più basso ID, ma se vogliamo specificarne un'altra, eccoci serviti.
Per evitare che tcpdump vada a convertire gli ip in nomi, si mette il flag -n.
Se stiamo ascoltando una rete affollata, il file si riempirà alla svelta in modo gigantesco. Per limitare il numero di pacchetti che vogliamo ascoltare in modo automatico, usiamo il flag -c 40 e tcpdump si fermerà dopo aver salvato 40 pacchetti.
La prima cosa da fare è dire a tcpdump di non mettersi ad ascoltare sulla scheda di rete, ma di analizzare un file:
tcpdump -n -r nomefile.salvato.prima
Le flag specificate sopra sono tuttora valide, la -n è sempre consigliata.
Di solito ci viene chiesto di filtrare il traffico catturato, per mettere in evidenza solo quello che viene scambiato tra due host. Per far filtrare il traffico, si usano le seguenti espressioni:
Per filtrare in base al protocollo, nell'espressione infiliamo semplicemente tcp, udp, icmp.
Qui si va un po' più nel complicato. Possiamo avere l'esigenza di filtrare certi pacchetti in base a come hanno i flag settati. Per dirlo a tcpdump, occorre fare un filtraggio sul contenuto binario.
Consideriamo l'header TCP. Esso è composto da 20 byte, con il primo numerato a partire da 0. I flag si trovano nel 13° byte, e hanno un bit a testa. Se guardiamo il byte che contiene i flag, le associazioni tra bit e flag sono le seguenti:
<no> <no> URG ACK PSH RST SYN FIN
I primi 2 bit sono riservati e non si usano. Quando si settano i flag, si portano a 1 i relativi bit. Ad esempio, per avere SYN e ACK settati, avremmo il 13° byte con questa forma:
00010010
il che, in decimale, si traduce con 21 + 24 = 18.
Se invece vogliamo i flag URG, SYN e FIN, avremmo
00100011
Ok che questa combinazione di flag è un po' strana, però sarebbe 20 + 21 + 25 = 35.
Per dire a tcpdump di fare questo tipo di controlli, usiamo l'espressione tcp[numerobyte] = <valore>. Ad esempio, tcp[13] = 35 controllerà URG, SYN e FIN.
Ma tutto questo NON basta. Il controllo fatto qui sopra dice: controlla che i flag siano solo ed esclusivamente quelli. Se controllo quelli con il flag SYN, vuol dire che tutti quelli che hanno il SYN sì settato, ma anche qualcos'altro, non vengono considerati.
Entrano quindi in gioco le maschere binarie. Per vedere che cosa sono, occorre sapere che cosa sia l'AND logico. Ecco due esempi chiarificatori:
1) 01010101 AND 00000100 = -------- 00000100 2) 01010101 AND 00000010 = -------- 00000000
Basta fare l'AND bit a bit, e si ottiene il risultato. Come è noto, solo 1 AND 1 = 1. E a che cosa ci serve? Ecco a cosa ci serve:
01010101 AND 00000100 = -------- 00000100 00000100 AND 00000100 = -------- 00000100 11111111 AND 00000100 = -------- 00000100
Dovrebbe essere autoesplicativo: se sto controllando un singolo bit, non mi importa che cosa valgano gli altri, perché il risultato dell'AND dipende SOLO da quel bit. Quindi, tornando alla nostra voglia di filtrare tutti i pacchetti che hanno sicuramente il SYN settato, e degli altri bit va bene qualsiasi cosa, noi potremmo dire a tcpdump una cosa così: tcp[13] & 2 != 0, che tradotto vuol dire:
Per evitare cose strane con i caratteri & etc., che la shell può interpretare come vuole, è meglio mettere questo tipo di filtri tra le virgolette, per avere una cosa come
tcpdump -n -i eth0 "tcp[13] & 2 != 0 or tcp[13] & 16 != 0" -r file.dump
Notiamo anche che abbiamo combinato più condizioni con l'operatore logico OR. Ci sono anche gli AND etc.
Qui vogliamo arrivare al massimo della figosità. Possiamo dire a tcpdump cose del genere:
tcp[0:2] = 80
e quello che fa è controllare i byte che partono da 0. Quanti ne controlla? 2, perché glielo abbiamo detto noi. Ad esempio, tcp[6:4] controlla i byte 6, 7, 8 e 9, cioè 4 a partire da 6.
Sta roba serve per andare a controllare altre cose dell'header tcp, ad esempio i flag di frammentazione e roba del genere.