
استغلال DHCP باستخدام DynoRoot (CVE-2018-1111)
يعرض هذا المشروع ثغرة أمنية معروفة في أجهزة Fedora وRedHat تتعلق بتطبيق غير آمن من جانب العميل لبروتوكول الإعداد الديناميكي للمضيفين (DHCP). يمكن لخادم DHCP مارق صياغة عروض DHCP بحمولة خبيثة يتم تنفيذها في غلاف جذر (root shell) على جهاز الضحية.
تُنسب هذه الثغرة إلى Felix Wilhelm وتُعرف باسم CVE-2018-1111 أو "DynoRoot".
يُعد بروتوكول الإعداد الديناميكي للمضيفين (DHCP) مكوّنًا غالبًا ما يُغفَل في الأنظمة الشبكية. يتمثل دوره في السماح بالتكوين الديناميكي لأجهزة المضيفين التي تتصل بشبكة قائمة. حالة الاستخدام الأكثر شيوعًا هي تعيين عنوان IP للمضيفين المتصلين حديثًا وإعلامهم بالمسارات الموجودة للوصول إلى شبكات أخرى. يمكن تحديد خيارات إضافية، مثل عنوان خادم DNS المحلي والنطاق الذي يخدمه، أو موقع ملف الإقلاع.
دعونا نحلّل بروتوكول الخطوات الأربع الذي يُتّبع عندما يريد مضيف جديد الانضمام إلى شبكة بعد الاتصال بها ماديًا عبر اتصال إيثرنت أو لاسلكي.
DISCOVER إلى الشبكة.OFFER تحتوي على: عنوان IP، وقناع
الشبكة الفرعية، وعنوان الموجّه، وخيارات أخرى.REQUEST، طالبًا رسميًا استئجارَ عنوان IP الذي تم
عرضه.ACK، للإشارة إلى أن العميل مسموح له باستخدام
عنوان IP لفترة زمنية محددة.بعد التبادل الأولي، يمكن للعميل تجديد العقد بمجرد إرسال رسالة REQUEST أخرى. سيتحقق الخادم من وجود عقد بعنوان IP وعنوان MAC الخاصين بالعميل ويرد برسالة ACK.
بعض الأمور الجديرة بالملاحظة:
DISCOVER وطلب عنوان عبر REQUEST مباشرة. وهذا شائع
في السيناريوهات التي يكون فيها العميل قد اتصل بالشبكة سابقًا ويتذكر
العنوان السابق. في هذه الحالة، يتحقق الخادم من توفر العنوان، وإذا كان متاحًا يرد بـ ACK على الطلب، أو إذا لم يكن العقد متاحًا، يرسل NACK.RELEASE لإبلاغ الخادم بأن العنوان
أصبح متاحًا الآن. ومع ذلك، لا يُلزِم البروتوكول بذلك، وسيقوم الخادم بشكل دوري
بجمع العقود منتهية الصلاحية.OFFER لعقود جديدة على العملاء.OFFER متعددة،
فإنه سيقبل واحدًا فقط، بينما تلاحظ الخوادم الأخرى رسالة REQUEST المبثوثة وتبطل
العرض.تقع الثغرة في /etc/NetworkManager/dispatcher.d/11-dhclient، وهو ملف يتم تنفيذه
بواسطة العميل لتحليل الخيارات المستلمة عبر DHCP وتعيينها.
declare هي أمر مدمج في bash، وعند استخدامه بدون وسائط، يسرد جميع المتغيرات المُصرَّح بهاgrep يفلتر جميع المتغيرات المرتبطة بـ DHCPwhile read opt يتكرر على متغيرات DHCP واحدًا تلو الآخر، ويقوم ببعض التحليل ويطبع
سطرًا مثل export new_optionname=value لكل خيار<!-- omit in toc -->
#### التشغيل العادي
في الظروف العادية، سيعمل الكود بشكل جيد ويحلل خيارات DHCP الجديدة.
على سبيل المثال، الكود التالي:```bash
DHCP4_OPTION_ONE=42
DHCP4_OPTION_TWO="bla bla"
declare | LC_ALL=C grep '^DHCP4_[A-Z_]*=' | while read opt; do
optname=${opt%%=*}
optname=${optname,,}
optname=new_${optname#dhcp4_}
optvalue=${opt#*=}
echo "export $optname=$optvalue"
done
سيقوم بطباعة عبارتي export هاتين ليتم تقييمهما بواسطة eval:```bash
export new_option_one=42
export new_option_two='bla bla'
<!-- omit in toc -->
#### حقن الكود
ومع ذلك، ونظرًا لاستخدام `eval` غير الآمن، فمن الممكن حقن أوامر bash:```bash
DHCP4_OPTION_ONE="x'& echo Hacked! #"
DHCP4_OPTION_TWO='bla bla'
eval "$(
declare | LC_ALL=C grep '^DHCP4_[A-Z_]*=' | while read opt; do
optname=${opt%%=*}
optname=${optname,,}
optname=new_${optname#dhcp4_}
optvalue=${opt#*=}
echo "export $optname=$optvalue"
done
)"
سوف ينتج عن ذلك تنفيذ echo Hacked!:```text
[1] 1541
Hacked!
### المصادر
- [إدخال قاعدة بيانات الاستغلال](https://www.exploit-db.com/exploits/44890)
- [إعلان RedHat](https://access.redhat.com/security/vulnerabilities/3442151)
- [منشور مدونة Tenable](https://www.tenable.com/blog/advisory-red-hat-dhcp-client-command-injection-trouble)
- [مستودع GitHub](https://github.com/kkirsche/CVE-2018-1111)
- [إعلان تويتر](https://twitter.com/_fel1x/status/996388421273882626?lang=en)
## الإعداد
يتكون الإعداد الأدنى لتوضيح الاستغلال من جهازين فقط: جهاز `victim`
الذي يعمل بنظام Fedora 28، وجهاز `attacker`. في هذا الإعداد، يحتاج المهاجم فقط إلى تقديم
خدمة DHCP وانتظار اتصال الضحية.
<figure style="text-align:center">
<img src="https://raw.githubusercontent.com/baldassarrefe/fep3370-advanced-ethical-hacking/HEAD/media/network_simple.svg" style="max-width:400px;" width="90%"/>
<figcaption>الإعداد الأدنى للاستغلال.</figcaption>
</figure>
إعداد أكثر واقعية يضع الأجهزة على شبكة خاصة، حيث يتم تكوين جهاز ثالث، وهو
`gateway`، ليكون خادم DHCP غير ضار وبوابة إلى الإنترنت الخارجي.
في هذا الإعداد، يجب على المهاجم منع الضحية من الاتصال بخادم DHCP الشرعي
قبل أن يأمل في تنفيذ الهجوم.
<figure style="text-align:center">
<img src="https://raw.githubusercontent.com/baldassarrefe/fep3370-advanced-ethical-hacking/HEAD/media/network.svg" style="max-width:800px;" width="90%"/>
<figcaption>إعداد الشبكة الخاصة مع جهاز بوابة واحد يعمل كخادم DHCP وموجه وجدار ناري.</figcaption>
</figure>
في الأقسام التالية سنقوم بـ:
1. تثبيت VirtualBox
2. إنشاء 3 أجهزة افتراضية: `gateway`، و`attacker`، و`victim`
3. تثبيت نظام التشغيل على الأجهزة (المستخدمون، الشبكة، ووصول SSH)
4. تكوين البوابة لاستضافة خادم DHCP غير الضار
للشبكة الداخلية الافتراضية المقدمة من VirtualBox
5. تثبيت تبعيات بايثون للهجوم
للقفز مباشرة إلى [التنفيذ العملي للهجوم](#performing-the-attack) وتخطي الإعداد اليدوي، يمكن
تشغيل سكربت [`setup.sh`](https://github.com/baldassarrefe/fep3370-advanced-ethical-hacking/blob/main/ansible/setup.sh) في مجلد `ansible`، والذي سيقوم (تقريبًا)
بشكل تلقائي بإنشاء الأجهزة الافتراضية وتكوينها باستخدام
[أدوار Ansible](https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html).
فقط تأكد من تثبيت Ansible و VirtualBox قبل تشغيل `setup.sh`.
### مقدمات
#### تثبيت VirtualBox
الإرشادات التالية مأخوذة من [دليل التثبيت الرسمي](https://www.virtualbox.org/wiki/Downloads).