L'«IP spoofing» è una tecnica che consiste nel sostituire l'indirizzo IP del mittente di un pacchetto IP con l'indirizzo IP di un altro terminale.
Questa tecnica permette così ad un pirata di inviare dei pacchetti in anonimo. Non si tratta però di un cambiamento di indirizzo IP, ma di un travestimento dell'indirizzo IP a livello dei pacchetti emessi. Alcuni tendono ad assimilare l'utilizzazione di un proxy (che permette di mascherare in un certo modo l'indirizzo IP) con lo spoofing IP. Tuttavia, il proxy non fa che trasmettere i pacchetti. Ma anche se l'indirizzo è apparentemente mascherato, un pirata può facilmente essere trovato grazie ai log del proxy.
La tecnica dello spoofing di indirizzo IP può permettere ad un pirata di farsi passare dei pacchetti su una rete senza questi siano intercettati dal sistema di filtraggio dei pacchetti (firewall). In effetti, un sistema firewall funziona soprattutto in base a regole di filtraggio che indicano gli indirizzi IP autorizzati a comunicare con i terminali interni alla rete:
Un pacchetto spoofato con l'indirizzo IP di un terminale interno sembrerà provenire dalla rete interna e sarà trasferito al terminale bersagli dell'attacco, mentre un pacchetto contenente un indirizzo IP esterno sarebbe automaticamente rifiutato dal firewall. Ciononostante, il protocollo TCP (protocollo che assicura principalmente il trasporto sicuro dei dati su internet) riposa su link di autenticazione e di approvazione fra i terminali di una rete, il che significa che per accettare il pacchetto, il destinatario deve innanzitutto dare ricevuta di ritorno presso il mittente, che a sua volta dovrà fare la stessa la cosa una volta ricevuta la ricevuta di ritorno.
Su internet, le informazioni circolano grazie al protocollo IP, che assicura l'incapsulamento dei dati in strutture chiamate pacchetti ( o più esattamente datagrammi IP). Di seguito la struttura di un datagramma:
Versione | Lunghezza del titolo | Tipo di servizio | Lunghezza totale | |
Identificazione | Bandiera | Spostamento frammentato | ||
Durata di vita | Protocollo | Somma del controllo intestazione | ||
Indirizzo IP sorgente | ||||
Indirizzo IP destinazione | ||||
Dati |
Usurpare un indirizzo IP significa modificare il campo sorgente per simulare un datagramma proveniente da un altro indirizzo IP. Tuttavia, su internet, i pacchetti sono generalmente trasportati dal protocollo TCP, che assicura una trasmissione detta «affidabile». Prima di accettare un pacchetto, un terminale deve innanzitutto inviare una ricevuta di ritorno al terminale mittente, e aspettare che quest'ultimo confermi la buona ricezione della ricevuta di ritorno.
Il protocollo TCP è uno dei principali protocolli del livello trasporto del modello TCP/IP. Questo protocollo consente, a livello delle applicazioni, di gestire i dati provenienti (o destinati) dal livello inferiore del modello (cioè il protocollo IP). Il protocollo TCP permette di assicurare il trasferimento dei dati in modo sicuro, anche se utilizza il protocollo IP (che non ha nessun controllo integrato di consegna del datagramma) grazie ad un sistema di ricevute di ritorno (ACK) che permette al client e al server di assicurare la buona ricezione reciproca dei dati.
I datagrammi IP incapsulano dei pacchetti TCP (detti segmenti) la cui struttura è:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
Porta sorgente |
|||||||||||||||
Numero d'ordine | |||||||||||||||
Numero di ricevuta di ritorno | |||||||||||||||
Spostamento données |
riservato | URG | ACK | PSH | RST | SYN | FIN |
||||||||
Somma di controllo |
|||||||||||||||
Opzioni |
|||||||||||||||
Dati | |||||||||||||||
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ | |||||||||||||||
16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
Porta destinazione | |||||||||||||||
Numero d'ordine | |||||||||||||||
Numero di ricevuto di ritorno | |||||||||||||||
finestra | |||||||||||||||
Pointer di emergenza | |||||||||||||||
opzioni | riempimento | ||||||||||||||
Dati |
Al momento dell'emissione di un segmento, viene associato un numero d'ordine (detto anche numero di sequenza), e uno scambio di segmenti contenenti dei campi particolari (detti flag, in italiano bandiere) che permettono di sincronizzare il client ed il server. Questo dialogo (detto stretta di mano in tre tempi), permette di iniziare la comunicazione, svolgendosi in tre tempi, come indicato dal suo nome:
In un primo tempo, viene tramsesso dal terminale emittente (il client) un segmento il cui flag SYN è a 1 (per segnalare che si tratta di un segmento di sincronizzazione), con un numero d'ordine N, che viene chiamato numero d'ordine iniziale del client.
In un secondo tempo il terminale emittente (il server) riceve il segmento iniziale proveniente dal client, poi gli invia una ricevuta di ritorno, cioè un segmento il cui flag ACK è non nullo (ricevuta di ritorno) ed il flag SYN è a 1 (dato che si tratta di una sincronizzazione). Questo segmento contiene un numero di sequenza uguale al numero d'ordine iniziale del client. Il campo più importante di questo segmento è il campo ricevuta di ritorno (ACK) che contiene il numero d'ordine iniziale del client, aumentato di 1.
In ultimo, il client trasmette al server la ricevuta di ritorno, cioè un segmento il cui flag ACK è non nullo, e il cui flag SYN è a zero (non si tratta più di un segmento di sincronizzazione). Il suo numero d'ordine è aumentato e il numero della ricevuta di ritorno rappresenta il numero di sequenza iniziale del server aumentato di 1. Il terminale spoofato risponderà con un pacchetto TCP il cui flag RST (reset) è non nulla, cosa che metterà fine alla connessione.
Nel quadro di un attacco spoofing di indirizzo IP, l'attaccante non ha nessun ritorno di informazioni dato che le risposte del terminale bersaglio dell'attacco vanno verso un altro terminale di rete (si parla allora di attacco alla cieca, in inglese blind attack):
Inoltre, il terminale «spoofato» priva l'hacker di qualsiasi tentativo di connessione, dato che questo invia sistematicamente una bandiera RST al terminale bersaglio dell'attacco. Il lavoro del pirata consiste quindi nell'invalidare il terminale spoofato rendendolo irraggiungibile durante tutta la durata dell'attacco.
Quando il terminale spoofato è invalido, il terminale bersaglio dell'attacco aspetta un pacchetto con la ricevuta di ritorno e l'esatto numero di sequenza. Tutto il lavoro del pirata consiste allora nell'«indovinare» il numero di sequenza da rinviare al server per stabilire una relazione di fiducia.
Per questo, i pirati usano generalmente il source routing, cioè utilizzano il campo opzione del header IP per indicare una via di ritorno specifica al pacchetto. Così, grazie allo sniffing, il pirata potrà anche leggere il contenuto dei pacchetti di ritorno:
Inoltre, conoscendo l'ultimo numero di sequenza emesso, il pirata stabilisce delle statistiche riguardo il suo incremento e invia delle ricevute di ritorno fino ad ottenere l'esatto numero di sequenza.
CERT® Advisory CA-1995-01 IP Spoofing Attacks and Hijacked Terminal Connections;
RFC 793 - Transmission Control Protocol - Protocol Specification;
RFC 1948 - Defending Against Sequence Number Attacks.
Foto: © Pixabay.