Che cosa non va nel protocollo Address Resolution Protocol e come usarlo per catturare il traffico in rete
Non badare all’uomo dietro la tenda!
— Noel Langley, “Il mago di Oz”
La tecnica chiamata ARP Spoofing sfrutta una vulnerabilità nella progettazione del protocollo ARP (Address Resolution Protocol). Qui spieghiamo come funziona il protocollo ARP, descriviamo i passi di un attacco ARP Spoofing e poi proviamo a eseguirlo.
Come vengono trasmessi i dati in Internet
Prima di poter parlare di ARP Spoofing, dobbiamo introdurre la struttura generale di Internet. Questo paragrafo spiega come Internet trasmette i dati attraverso una rete gerarchica utilizzando pacchetti, indirizzi MAC e indirizzi IP.
Pacchetti
Tutte le informazioni, su Internet, vengono trasmesse in pacchetti. Un pacchetto è come una “busta” che contiene i dati da inviare. Come nel caso del servizio postale, questi pacchetti vengono instradati verso le loro destinazioni in base all’indirizzo specificato. La figura seguente mostra alcuni parallelismi tra buste fisiche e pacchetti di dati.
La sezione Da su una busta contiene due informazioni fondamentali:
- il nome della persona che invia la lettera;
- dove vive.
Allo stesso modo, i pacchetti hanno l’indirizzo MAC (Media Access Control) che rappresenta la macchina che invia il pacchetto e l’indirizzo IP che rappresenta la provenienza del pacchetto. Altri campi simili, le intestazioni del pacchetto, rappresentano la destinazione del pacchetto.
Internet utilizza dei dispositivi, detti router, per ordinare e inoltrare i pacchetti. I pacchetti attraversano Internet, viaggiando da un router all’altro come la posta viaggia da un ufficio postale all’altro.
Indirizzi MAC
Il nostro portatile contiene una scheda di interfaccia di rete, detta NIC (Network Interface Card) che gli consente di connettersi ai router Wi-Fi. Questa scheda ha un indirizzo univoco, chiamato indirizzo MAC, che identifica la nostra macchina sulla rete. Quando il router vuole inviare informazioni del nostro computer, etichetta quel pacchetto con l’indirizzo MAC del nostro portatile e poi lo trasmette tramite segnali radio. Tutte le macchine connesse a quel router ricevono questo segnale radio e controllano l’indirizzo MAC del pacchetto per scoprire se il pacchetto è destinato a loro. Gli indirizzi MAC sono normalmente numeri a 48 bit scritti in esadecimale (per esempio, 08:00:27:3b:8f:ed).
Indirizzi IP
Sappiamo già che anche gli indirizzi IP identificano le macchine su una rete. Allora, perché abbiamo bisogno di entrambi gli indirizzi, IP e MAC? Bene, le reti sono costituite da regioni gerarchiche, un po’ come alcuni Paesi sono divisi in Stati, che a loro volta contengono regioni e città. Gli indirizzi IP seguono una struttura che consente loro di identificare la posizione di un dispositivo nella rete più ampia. Se ci trasferissimo in un altro bar, al nostro portatile verrebbe assegnato un indirizzo IP differente, per riflettere la sua nuova posizione; tuttavia, il nostro indirizzo MAC rimarrebbe sempre lo stesso.
Leggi anche: Il primo sniffing di dati dalla rete con Wireshark
Un indirizzo IPv4 codifica le informazioni sulla gerarchia di rete in un numero a 32 bit. Questo numero è tipicamente rappresentato da quattro sezioni separate da punti (come 192.168.3.1). Ogni sezione rappresenta un numero binario a 8 bit. Per esempio, il 3 in 192.168.3.1 rappresenta il numero binario a 8 bit 00000011.
Gli indirizzi IP situati nella stessa regione della gerarchia condividono gli stessi bit di livello superiore. Per esempio, tutte le macchine nel campus dell’Università della Virginia hanno indirizzi IPv4 come 128.143.xxx.xxx. Si può vedere che questo concetto è scritto in notazione CIDR (Classless Inter-Domain Routing) come 128.143.1.1/16, a indicare che le macchine condividono gli stessi 16 bit superiori, ovvero i primi due numeri. Poiché gli indirizzi IP seguono una determinata struttura, i router possono utilizzare parti dell’indirizzo IP per decidere come instradare un pacchetto attraverso la gerarchia. La prossima figura mostra un esempio semplificato di questa gerarchia di router.
La figura qui sopra mostra anche un DSLAM (Digital Subscriber Line Access Multiplexer). Un DSLAM consente di inviare i segnali del traffico Internet su cavi originariamente previsti per la televisione via cavo. Il DSLAM distingue tra i segnali Internet e i segnali televisivi, motivo per cui è possibile collegare alla stessa presa sia il televisore sia il router.
Usiamo l’esempio del coffee shop per seguire un pacchetto mentre attraversa la gerarchia di rete. Immaginiamo di essere in un bar di San Francisco e di accedere alla seguente pagina web: http://www.cs.virginia.edu. Questa pagina web è ospitata su un server web con l’indirizzo IP 128.143.67.11. Nella prima parte del suo viaggio, la richiesta web attraversa la scheda NIC del nostro portatile, che poi la invia al router Wi-Fi nel bar. Il router invia quindi la richiesta web al DSLAM, che inoltra la richiesta a un router di proprietà di un ISP (Internet Service Provider), come Comcast. I router Comcast confrontano l’indirizzo IP con un elenco di prefissi, fino a trovare una corrispondenza. Per esempio, il router Comcast potrebbe trovare una corrispondenza per il prefisso 128.xxx.xxx.xxx, che indica la sua connessione a quella sezione della gerarchia. Man mano che la richiesta scende nella gerarchia, le corrispondenze diventeranno più specifiche. Per esempio, l’indirizzo cercherà corrispondenze con 128.143.xxx.xxx e poi con 128.143.67.xxx. Una volta che il pacchetto raggiunge il livello più basso della gerarchia, dove non ci sono più router, il router utilizza l’indirizzo MAC nel pacchetto per determinare la destinazione finale della richiesta. Il livello più basso della gerarchia è una rete locale, LAN (Local Area Network), dove tutte le macchine sono connesse tramite un singolo router.
Ora che abbiamo una panoramica generale della struttura di Internet, possiamo parlare degli attacchi che hanno luogo al livello più basso della gerarchia.
Tabelle ARP
Abbiamo stabilito come, dopo che un pacchetto ha raggiunto la sua LAN designata, la rete utilizzi l’indirizzo MAC del pacchetto per determinare la sua destinazione finale. Ma come fa il router a conoscere l’indirizzo MAC della macchina avente l’indirizzo IP 128.143.67.11? È qui che diventa utile l’ARP, il protocollo per la risoluzione dell’indirizzo. In base all’ARP, il router invia un messaggio, chiamato query ARP, a tutte le macchine della rete, chiedendo alla macchina con l’indirizzo IP 128.143.67.11 di rispondere con una risposta ARP contenente il proprio indirizzo MAC. Il router memorizzerà così questa mappatura tra l’indirizzo IP e il MAC in un’apposita tabella, la tabella ARP. Memorizzando queste informazioni nella tabella ARP, il router riduce la necessità di emettere query ARP nel prossimo futuro.
Attacchi ARP Spoofing
Un attacco ARP Spoofing comporta due fasi. Durante la prima fase, l’hacker invia alla vittima una falsa risposta ARP, affermando che il suo indirizzo MAC è l’indirizzo IP del router. Ciò consente all’hacker di indurre la vittima a credere che la macchina dell’hacker sia il suo router. Durante la seconda fase, la vittima accetta il falso pacchetto ARP inviato dall’hacker e aggiorna la mappa nella sua tabella ARP, per riflettere il fatto che l’indirizzo MAC dell’hacker ora corrisponde all’indirizzo IP del router. Ciò significa che il traffico Internet della vittima verrà inviato alla macchina dell’hacker invece che al router. La macchina dell’hacker potrà poi inoltrare queste stesse informazioni al router, dopo averle ispezionate.
Se l’hacker vuole intercettare anche il traffico Internet destinato alla vittima, deve ingannare anche il router, affinché gli invii il traffico della vittima. Pertanto, l’hacker deve creare un falso pacchetto ARP che indichi come l’indirizzo IP della vittima corrisponda all’indirizzo MAC dell’hacker. Ciò consente all’hacker di intercettare e ispezionare il traffico in ingresso da Internet e poi inoltrarlo alla vittima.
Possiamo spiegare le idee di base di un attacco ARP Spoofing con un semplice schema, illustrato nella figura seguente. Qui, Jane (l’hacker) inganna Alice (la vittima) facendosi inviare la posta di Alice.
L’attacco ARP Spoofing è un esempio di attacco man-in-the-middle, perché l’hacker si frappone tra la vittima e il router.
Proteggersi dall’ARP Spoofing
Sebbene sia difficile prevenire un attacco ARP Spoofing, la cifratura del traffico Internet aiuta a proteggere le informazioni, che non potranno essere sottratte o modificate. Tutto il traffico inviato tramite una connessione HTTPS è crittografato. Tuttavia, è noioso controllare manualmente che ogni URL che visitate utilizzi HTTPS, quindi Electronic Frontier Foundation ha creato un’estensione dei browser web (per Chrome, Edge, Firefox e Opera) chiamata HTTPS Everywhere che garantisce che tutto il nostro traffico web attraversi una connessione HTTPS. L’installazione di questo plug-in è un ottimo modo per proteggersi.
Rilevamento di un attacco ARP Spoofing
In questo paragrafo, scriveremo un programma Python per rilevare euristicamente un attacco ARP Spoofing. Costruiremo la nostra tabella ARP usando un dizionario e poi controlleremo se il pacchetto che riceviamo ha cambiato una voce. Supporremo che qualsiasi pacchetto che modifica lo stato della nostra tabella sia dannoso.
Inizieremo selezionando una libreria in grado di intercettare e analizzare i pacchetti che attraversano la nostra scheda NIC. Scapy è un pacchetto Python che ci consente di leggere e inviare pacchetti di dati. Prima di poter utilizzare Scapy, dovremo installarlo con pip3. Usiamo i seguenti comandi per ottenere sia pip3 sia Scapy:
kali@kali:~$ sudo apt-get install python3-pip
kali@kali:~$ pip3 install --pre scapy[basic]
Una volta installato Scapy, potremo importare la libreria sniff, che ci consente di catturare e ispezionare i pacchetti che attraversano la nostra scheda NIC. Copiamo e incolliamo il seguente programma Python (arpDetector.py) in Mousepad o in un editor di codice di nostra scelta. Per avviare Mousepad, eseguiamo mousepad &.
from scapy.all import sniff
IP_MAC_Map = {}
def processPacket(packet):
src_IP = packet['ARP'].psrc
src_MAC = packet['Ether'].src
if src_MAC in IP_MAC_Map.keys():
if IP_MAC_Map[src_MAC] != src_IP :
try:
old_IP = IP_MAC_Map[src_MAC]
except:
old_IP = "unknown"
message = ("\n Possible ARP attack detected \n "
+ "It is possible that the machine with IP address \n "
+ str(old_IP) + " is pretending to be " + str(src_IP)
+"\n ")
return message
else:
IP_MAC_Map[src_MAC] = src_IP
sniff(count=0, filter="arp", store = 0, prn = processPacket) ➊
La funzione sniff() ➊ della libreria Scapy accetta diversi parametri opzionali. In questa implementazione, usiamo il parametro count per indicare il numero di pacchetti da annusare. Un valore di count pari a 0 significa che la libreria deve controllare tutti i pacchetti. Usiamo anche il parametro filter, che specifica il tipo di pacchetto da catturare. Poiché siamo interessati solo ai pacchetti ARP, specifichiamo un valore di filtro “arp”. Il parametro store indica il numero di pacchetti da memorizzare. Impostiamo il parametro a 0, perché non vogliamo sprecare memoria memorizzando i pacchetti. Infine, il parametro prn punta alla funzione da richiamare ogni volta che viene ricevuto un pacchetto. Prende un singolo parametro, che rappresenta il pacchetto ricevuto, come input.
kali@kali:~$ sudo python3 arpDetector.py
Mentre il programma è in esecuzione, apriamo un altro terminale Kali ed eseguiamo un attacco ARP Spoofing.
Poi, concludiamo l’attacco premendo CTRL-C. Ciò farà in modo che arpspoof emetta dei pacchetti che ripristinano la tabella ARP. Quando il nostro programma Python rileva questi pacchetti, vedremo un messaggio simile al seguente:
Possible ARP attack detected
It is possible that the machine with IP address
192.168.0.67 is pretending to be 192.168.48.67
Questo articolo richiama contenuti da Ethical Hacking.
Immagine di apertura di Scott Rodgerson su Unsplash.