
مجموعة أدوات الهندسة العكسية والمراقبة لجدران حماية Draytek
المهاجمون المتقدمون يختارون بشكل متزايد الأجهزة الطرفية (edge devices) كأهداف. ومع ذلك، فإن هذه الأجهزة يُتحكم فيها ببرمجيات مغلقة المصدر تُعرف باسم البرامج الثابتة (firmware)، والتي غالبًا ما تُوزَّع بصيغة مملوكة. وهذا يشكّل صعوبة إضافية للمدافعين والباحثين، الذين يجب أن يفهموا كيفية استخراج البرامج الثابتة لتقييم أمانها.
هذا ليس مجرد سيناريو افتراضي، كما اكتشفنا مؤخرًا عندما تعرّض أحد العملاء للاختراق. ومع وجود أجهزة Draytek على حافة بنيتهم التحتية، كان السؤال الطبيعي: هل يمكن أن تكون هذه نقطة دخول المهاجمين؟ أكثر من 500k جهاز Draytek مكشوف على الإنترنت. ومع ذلك، لا توجد أداة تعمل لاستخراج برامجها الثابتة ومساعدة الباحثين والمدافعين العاملين مع هذه الأجهزة.
أثناء تقييمنا، قمنا بهندسة عكسية لصيغة البرامج الثابتة الخاصة بـ Draytek، والتي تحتوي على مُحمِّل إقلاع (bootloader)، ونواة RTOS مضغوطة، ونظامي ملفات. من خلال تحقيقنا، طوّرنا أدوات لاستخراج هذه المكونات، مما كشف عن قدرة نظام التشغيل اللحظي على تحميل وحدات الكود ديناميكيًا. تُحمَّل هذه الوحدات من أحد أنظمة الملفات في صورة البرنامج الثابت أثناء الإقلاع، ولكن يمكن أيضًا تحميلها أثناء تشغيل النظام وتخزينها في نظام ملفات منفصل في ذاكرة الفلاش. يمكن للمهاجم استغلال هذه الميزة لتحقيق الثبات (persistence) عبر تحميل وحدة تظل نشطة حتى بعد إعادة التشغيل أو ترقية البرنامج الثابت، ولا يملك المستخدم النهائي وسيلة لكشف هذا النوع من الهجمات. وبالتالي، طوّرنا وحدتنا الخاصة للتحقق من سلامة الوحدات المُحمَّلة في الذاكرة، للتخفيف من هذا التهديد المحتمل.
في سعينا نحو إنترنت أكثر أمانًا، نُتيح هذه المجموعة من الأدوات للمجتمع، مما يتيح المراقبة والتحصين والشفافية وأبحاث الثغرات على أجهزة Draytek الطرفية.
طُوّرت هذه الأداة كجزء من مشروع بحثي عُرض في DEFCON HHV وLa Villa Hacker. يمكنك العثور على الشرائح ومقاطع فيديو الإثبات (PoC) هنا.
طوّرنا هذا في البداية كأداة داخلية. لقد كانت مجرد مجموعة من السكربتات، لكنها أظهرت إمكانات كبيرة، مما دفعنا إلى جعلها مفتوحة المصدر. منذ ذلك الحين، عملنا على دمج هذه السكربتات في حزمة Python التي ستجدها في هذا المستودع وجعلها متوافقة مع موديلات أخرى من الأجهزة.
المتطلبات:
(اختياري) إنشاء وتفعيل بيئة Python الافتراضية:
$ python3 -m virtualenv .venv
$ source .venv/bin.activate
تثبيت draytek_arsenal:
$ cd draytek_arsenal
$ python3 -m pip install -r requirements.txt
$ python3 -m pip install .
اختبار التثبيت:
$ python3 -m draytek_arsenal
سيتأثر هذا التثبيت بالتغييرات المحلية في الكود
$ python3 -m pip install -e .
بعض الأوامر مثل mips_compile وmips_merge تحتاج إلى صورة Docker مكملة لكي تعمل.
إذا لم يتم تنزيلها، تظهر رسالة الخطأ التالية:
[x] Image 'draytek-arsenal' not found. Please build or download the image.
يمكنك تنزيل الصورة باستخدام الأمر التالي:
$ docker pull ghcr.io/infobyte/draytek-arsenal:main
أو بناؤها باستخدام:
$ docker build -t draytek-arsenal ./mips-tools
draytek-arsenal هو مجموعة من السكربتات مجمّعة في حزمة Python. لذا، لاستخدامه يجب عليك اختيار أمر:
usage: draytek-arsenal [-h] [command] args..
بعض الأوامر هي:
تحليل وعرض معلومات البرنامج الثابت الخاص بجهاز Draytek.
usage: parse_firmware [-h] firmware
positional arguments:
firmware Path to the firmware
options:
-h, --help show this help message and exit
أمر يُستخدم لاستخراج وفك ضغط أجهزة Draytek التي تعمل بنظام RTOS.
usage: extract_rtos [-h] [--rtos RTOS] [--fs FS] [--dlm DLM] [--dlm-key1 DLM_KEY1]
[--dlm-key2 DLM_KEY2]
firmware
positional arguments:
firmware Path to the firmware
options:
-h, --help show this help message and exit
--rtos RTOS, -r RTOS File path where to extract and decompress the RTOS
--fs FS, -f FS Directory path where to extract and decompress the File
System
--dlm DLM, -d DLM Directory path where to extract and decompress the DLMs
--dlm-key1 DLM_KEY1 First key used to decrypt DLMs
--dlm-key2 DLM_KEY2 First key used to decrypt DLMs
أمر يُستخدم لاستخراج وفك ضغط أجهزة Draytek التي تعمل بنظام Linux.
usage: extract_linux [-h] [--fs FS] --key KEY firmware
positional arguments:
firmware Path to the firmware
options:
-h, --help show this help message and exit
--fs FS, -f FS Directory path where to extract and decompress the File System
--key KEY Key used to decrypt
احصل على التجزئة (hash) الخاصة بوحدة DLM.
usage: dlm_hash [-h] [-c] dlm
positional arguments:
dlm Path to the dlm
options:
-h, --help show this help message and exit
-c Print as .c code
ابحث عن العنوان الذي يُحمَّل عنده نظام RTOS باستخدام تعليمة القفزة الأولى.
usage: find_loading_addr [-h] rtos
positional arguments:
rtos Path to the rtos
options:
-h, --help show this help message and exit
يتحقق مما إذا كان الـ RTOS بترتيب البايتات الصغير (little endian) أم الكبير (big endian).
usage: find_endianness [-h] rtos
positional arguments:
rtos Path to the rtos
options:
-h, --help show this help message and exit
قم بترجمة ملف ثنائي MIPS قابل لإعادة التوطين (يُستخدم لوحدات DLM).
usage: mips_compile [-h] output [input ...]
positional arguments:
output Output file
input Output file
options:
-h, --help show this help message and exit
قم بدمج ملفين ELF MIPS قابلين لإعادة التوطين.
usage: mips_merge [-h] first_input second_input output
positional arguments:
first_input First input file
second_input Second input file
output Output file
options:
-h, --help show this help message and exit