# IP spoofing

IP spoofing è la denominazione con la quale si indica, in una rete di computer, una tecnica di attacco informatico che utilizza un pacchetto IP nel quale viene falsificato l'indirizzo IP del mittente.
Nell'header di un pacchetto IP si trova uno specifico campo, il Source Address, il cui valore indica l'indirizzo IP del mittente: modificando questo campo si può far credere che un pacchetto IP sia stato trasmesso da una macchina host diversa.

## IP spoofing e sicurezza informatica

Questa tecnica può essere utilizzata per superare alcune tecniche difensive contro le intrusioni, in primis quelle basate sull'autenticazione dell'indirizzo IP. Infatti, è normale che in intranet aziendali l'autenticazione ad alcuni servizi avvenga sulla base dell'indirizzo IP, senza l'utilizzo di altri sistemi (come username e password). Questo tipo di attacco ha tanto più successo quanto più i rapporti di "fiducia" tra due o più macchine sono forti.
Una delle difese che si possono attuare contro questo tipo di attacco è l'utilizzo di packet filtering, impostando opportune regole sulla base delle quali viene deciso quali pacchetti dall'esterno possono essere trasmessi all'interno della rete aziendale e viceversa. Nello specifico caso, per evitare un attacco basato sullo spoofing basta impostare una serie di regole che vieti il passaggio dall'esterno verso l'interno della rete aziendale di pacchetti IP che abbiano come indirizzo IP sorgente quello di una macchina interna. Ovviamente si possono impostare anche delle regole in modo tale da evitare attacchi di spoofing dall'interno verso l'esterno.
L'IP spoofing risulta essere una tecnica utile per ottenere l'anonimato di un singolo pacchetto, ma è difficile sfruttarla per attacchi che prevedano lo spoofing di un'intera sessione/comunicazione in quanto chi invia il pacchetto (attaccante) non sarà, generalmente, in grado di proseguire in modo coerente la comunicazione, dato che le risposte saranno inviate dal ricevente (vittima) all'indirizzo IP indicato nel pacchetto ("spoofato"). In passato era possibile realizzare un attacco di spoofing attivando le opzioni di Source Routing, obbligando la vittima a instradare le risposte verso l'attaccante; attualmente è quasi impossibile trovare su Internet un router che rispetti le opzioni di Source routing: quasi tutti scartano i pacchetti che le contengono.
Si tratta di una tecnica utilizzata principalmente durante attacchi di tipo DoS e principalmente nella loro variante distribuita (o DDoS), per evitare di rendere facilmente identificabile l'attaccante (o gli attaccanti).

## IP spoofing, perché funziona

Ai fini del routing dei pacchetti IP ha importanza solo l'indirizzo di destinazione: è per questo motivo che in condizioni normali è possibile spedire pacchetti IP che sembrano provenire da un qualunque IP. Inoltre spesso vi è mancanza di un controllo a livello superiore che autentichi la sorgente dei pacchetti IP. Una soluzione può essere utilizzare IPsec.

## IP spoofing e trasmissione dati satellitare

Un suo utilizzo legittimo in voga fino a qualche tempo fa era nel campo delle trasmissioni dati via satellite che hanno latenze molto elevate e bassi tassi di errore. La latenza elevata superava i tempi concessi per l'Acknowledge TCP e quindi imponeva la ritrasmissione del pacchetto. Per questa ragione al client venivano inviati pacchetti di acknowledge "falsi" di avvenuta ricezione approfittando del basso tasso di errore assicurato dai collegamenti satellitari. Oggi al posto dello spoofing si preferisce lo sliding window.

## Servizi vulnerabili all'IP Spoofing

Alcuni servizi che sono vulnerabili sono:
* RPC (Remote Procedure Call)
* Qualsiasi servizio che utilizza l'autenticazione IP
* X Window System
* I servizi della R suite (rlogin, remote shell, etc.).

## Tipi di attacco

Gli attacchi di IP Spoofing possono essere divisi in tre categorie:
* IP Spoofing non cieco: è attuabile in una rete LAN; quando chi attacca cerca di farsi passare per un host che è nella sua stessa sottorete.
* IP Spoofing cieco: quando l'attaccante cerca di farsi passare per un host di una qualsiasi sottorete.
* Attacchi DoS: l'attaccante cerca di bloccare un host per impedire a quest'ultimo di svolgere la normale attività oppure per prenderne il controllo.
Successivamente vengono descritti diversi scenari, sempre utilizzando il TCP (Transmission Control Protocol) come protocollo di livello trasmissione. Si può utilizzare l'IP Spoofing anche con il protocollo UDP (User Datagram Protocol) ma essendo senza autenticazione viene poco utilizzato per effettuare accessi autenticati al sistema.

### Cambiare l'indirizzo IP sorgente

Per effettuare qualsiasi attacco di IP Spoofing occorre riuscire a modificare l'header del pacchetto IP. Uno strumento per fare questa operazione sono le Raw Socket. Questo tipo di socket permette di creare a piacimento il pacchetto (header compreso), ovviamente occorre creare manualmente l'header completo del pacchetto. Diversi linguaggi implementano le raw socket (C, C++, Python, etc) e risulta più facile operare l'attacco in ambiente Unix.

### IP Spoofing non cieco

