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