
MikroTik remote jailbreak for v6.x.x
______ ____ _____ _____ _ _
| ____/ __ \_ _|/ ____| | | |
| |__ | | | || | | (___ | |_ ___ __| |
| __|| | | || | \___ \| __/ _ \/ _` |
| | | |__| || |_ ____) | || __/ (_| |
|_| \____/_____|_____/ \__\___|\__,_|
FOISted هو استغلال لثغرتين أمنيتين تتطلبان مصادقة في نظام RouterOS من MikroTik. يمكن استخدامه لكسر أمن أجهزة RouterOS عن بُعد للإصدارات من 6.34 (2016) حتى 6.49.6 (أحدث إصدار v6).
يحتوي هذا المستودع على سكربت استغلال للأجهزة التي تعمل بمعمارية x86. الثغرة موجودة أيضًا على إصدارات أجهزة أخرى؛ كتابة سلسلة ropchain تُترك كتمرين للقارئ :)
لمزيد من المعلومات، اطّلع على مقالنا حول دواخل RouterOS: https://margin.re/blog/pulling-mikrotik-into-the-limelight.aspx
تلقائي بالكامل:
$ python3 exploit.py -H <router_ip> -u <username> -p <password>
ثم لاحقًا:
$ nc <router_ip> 1337
سيكتشف سكربت الاستغلال إصدار RouterOS وينشر سلسلة ropchain الصحيحة تلقائيًا. ملاحظة: حاليًا مدعوم فقط RouterOS بمعمارية x86.
إذا لم يتم التعرّف على إصدارك لسبب ما، يمكنك تمريره صراحةً باستخدام:
-v <version> # مثال: 6.49.6
إذا كنت تشغّل هذا على إصدارات RouterOS أحدث من 6.49.6 (الأحدث وقت الإصدار العام)، فقد لا يكون إصدار RouterOS الخاص بك موجودًا في قاعدة بيانات الأدوات (./db). يمكنك بدلًا من ذلك تمرير المسار إلى /nova/bin/www وسيحاول سكربت الاستغلال تلقائيًا العثور على الأدوات المناسبة لسلسلة ropchain:
-f /path/to/nova/bin/www
يستفيد FOISted من ثغرتين في RouterOS v6 لتمكين تنفيذ الأكواد عن بُعد. في هذا القسم نستعرض بعض المعرفة الأساسية حول IPC في RouterOS ونناقش الثغرتين.
ملاحظة: هذا القسم في الغالب نسخة مختصرة من مقالنا الكامل. تأكد من الاطلاع عليه لمزيد من التفاصيل!
داخل نظام RouterOS من MikroTik، تتواصل البرامج مع بعضها البعض باستخدام بروتوكول IPC مخصص.
حزم البيانات الفعلية هي رسائل Nova (nv::message داخليًا). توجد هذه الرسائل بصيغة شبيهة بـ JSON (قبل 6.38) وصيغة ثنائية متسلسلة:

لكل عملية عنوان ثابت داخل نظام RouterOS؛ على سبيل المثال /nova/bin/user عند العنوان 13 و /nova/bin/www عند العنوان 70. بالإضافة إلى ذلك، يمكن لكل برنامج تسجيل معالجات (handlers) تنفّذ وظيفة محددة في نطاق فرعي. على سبيل المثال، /nova/bin/user لديه معالج عند العنوان 4 يعمل كنقطة "تسجيل الدخول" ويقوم بالمصادقة للخدمات الأخرى:

اتصال IPC جزء أساسي من تشغيل RouterOS. يُستخدم من أجل:
أثناء جهودنا في الهندسة العكسية، كتبنا أداة تتبّع رسائل داخلية تسمح لنا بتصوّر جميع الرسائل المتبادلة أثناء تشغيل الراوتر.
في العرض التالي، يمكنك رؤية جميع الرسائل المتبادلة أثناء التنقّل في الواجهة الويب: https://youtu.be/Em1hVWnbzQ4
واجهة الويب في RouterOS منفّذة في ملف /nova/bin/www. ومع ذلك، قد تتم معالجة صفحات محددة بواسطة مكتبات "Servlet" منفصلة تنفّذ وظائفها في مكتبات مشتركة مستقلة.
على سبيل المثال، يتعامل سيرفليت jsproxy.p مع الطلبات الموجهة إلى /jsproxy وسيرفليت winbox.p يتعامل مع الطلبات الموجهة إلى /winbox، إلخ...
هذه السيرفلتات مكتبات يتم تحميلها داخل /nova/bin/www في أول مرة تكون هناك حاجة إليها. على سبيل المثال، في أول مرة نحمل فيها /jsproxy، سيتم تحميل مكتبة jsproxy.p في مساحة الذاكرة.
أثناء عملية تحميل المكتبة هذه، لاحظنا بعض الحركة المثيرة للاهتمام في أداة تتبّع الرسائل:

تحديدًا، وجدنا رسالة يتم إرسالها من ملف www إلى المعالج رقم 2 في www. هذا مريب بالفعل لأن IPC في RouterOS مخصص للتواصل بين العمليات وليس للتواصل داخل نفس العملية...
بالإضافة إلى ذلك، لاحظنا أن اثنتين من الوسائط تبدوان كمؤشرات افتراضية (x86 32-بت) مما أثار اهتمامنا لأنه كان أمرًا غير معتاد.
عند فحص الدوال الفعلية داخل المعالج رقم 2 في /nova/bin/www، وجدنا دالة باسم FoisHandler::cmdUnknown يتم تشغيلها عند استلام هذه الأنواع من الرسائل.
والأمر المذهل أن هذه الدالة تسحب المعامل 0x11 من الرسالة و_تستدعيه كدالة_ باستخدام اثنين من المعاملات الأخرى كوسائط!
إذن بوضوح، إذا استطعنا إرسال رسالة محكمة تصل إلى هذا المعالج، يمكننا استدعاء أي دالة نريدها. ومن هناك، من السهل نسبيًا التحوّل إلى سلسلة ropchain وتنفيذ شيء أكثر تعقيدًا.
توجد عدة طرق لإرسال رسائل IPC داخلية كمستخدم في RouterOS. في الواقع، تتيح جميع العملاء الخارجيين إرسال رسائل عشوائية بعد المصادقة:
8291) -- يُستخدم بواسطة عميل winbox.exeتختلف هذه الواجهات في طريقة تنفيذ مصافحة المصادقة الأولية، لكن بعد المصادقة، تمكّن المستخدم من تمرير رسائل Nova عشوائية إلى النظام الداخلي. راجع مقالنا ومستودعنا للهندسة العكسية للبروتوكولات التشفيرية في Winbox و MAC Telnet!
في هذا التنفيذ للاستغلال، نستخدم نقطة WebFig كآليتنا الأساسية للتواصل. انظر webfig.py لتنفيذ عميلنا المُهندَس عكسيًا.
ومع ذلك، توجد مشكلة عند محاولة استدعاء نقطة FoisHandler الضعيفة:
يمكن لكل معالج في RouterOS تعريف قناع صلاحيات (policy) يحدد المستخدمين المسموح لهم باستدعائه. يتضح أن FoisHandler لديه سياسة 0x80000000 والتي تشير إلى وصول داخلي فقط (أي الرسائل القادمة من عمليات النظام الأخرى).
كمستخدم إداري، أقصى قناع صلاحيات يمكننا تعيينه عبر الواجهة الرسومية هو فقط 0x7fffe وهو غير كافٍ.
هذا يقودنا إلى ثغرتنا الثانية: تصعيد صلاحيات من مسؤول إلى "مسؤول فائق".
بينما تتيح لنا الواجهة الرسومية فقط تعيين قناع صلاحيات بقيمة 0x7fffe، إلا أنها داخليًا في الواقع ترسل رسالة IPC فقط مع احتواء أحد الحقول على قيمة قناع الصلاحيات:

لذا يمكننا ببساطة تزوير رسالتنا الخاصة مع تعيين قيمة قناع الصلاحيات إلى 0xffffffff!
بمجرد فعل ذلك، لدينا الآن وصول غير مقيد لضرب أي نقطة في النظام!
يبدأ استغلالنا برفع ملفين إلى النظام عبر FTP:
stage2: يحتوي على مولّد قشرة عكسية يستمع على المنفذ 1337busybox: يوفّر لنا بيئة قشرة مناسبةبعد ذلك، ينفّذ استغلالنا تصعيد الصلاحيات لتمكيننا من الوصول إلى نقطة FoisHandler.
أخيرًا، نرسل رسالة مصنوعة بعناية للتحوّل إلى سلسلة ropchain مضمّنة في الرسالة. تحسب سلسلة ropchain عنوان chmod و execve في uClibc وتنفّذ:
chmod 0777 stage2execve stage2بمجرد تشغيل stage2، يمكنك الاتصال بالمنفذ 1337 والحصول على قشرة!
لا، تتطلب كلتا الثغرتين بيانات اعتماد إدارية للاستغلال.
توجد الثغرات على الأقل من 6.27 (أقدم برنامج تمكنا من تنزيله) حتى أحدث إصدار v6: 6.49.6. تمت إعادة هيكلة الواجهة الويب في RouterOS v7 وتمت إزالة المعالج الضعيف بالكامل. إثبات المفهوم الخاص بنا مكتوب لمعمارية x86.
يعمل سكربت الاستغلال (تم اختباره!) ضد كل إصدارات RouterOS من 6.34 إلى 6.49.6.