
تحليل وPoC لثغرة CVE-2018-14847، ثغرة كشف المعلومات في MikroTik RouterOS Winbox التي تسمح بوصول قراءة غير مصادق عليه إلى قاعدة بيانات الاعتمادات.
اجتياز مسار غير مصادق عليه في بروتوكول Winbox الخاص بشركة ميكروتك يتسبب في تسريب بيانات اعتماد المشرف من الملف /flash/rw/store/user.dat
CVE-2018-14847 هي ثغرة اجتياز مسار في نظام RouterOS من ميكروتك تؤثر على بروتوكول الإدارة Winbox (المنفذ TCP 8291). يمكن لمهاجم عن بعد غير مصادق قراءة ملفات عشوائية من نظام ملفات الموجه، بما في ذلك قاعدة بيانات بيانات اعتماد المستخدم /flash/rw/store/user.dat، التي تخزن كلمات المرور مشفرة باستخدام مفتاح XOR ثابت ضعيف.
تم الكشف عن الثغرة أصلاً بواسطة جاكوب بينيس (Tenable) في يوليو 2018 من خلال استغلال By the Way. يحتوي هذا المستودع على إعادة تطبيق مستقل بلغة Python3 مع توثيق كامل للبروتوكول.
| القناة | الإصدارات |
|---|
| طويلة الأمد | 6.30.1 - 6.40.7 |
| مستقرة | 6.29 - 6.42 |
| تجريبية | 6.29rc1 - 6.43rc3 |
قامت ميكروتك بتصحيح هذه الثغرة في أبريل 2018. الأجهزة التي تعمل بإصدارات RouterOS أقدم من الإصدارات المُصححة لا تزال عرضة للخطر.
Winbox هو بروتوكول إدارة ثنائي خاص بشركة ميكروتك يعمل على منفذ TCP 8291. يتم تنظيم الإطارات على النحو التالي:
[total_len - 2][0x01][0x00][total_len - 4]["M2"[حقول...]
يقوم رأس 4 بايت بتشفير الحجم الإجمالي للإطار. ليس u16 قياسيًا بنمط endian الصغير - كل بايت يشفر total_length - 2 و total_length - 4 بشكل مستقل.
ترميز الحقل داخل كل إطار:
| بايت النوع | المعنى | القيمة |
|---|---|---|
| 0xff | علامة حقل ممتد | يتبعه field_id والقيمة |
| 0x09 | عدد صحيح u8 | 1 بايت |
| 0x21 | سلسلة نصية | طول البادئة بايت واحد + بيانات |
| 0x88 | علامة توقع الرد | لا قيمة |
| 0xfe | معرف حقل ممتد | معرف 3 بايت + نوع + قيمة |
يعيش معالج نظام الملفات في نقطة النهاية (sys=5, handler=0) ويكشف عن ثلاثة أوامر ذات صلة:
لا يقوم معالج نظام الملفات في Winbox بتنظيف المسار الذي تم تمريره إلى أمر فتح الملف. من خلال تضمين تسلسلات '/////./../'، يمكن للمهاجم الهروب من حدود الحماية والوصول إلى نظام الملفات الجذر:
/////./..//////./..//////./../flash/rw/store/user.dat
كل مقطع '/////./../' (10 بايت) يصعد مستوى دليل واحد. ثلاثة مقاطع تصل إلى الجذر، وبعد ذلك يصبح flash/rw/store/user.dat قاعدة بيانات بيانات اعتماد مستخدم RouterOS. الطلب لا يتطلب أي مصادقة.
يرسل الاستغلال إطارين:
user.dat هو سلسلة من سجلات nv::message. كل سجل يسبقه حقل طول 2 بايت بنمط little-endian ويبدأ بالبايتات السحرية M2. تستخدم الحقول داخل كل سجل معرف حقل 3 بايت بنمط little-endian:
| معرف الحقل | النوع | المعنى |
|---|
| 0x01 | سلسلة | اسم المستخدم |
| 0x02 | u8 | المجموعة - 3 = وصول مسؤول كامل |
| 0x11 | سلسلة | كلمة المرور المشفرة (فارغة إذا لم تُحدد) |
يتم تشفير كلمات المرور باستخدام مفتاح XOR ثابت مشتق من ملح (salt) مثبت مسبقًا في RouterOS:
key = MD5(username + "283i4jfkai3389")
password = XOR(encrypted_pass[i], key[i % len(key)]) حتى بايت الصفر
هذا يعني أن أي ملف user.dat مستخرج من أي جهاز متأثر يمكن فك تشفيره دون اتصال بالإنترنت دون الحاجة إلى القوة العمياء.
بعد الحصول على كلمة مرور المسؤول، يمكن للمهاجم المصادقة عبر Winbox واستخدام أمر إنشاء ملف لكتابة ملفين ينشطان تسجيل الدخول المخفي للمطور:
/pckg/option ينشط حزمة option
/flash/nova/etc/devel-login يمكّن مستخدم devel
بمجرد وجود هذه الملفات، يعرض الموجه قشرة BusyBox جذرية عبر Telnet و SSH تحت المستخدم devel، باستخدام كلمة مرور المسؤول.
يجب الاتصال عبر Telnet أولاً حتى يعمل SSH على بعض إصدارات RouterOS.
Exploit_CVE_2018_14847.py هو استغلال مستقل بلغة Python3 بدون أي تبعيات خارجية. ينفذ بروتوكول Winbox الثنائي من الصفر ويقوم بالآتي:
# المنفذ الافتراضي 8291
python3 Exploit_CVE_2018_14847.py 192.168.1.10
# منفذ مخصص
python3 Exploit_CVE_2018_14847.py 192.168.1.10 8291
ما بعد الاستغلال - قشرة الباب الخلفي للمطورين:
# Telnet (يجب الاتصال أولاً)
telnet -l devel 192.168.1.10
# SSH (بعد جلسة Telnet)
ssh -oHostKeyAlgorithms=+ssh-dss [email protected]
Tenable - إثبات المفهوم By the Way