
إكسبلويت لمودم الكابل Sagemcom F@ST 3890 يقوم بتنفيذ ثغرة Cable Haunt لتحقيق تنفيذ كود عن بُعد عبر تجاوز سعة المخزن المؤقت القائم على WebSocket وسلسلة ROP.
يستخدم هذا الاستغلال ثغرة Cable Haunt لفتح قشرة (shell) على مودم الكابل Sagemcom F@ST 3890 (50.10.19*) من خلال الوصول إلى الشبكة المحلية. يجب أن يكون إصدار البرنامج الثابت 50.10.21 أو أحدث آمنًا ضد Cable Haunt. صُمم هذا الإثبات المفاهيمي خصيصًا ليعمل محليًا فقط للحد من احتمالية الاستخدام لأغراض خبيثة. يوجد إثبات مفاهيمي آخر ينشئ قشرة عكسية لاتصال خارجي لجهاز Technicolor TC7230 متاح هنا.
يمكن العثور على قائمة بأجهزة المودم المعروفة بأنها معرضة للخطر على https://cablehaunt.com/#faq-am-i-affected.
يقدم الخادم exploit.py موقع ويب، وعند زيارته، يرسل طلب WebSocket خبيثًا إلى مودم الكابل.
يُحدث هذا الطلب تجاوزًا لعنوان الإرجاع والسجلات المرافقة له في محلل الطيف (Spectrum Analyzer) الخاص بمودم الكابل، ويستخدم سلسلة ROP لبدء الاستماع لاتصال TCP على المنفذ 1337.
سلسلة ROP مُنشأة ومعلَّق عليها في static/exploitSagemcom.js.
بعد ذلك يرسل الخادم exploit.py ملف exploit.raw عبر اتصال TCP هذا، والذي سيقوم المودم بتنفيذه.
ملف exploit.raw هو reverseshell.c مُجمَّع لبنية MIPS (انظر أدناه كيف ذلك).
Reverseshell.c هي قشرة مكتوبة خصيصًا لهذا المودم. تستمع القشرة للأوامر التي سيتم تشغيلها في قشرة eCos على مودم الكابل وتعيد توجيه STDOUT إلى اتصال TCP.
يمكنك العثور على فيديو يشرح الاستغلال هنا: https://www.youtube.com/watch?v=5FM9mS5ck3Y
ملاحظة: نظام Windows 10 غير مدعوم حاليًا، يجب عليك استخدام نظام تشغيل مبني على Linux
قم بتثبيت pwntools و flask لبايثون 3 ثم شغّل python exploit.py.
الآن اذهب إلى http://127.0.0.1:8080 في متصفحك لاستغلال المودم.
لن يعمل Firefox لهذا الغرض، لأن إصدار WebSocket المستخدم غير متوافق.
الآن يجب أن تظهر قشرة تفاعلية في طرفيتك التي تشغّل سكربت بايثون. إذا خرجت من القشرة، يجب إعادة تشغيل المودم لبدء قشرة جديدة.
إذا كنت تريد تجميع حمولة خاصة بك، يمكنك الحصول على سلسلة الأدوات من aeolus وتشغيل الأمر التالي:
/<toolchain Path>/gnutools/mipsisa32-elf/bin/mipsisa32-elf-gcc -O3 -c ./reverseshell.c -o ./reverseshell.o && /<toolchain Path>/toolchains/gnutools/mipsisa32-elf/bin/mipsisa32-elf-objcopy -O binary reverseshell.o exploit.raw
يمكنك بناء واستغلال أي مودم معرض لثغرة Cable Haunt باستخدام هذه التقنية. نوصي بقراءة التقرير الفني قبل محاولة كتابة سلسلة ROP خاصة بك. اذهب إلى Cable Haunt للحصول على قائمة بأجهزة مودم الكابل المعروفة بأنها معرضة للخطر.
أولاً، ستحتاج إلى البرنامج الثابت لمودم الكابل الذي تنوي استغلاله. بعد ذلك، قم بهندسة عكسية للبرنامج الثابت للعثور على عناوين الدوال ذات الصلة لبناء الاستغلال مثل socket() و bind() و accept() و listen() و recv() و connect() لقشرة. ثم يمكن استخدام Ropper للعثور على الأدوات (gadgets) باستخدام الأمر التالي:
python Ropper.py --type all --all --badbytes 00c0c1f5f6f7f8f9fafbfcfdfeff2c -r -a MIPSBE -I 0x80004000 --console -f <firmware path>
لا يمكن الوصول إلى جميع الأدوات، لأن الأدوات هي مجرد عناوين تُرسل كبايتات خام ولا يمكن إرسال جميع البايتات كطلب WebSocket بإطارات نصية.
على سبيل المثال، لا يمكن إدراج العنوان 0x8080a864 مباشرة في إطار نص WebSocket، لأنه ليس حرف UTF-8 صالحًا. ومع ذلك يمكن إدراج العنوان 0xf28080a864، لأن 0xf2 تعني بدء رمز UTF-8 جديد مع 0x8080a864 كبايتات لاحقة.
لا يمكن أن تكون البايتات التالية موجودة في أي عنوان مستخدم بسبب مواصفات utf-8: 0x00, 0xc0,0xc1,0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x2c. توجد قيود أخرى أيضًا سيتم شرحها قريبًا بمزيد من التفصيل في تقريرنا.
في الوقت الحالي، يمكنك قراءة واستخدام utf8TestScript.py لاختبار ما إذا كان العنوان قابلًا للوصول.
يمكنك استخدام العملية الموصوفة أعلاه لتجميع حمولة خاصة بك لمودم كابل جديد، لكن تذكر أن الحمولة يجب ألا تعود (return)! إذا عادت، ستبحث العملية عن عنوان إرجاع على المكدس المحطم وتتعطل.
بالنسبة لمعظم أجهزة المودم، ستحتاج إلى طريقة للوصول إلى قشرة eCos لاستخراج البرنامج الثابت أو استخراجه مباشرة من شريحة الفلاش. عادةً ما تكون هذه البرامج الثابتة معبأة بتنسيق يسمى ProgramStore إذا كانت وحدة التحكم التسلسلية لا تعمل، فجرّب تشغيل: (قد تعمل فقط إذا كان كابل الكواكس مفصولًا أو غير مخصص)
snmpset -v2c -c private 192.168.0.1 1.3.6.1.4.1.4413.2.2.2.1.9.1.2.1.0 i 2
snmpset -v2c -c private 192.168.0.1 1.3.6.1.4.1.4413.2.2.2.1.9.1.2.1.0 i 0
snmpset -v2c -c private 192.168.0.1 1.3.6.1.4.1.4413.2.2.2.1.9.1.2.1.0 i 2
بعد ذلك يجب أن تكون القشرة قابلة للوصول، ويمكن أن تسهّل bcm2-utils عملية استخراجها باستخدام هذه القشرة. عند إجراء الهندسة العكسية للبرنامج الثابت المستخرج، يكون عنوان التحميل/الأساس (على حد ما رأينا) دائمًا 0x80004000.