
نهج المبتدئين في اختراق البرامج الثابتة
هذه الوثيقة هي تجربتي الشخصية - كمبتدئ في مجال هندسة عكس البرامج الثابتة واستغلال الثغرات.

للغرض التوضيحي، سنقوم بتحليل وإعادة إنتاج CVE-2023-27216.
لاستغلال أي برامج ثابتة، هناك الخطوات التالية:
gdbserver بشكل ثابت (statically) لغرض التصحيح.عادةً ما يحتوي ملف البرنامج الثابت الثنائي (binary firmware) على أداة تحميل الإقلاع (uBoot)، ملف Kernel، رأس Kernel لأداة تحميل الإقلاع (uImage)، نظام ملفات مضغوط (بصيغة SquashFS عادةً)، جدول CRC/MD5 (للتحقق من سلامة الملف)، وملفات متنوعة أخرى.
ابحث عن طريقة لتحليل البرنامج الثابت أولاً، قم ببعض البحث، حصلت على بعض الموارد:

استخراج البرنامج الثابت باستخدام binwalk: binwalk -Me DSL-3782_A1_EU_1.01_07282016.bin

حصلت على المجلد squashfs-root المستخرج وبعض الملفات الغريبة.

مكافأة: إذا لم تر المجلد squashfs-root، يمكنك استخدام unsquashfs على أي ملف ".squashfs" تراه. إنها مثل ملفات zip 😅.
تحقق من بنية (architecture) البرنامج الثابت وترتيب البايتات (endianness). يمكن التحقق من ذلك بفحص بعض الملفات الثنائية المستخرجة من البرنامج الثابت. تحقق من البنية والبرنامج الثابت: file <binary>

هنا يمكننا التأكيد بشكل شبه مؤكد أن البرنامج الثابت يعمل على بنية MIPS 32-bit MSB. سبب "شبه مؤكد" هو أن بعض البرامج الثابتة قد تعمل على بنية مختلفة مع MIPS Compatible مثل Lexra.
تحقق من المجلد squashfs-root ووجدت بعض الملفات المثيرة للاهتمام:
usr/etc/init.d/rcS => هذا هو السكريبت الذي يتم تشغيله عند إقلاع البرنامج الثابتusr/etc/passwd => هذا هو الملف الذي يحتوي على معلومات المستخدمuserfs/romfile.cfg => توجد بيانات اعتماد admin:adminتحقق من ملف rcS ووجدت بعض الأكواد المثيرة للاهتمام:
echo "admin:$1$$iC.dUsGpxNNJGeOm1dFio/:0:0:root:/:/bin/sh" > /usr/etc/passwd
passwdBoa هو خادم ويب قديم، يُستخدم بشكل أساسي في الأجهزة المضمنة مثل أجهزة التوجيه في العقد الأول من القرن الحادي والعشرين. ومع ذلك، فقد توقف تطوير خادم Boa في عام 2005! على الرغم من أن خادم Boa قد مات منذ حوالي 20 عامًا، إلا أنه لا يزال يعيش حتى اليوم بفضل موردينا.

أوصي باستخدام نظام تشغيل قائم على Debian لعملية المحاكاة مثل Ubuntu أو Kali. هناك نظام تشغيل آخر يركز على اختراق البرامج الثابتة يُسمى AttifyOS. في هذه الوثيقة، استخدمت Kali Linux. ابدأ بعملية المحاكاة، هناك أداتان:

دعنا نستعرض كيفية استخدام FAT لمحاكاة برنامج ثابت بالكامل. أولاً، نستنسخ المستودع من github إلى جهاز Kali الخاص بك. ونتبع عملية الإعداد. تحتاج أيضًا إلى تعديل ملف fat.config، وإلا فلن يعمل.
git clone https://github.com/attify/firmware-analysis-toolkit.git
cd firmware-analysis-toolkit
./setup.sh
vi fat.config # قم بالتعديل ليشمل كلمة مرور sudo الخاصة بك.
ثم نقوم بنسخ ملف البرنامج الثابت الثنائي (الذي قمنا بتنزيله من الشركة المصنعة) إلى مجلد FAT على جهاز Kali الخاص بنا وتشغيله.
./fat.py DSL-3782_A1_EU_1.01_07282016.bin
ملاحظة: أثناء عملية إعداد FAT قد نواجه أخطاء. قد يظهر خطأ بعدم وجود libmagic.

ببساطة قم بتشغيل
pip unistall python-magic
pip install python-magic
سيؤدي هذا إلى إصلاح المشكلة، ثم نقوم بتشغيل أمر البناء مرة أخرى. يجب أن يعمل بشكل ممتاز الآن.

اضغط Enter للتشغيل. يجب أن تعمل عملية المحاكاة بشكل جيد حيث يمكنك التصفح إلى http://192.168.1.1 (على جهاز Kali) للتحقق من أنها تعمل أم لا.

يمكنك أيضًا تسجيل الدخول إلى وحدة التحكم إذا كان لديك بيانات الاعتماد. هنا admin:admin.

إذا قررت إيقاف تشغيل البرنامج الثابت المُحاكى، فقط اضغط Ctrl+A X. عندما تحتاج إلى تشغيله مرة أخرى، لا تقم بتشغيل fat.py مرة أخرى لأن البرنامج الثابت قد تم بناؤه بالفعل في صورة. تحتاج فقط إلى تشغيل السكريبت الذي تم إنشاؤه بالفعل.
cd firmadyne/scratch/<Image-ID>
./run.sh

بناء gdbserver لغرض التصحيح. هناك عدة طرق لبناء gdbserver. يمكنك أيضًا تنزيل خادم مبني بشكل ثابت (statically). يوجد مستودع يخزن بعض الخوادم المبنية بشكل ثابت. ومع ذلك، أفضل بناء gdbserver بنفسي لأن تلك الموجودة في مستودع github قديمة جدًا وقد تواجه بعض مشكلات التوافق.
ارجع إلى منشور المدونة هذا للمراجع https://sheran.sg/blog/cross-compile-gdb-for-mips/. تم تحميل المدونة في 30 يوليو 2024، قبل هذا المشروع مباشرة، لذا فهي تعمل بشكل مثالي.
ملاحظة: تم بناء المدونة لـ MIPS x32 LSB لكننا نحتاج MIPS x32 MSB. نحتاج إلى تغيير mipsel-linux-gnu إلى mips-linux-gnu.
نحتاج إلى تثبيت سلسلة أدوات (tool chain) لـ MIPS. لحسن الحظ، حزمة Debian تحتوي عليها بالفعل.
**apt update && apt upgrade -y
apt install -y build-essential m4 gcc-mips-linux-gnu g++-mips-linux-gnu**