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: m.bernaschi@iac.cnr.it
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
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
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
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
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
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
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
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
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
essere sicuri di aver raggiunto effettivamente la destinazione finale? 11
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
Il programma traceroute HEADER, POINTERS AND LENGTHS IN ICMP PACKETS IP HEADER IP Header OPTIONS ICMP HEADER IP HEADER IP Header OPTIONS UDP HEADER 20 Bytes 0-40 8 20 0-40 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
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
Tracciamento di connessioni http://www.private.org.il/ip2geo.html fornisce indicazioni su possibili tecniche per individuare la locazione geografica di un host a partire dall indirizzo IP. 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
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
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
BSD Packet Filter (BPF) application buffer Filter application buffer Filter process kernel IP Layer BPF DATA LINK (device driver) Network card 18
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
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
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
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
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
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
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