cerca
Sicurezza nelle reti - tcpdump
modifica cronologia stampa login logout

Wiki

UniCrema


Materie per semestre

Materie per anno

Materie per laurea


Help

Sicurezza nelle reti - tcpdump

 :: Sicurezza nelle reti - tcpdump ::

Abstract

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.

Catturare roba

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.

Filtro sull'interfaccia

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.

Evitare la risoluzione dei nomi

Per evitare che tcpdump vada a convertire gli ip in nomi, si mette il flag -n.

Quanta roba catturare

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.

Analizzare il traffico catturato

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.

Filtrare in base all'indirizzo

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:

  • net <rete>, ad esempio net 192.168.1 filtra solamente il traffico relativo alla rete 192.168.1.0/24
    • src net <rete> filtra solo il traffico che ha come SORGENTE la rete specificata
    • dst net <rete> filtra solo il traffico che ha come DESTINAZIONE la rete specificata
  • host <host> filtra solo i pacchetti relativi all'host specificato
    • src host <host> e dst host <host> filtrano su host sorgente e destinazione

Filtrare in base al protocollo

Per filtrare in base al protocollo, nell'espressione infiliamo semplicemente tcp, udp, icmp.

Filtrare in base alle porte

  • port <porta> filtra solo i pacchetti riguardanti la porta specificata
  • portrange 10-1000' filtra solo i pacchetti riguardanti il range di porte specificato
    • src port <porta> e dst port <porta> fanno esattamente quello che suggeriscono
    • src portrange a-b e dst portrange a-b idem

Filtri sul contenuto binario (leggi FLAG)

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:

  • fai l'AND bit a bit tra il 13° guerriero byte e 2 in binario
  • il risultato è diverso da 0? Bene! Se no scartalo.

ACHTUNG!

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.

Filtro binario su più byte

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.


Torna alla pagina di Sicurezza Nelle Reti