L'attaccante sta cercando di farsi passare per un host che fa parte della sua sottorete; quindi, impostando la scheda di rete in modo promiscuo, egli riesce a leggere tutti i pacchetti indirizzati all'host che intende impersonare e può così scoprire i Sequence number e Acknowledgement number della connessione in corso e cercare di inserirvisi.
Si possono effettuare alcuni tipi di attacco, tra cui la chiusura di una connessione e l'intromissione in una connessione (Hijacking).
Per chiudere una connessione iniziata dalla vittima occorre "sniffare" almeno un pacchetto della comunicazione (quello di ritorno dal server) da interrompere in modo tale da capire il sequence number e calcolarne il valore successivo. Si possono utilizzare i flag di reset (RST) o fine dati (FIN). Con il flag di reset l'ack è disabilitato quindi basta calcolare il sequence number a partire dall'ack del pacchetto sniffato. Per il flag di fine dati occorre calcolare anche l'ack corretto. Perché l'attacco vada a buon fine il pacchetto "spoofato" deve essere inviato prima della risposta del client (se questo succede il sequence number viene modificato).
Per intromettersi in una comunicazione TCP occorre desincronizzare il client, che consiste nel cambiare sequence number e ack della conversazione con il server.
Dato il client A, un server B e un attaccante C (connesso alla stessa rete di A), un possibile metodo per desincronizzare A da parte di C è:
* C ascolta la conversazione tra A e B e intercetta un pacchetto B → A
* C invia un pacchetto spoofato da inviare a B con sequence number e ack calcolati dal pacchetto ricevuto da B
* B riceve il pacchetto da A(C) e risponde ad A
* Adesso il sequence number di A non corrisponde più all'ack ricevuto da B quindi B scarterà tutti i pacchetti inviati da A, che non sa del pacchetto spoofato inviato da C
* In questa situazione C può inviare i pacchetti spoofati a B mentre A non può inviare a B ma riceve i messaggi da B
* Per bloccare anche i pacchetti B → A, C manda un pacchetto spoofato ad A come se fosse il server B
* A riceve il pacchetto da B(A) e modifica i parametri di sequence e ack all'insaputa di B
* Adesso B è desincronizzato rispetto ad A quindi scarta i pacchetti inviati da A
* Ora C può inviare pacchetti spoofati a B senza che A veda le risposte di B inoltre A non può inviare pacchetti a B in quella connessione
Altri metodi di desincronizzazione si possono effettuare intromettendosi nella comunicazione di hand-shake iniziale, resettando la connessione originale e forzando il server ad aprire una nuova connessione con lo stesso client ma con sequence number diverso.
Un problema derivante questo tipo di attacco è l'ACK storm: quando client e server sono desincronizzati tra loro ad ogni tentativo di inviare pacchetti la parte opposta lo scarta e rimanda il l'ultimo pacchetto inviato, la parte opposta riceve il pacchetto, lo scarta perché è desincronizzato e rimanda il suo ultimo pacchetto inviato, così comincia il loop che prosegue fino a che un pacchetto di ack viene perso oppure si raggiunge il timeout e la connessione viene resettata. Durante questa fase può venire utilizzata una significativa quantità di banda, che ha dato spunto ad attacchi DoS specifici.

### IP Spoofing cieco

In questo tipo di attacco l'attaccante non si trova nella stessa rete della vittima quindi anche se può inviare pacchetti spoofati (si può tentare di instaurare connessioni con il server) apparendo la vittima, tutti i pacchetti di risposta saranno inviati alla vittima e l'attaccante non può intercettarli facilmente. Inoltre non conoscendo le risposte dal server non si possono calcolare i sequence number e quindi proseguire il dialogo. Per aggirare questo problema si può tentare di predire il sequence number del server (TCP sequence prediction attack).
Un sequence number può essere generato in diversi modi:
* Utilizzando la regola dei 64k, che consiste nell'aumentare ad ogni secondo di una certa costante il sequence number (rispetto a quello utilizzato per la connessione precedente) e aggiungere un altro numero costante se si cambia la connessione
* Aumentando di una costante il sequence number a ogni intervallo di tempo prefissato
* Generando un numero casuale per ogni connessione
Se l'implementazione del TCP utilizza il primo risulta facile per l'attaccante predire il sequence number. Ad esempio può provare a creare qualche connessione di prova con il suo indirizzo IP per capire quale regola adotta il server e a che numero di sequenza è arrivato. Nel caso della seconda tecnica occorrono diverse prove per capire il comportamento del server, mentre se il sequence number è generato casualmente non si riesce a proseguire in questo tipo di attacco.
Una volta che l'attaccante riesce a predire il numero di sequenza può instaurare una connessione TCP con il server facendosi passare per la vittima. Da notare il fatto che l'attaccante non può comunque vedere se il server risponde ai pacchetti (questo non è un grosso problema perché lo scopo dell'attaccante può essere d'inviare comandi al server e quindi non è interessato da ulteriori risposte).
Da ricordare il fatto che la vittima riceve tutti i pacchetti di risposta dal server quindi occorre mettere offline la vittima prima di iniziare questo attacco.

### Attacchi Dos

La tecnica dell'IP Spoofing viene anche utilizzata per attacchi di tipo denial of service, il cui scopo è atterrare la macchina della vittima. Il mascheramento dell'IP compare negli attacchi Smurf (si cerca di esaurire la banda della vittima) e anche nell'attacco SYN flood (si cerca di esaurire le risorse della vittima).