Uso di sniffer ed intercettazione del traffico IP Massimo Bernaschi
Transcript
Uso di sniffer ed intercettazione del traffico IP Massimo Bernaschi
Uso di sniffer ed intercettazione del traffico IP Massimo Bernaschi Istituto per le Applicazioni del Calcolo ‘Mauro Picone’ Consiglio Nazionale delle Ricerche Viale del Policlinico, 137 - 00161 Rome - Italy http://www.iac.cnr.it/ e-mail: [email protected] M. Bernaschi: Uso di sniffer ed ... Raw Sockets • I raw socket permettono di leggere e scrivere pacchetti ICMPv4, IGMP e ICMPv6. • Con un raw socket un processo può leggere e scrivere datagrammi IP(v4) con protocolli IP non gestiti dal kernel. • Con un raw socket un processo può costruire il proprio header IP usando l’opzione IP HDRINCL. 2 M. Bernaschi: Uso di sniffer ed ... Raw Sockets Per creare un raw socket: sockfd=socket(AF_INET, SOCK_RAW, protocol); dove protocol è una delle costanti IPPROTO xxx definite in <netinet/in.h> (e.g., IPPROTO ICMP). Normalmente solo il “superuser” può creare un raw socket. Per definire l’opzione IP HDRINCL: setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)); 3 M. Bernaschi: Uso di sniffer ed ... • bind può essere utilizzata su un raw socket per definire solo l’indirizzo locale: non esiste il concetto di numero di porta con un raw socket. • connect può essere utilizzata per definire l’indirizzo remoto. 4 M. Bernaschi: Uso di sniffer ed ... Raw Socket Output • La scrittura avviene invocando la sendto o la sendmsg e specificando l’indirizzo IP di destinazione. Se il socket è stato connesso, è possibile utilizzare write, writev, send. • Se viene specificata l’opzione IP HDRINCL, il buffer inviato deve iniziare con il primo byte dell’header IP. La dimensione dei dati deve tener conto della dimensione dell’header IP del chiamante. Il kernel – imposta il campo di identificazione dell’IPv4. – calcola ed inserisce la checksum dell’header IP. Su Linux tutti i campi dell’header IP devono essere in network byte order. • Se non è definita l’opzione IP HDRINCL, il kernel crea l’header IP 5 M. Bernaschi: Uso di sniffer ed ... e imposta il campo protocollo uguale al terzo argomento della chiamata socket. • Non esiste un’opzione simile alla IP HDRINCL per IPv6. Quasi tutti i campi in un header IPv6 e tutti gli header per le estensioni sono impostati attraverso delle socket options o gli ancillary data. 6 M. Bernaschi: Uso di sniffer ed ... Raw Socket Input Vengono applicate le seguenti regole: • i pacchetti UDP e TCP non sono mai passati ad un raw socket; • tutti i pacchetti IGMP vengono passati ai raw socket, dopo che il kernel ha finito di processare il pacchetto IGMP; • la maggior parte dei pacchetti ICMP sono passati ai raw socket, dopo che il kernel ha finito di processare il messaggio ICMP; • tutti i datagrammi IP con un campo protocollo che il kernel non riconosce sono passati ai raw socket. Su questi datagrammi il kernel si limita ad effettuare delle verifiche di alcuni campi dell’header. 7 M. Bernaschi: Uso di sniffer ed ... Raw Socket Input Altre regole: • Se un datagramma arriva frammentato, viene riassemblato prima di essere passato al raw socket. • I datagramma per un raw socket IPv4 contengono sempre l’header IP. L’header IPv6 ed eventuali header di estensioni non sono mai passati ad un raw socket IPv6. • Se ci sono più processi con raw socket che potrebbero ricevere un datagramma in entrata, ciascuno riceve una copia. • Se viene creato un raw socket con un protocollo eguale a 0 e non viene utilizzata né la bind né la connect, il raw socket riceve una copia di ogni datagramma che il kernel passa ai raw socket. 8 M. Bernaschi: Uso di sniffer ed ... Il programma traceroute Indica il percorso per raggiungere un dato host. • traceroute usa l’ICMP ed il campo TTL nell’header IP (per IPv4) o l’“hop limit” (per IPv6): – Il valore iniziale che viene “raccomandato” per il TTL è attualmente 64; – ogni router deve decrementare di uno il valore del TTL; – quando un router riceve un datagramma IP il cui TTL è 0 o 1 non inoltra il datagramma; – il router scarta il datagramma ed invia al host “mittente” un messaggio ICMP time exceeded. • traceroute sfrutta il fatto che il messaggio ICMP contiene, come IP sorgente, l’indirizzo del router che ha scartato il datagramma. 9 M. Bernaschi: Uso di sniffer ed ... Il programma traceroute 1. traceroute invia un datagramma IP con un TTL di 1 all’host di destinazione; 2. il primo router che riceve il datagramma decrementa il TTL, scarta il datagramma, e manda indietro il pacchetto ICMP time exceeded. In questo modo viene identificato il primo router nel cammino; 3. traceroute invia quindi un datagramma con un TTL uguale a 2 e determina l’indirizzo IP del secondo router; 4. la procedura continua fino a quando il datagramma non raggiunge l’host di destinazione. A questo punto abbiamo un problema: l’host di destinazione NON manda indietro il pacchetto ICMP time exceeded. Come possiamo 10 M. Bernaschi: Uso di sniffer ed ... essere sicuri di aver raggiunto effettivamente la destinazione finale? 11 M. Bernaschi: Uso di sniffer ed ... Il programma traceroute • traceroute invia datagrammi UDP all’host di destinazione su una porta UDP random (> 30000) in modo da rendere improbabile che ci sia un’applicazione che utilizza tale porta (in genere la prima porta utilizzata è la 33434). • In questo modo il modulo UDP dell’host di destinazione genera un diverso messaggio di errore ICMP: port unreachable. • La maggior parte delle versioni per Windows di traceroute utilizzano paccheti ICMP di tipo ECHO REQUEST invece di pacchetti UDP. 12 M. Bernaschi: Uso di sniffer ed ... Il programma traceroute HEADER, POINTERS AND LENGTHS IN ICMP PACKETS IP IP Header HEADER OPTIONS 20 Bytes 0-40 ICMP IP HEADER HEADER 8 20 IP Header OPTIONS 0-40 UDP HEADER 8 IP datagram that generated the ICMP error Notare come siano necessari due socket: un raw socket dal quale leggere tutti i messaggi ICMP ed un socket UDP sul quale inviare i “pacchetti-sonda” che hanno un TTL crescente. 13 M. Bernaschi: Uso di sniffer ed ... Tracciamento di connessioni Il classico “tracciamento” basato su traceroute può non essere sufficiente. • Firewall o router intermedi possono bloccare i pacchetti UDP utilizzati da traceroute. • Possono essere richieste altri informazioni (ad esempio la locazione geografica di un host). Per risolvere il primo problema può essere utilizzato tcptraceroute disponibile su http://michael.toren.net/code/tcptraceroute/ che utilizza pacchetti TCP su porte impostate dall’utente. 14 M. Bernaschi: Uso di sniffer ed ... Tracciamento di connessioni • fornisce indicazioni su possibili tecniche per individuare la locazione geografica di un host a partire dall’indirizzo IP. http://www.private.org.il/IP2geo.html • Informazioni sull’Internet Routing Register possono essere ottenute dal Routing Access Database: http://www.radb.net che è essenzialmente un whois server. whois -h whois.radb.net 128.223.0.0/16 • Un altro sito utile per operazioni di tracciamento è: http://samspade.org 15 M. Bernaschi: Uso di sniffer ed ... Accesso a livello Datalink L’accesso a livello datalink (i.e. accesso a livello di device driver) fornisce la possibilità: • di ricevere tutti i pacchetti che viaggiano su un dato segmento di rete – l’interfaccia di rete deve essere posta in modalità “promiscua”; • di offrire, come normali applicazioni utente, servizi che altrimenti dovrebbero far parte del kernel. Ad esempio un DHCP server. 16 M. Bernaschi: Uso di sniffer ed ... Accesso a livello Datalink Esistono tre approcci possibili per l’accesso a livello datalink sotto UNIX/Linux: • il Packet Filter (BPF) dei sistemi BSD; • la Data Link Provider Interface (DLPI) del SVR4; • l’interfaccia SOCK PACKET di LINUX. La libreria di dominio pubblico libpcap permette di scrivere programmi indipendenti dallo specifico metodo di accesso. ftp://ftp.ee.lbl.gov/papers/bpf-usenix93.ps.Z 17 M. Bernaschi: Uso di sniffer ed ... BSD Packet Filter (BPF) application application process kernel buffer buffer IP Layer Filter BPF Filter DATA LINK (device driver) Network card 18 M. Bernaschi: Uso di sniffer ed ... BSD Packet Filter Il datalink driver invoca il BPF prima di trasmettere il pacchetto e subito dopo che il pacchetto è stato trasmesso in modo da fornire un timestamp accurato. • La potenza del BPF è nelle sue capacità di “filtraggio”. • Ogni applicazione che utilizza il BPF può caricare il proprio filtro che viene applicato ad ogni pacchetto. • BPF implementa un “calcolatore virtuale” (basato su registri) che applica i filtri specificati dalle applicazioni ad ogni pacchetto ricevuto. 19 M. Bernaschi: Uso di sniffer ed ... BSD Packet Filter Il BPF utilizza tre tecniche per ridurre l’overhead: • il filtraggio BPF avviene all’interno del kernel in modo da minimizzare la quantità di dati copiata dal BPF all’applicazione; • normalmente solo una porzione di ogni pacchetto viene passata dal BPF all’applicazione (capture length); • BPF invia i dati destinati all’applicazione in blocchi (buffering). Normalmente il BPF NON viene utilizzato per inviare datagrammi IP. 20 M. Bernaschi: Uso di sniffer ed ... BSD Packet Filter • Per accedere il BPF si deve aprire uno speciale device /dev/bpf0, /dev/bpf1,... che non sia già in uso • Ci sono circa una decina di comandi (ioctl) che definiscono le caratteristiche del device: caricamento del filtro, definizione del timeout di lettura, abilitazione della modalità “promiscua”. • L’I/O viene effettuato utilizzando le classiche read e write. 21 M. Bernaschi: Uso di sniffer ed ... PF PACKET sotto Linux #include <sys/socket.h> #include <netpacket/packet.h> #include <net/ethernet.h> /* the L2 protocols */ packet_socket = socket(PF_PACKET, int socket_type, int protocol); I socket packet sono utilizzati sotto Linux per ricevere ed inviare pacchetti a livello di device driver (OSI Layer 2). Possono essere utilizzati per permettere all’utente di implementare propri protocolli di comunicazione direttamente sopra il livello “fisico”. 22 M. Bernaschi: Uso di sniffer ed ... PF PACKET sotto Linux Il tipo di socket è SOCK RAW per pacchetti raw che includono l’header a livello link (indirizzi hw) o SOCK DGRAM per pacchetti senza l’header di livello link. Le informazioni necessarie all’header di livello link sono definite in un formato comune nella struttura sockaddr ll: /usr/include/linux/if_packet.h Quando il protocollo è impostato a htons(ETH P ALL) vengono ricevuti tutti i protocolli! 23 M. Bernaschi: Uso di sniffer ed ... PF PACKET sotto Linux • I pacchetti SOCK RAW sono passati a/dal device driver senza nessuna modifica. Quando si trasmette un pacchetto, questo deve contenere anche l’header di livello link (gli indirizzi hw). • il SOCK DGRAM opera ad un livello leggermente superiore. L’header di livello link è rimosso dal pacchetto prima che questo venga passato all’applicazione utente. Per i pacchetti inviati attraverso un SOCK DGRAM viene costruito un header di livello link opportuno sulla base delle informazioni disponibili sull’indirizzo di destinazione (in formato sockaddr ll). 24 M. Bernaschi: Uso di sniffer ed ... PF PACKET sotto Linux Paragonando le caratteristiche di Linux al BPF possiamo notare alcune differenze: • Non esiste a livello kernel un meccanismo di buffering dei pacchetti e solo recentemente sono state rese disponibili capacità di filtraggio (tramite l’opzione SO ATTACH FILTER). • Non esiste un meccanismo di filtraggio “per device”. Se viene specificato ETH P IP nella chiamata a socket, tutti i pacchetti IP da tutti i device (Ethernet, PPP link, ...) sono passati al socket. 25