Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2020-0022 — Zero-click蓝牙RCE漏洞利用工具,针对Android 8-9(CVE-2020-0022),包含堆喷射、地址泄露和JOP链执行,通过BlueFrag漏洞实现远程代码执行。 | Kitploit
工具/GitHubGitHub/kalibb/cve-2020-0022
Android安全蓝牙安全漏洞利用逆向工程Shellcode调试器CTF移动安全学习与教育远程访问工具Payload 开发二进制利用
177个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享
GitHub
kalibb/cve-2020-0022

CVE-2020-0022

Zero-click蓝牙RCE漏洞利用工具,针对Android 8-9(CVE-2020-0022),包含堆喷射、地址泄露和JOP链执行,通过BlueFrag漏洞实现远程代码执行。

查看仓库

CVE-2020-0022

非常感谢 Insinuator 提供的精彩博文和代码!

结果

Insinuator 博客中提到的所有步骤都已完成,甚至更多。这些步骤太多,无法完整放入 README.md 文件,因此请自行查阅上述 Insinuator 的博文。

该漏洞利用已完成到以下阶段:

  1. 泄漏了攻击者控制的足够大的内存区域地址
  2. 程序计数器被修改为指向自定义地址
  3. 自动重试直到失败概率显著降低
  4. 在断开时间和内存搜索速度方面进行了优化,以至于进一步优化会损害漏洞利用的稳定性

差异与改进

此漏洞利用与 Insinuator 的实现有以下不同:

  1. 它用 C 语言编写而非 Python(因为我喜欢 C)
  2. 采用模块化方式编写,每个模块负责特定任务
  3. 在运行 Android 9 (PQ3A.190801.002,安全补丁级别 2019-08-01) 的 Pixel 3 XL 上测试,因为手头正好有这个设备
  4. 它泄漏 libandroid_runtime.so 中的地址而非 libicuuc.so,因为这样在此手机/目标上效果更好
  5. 实现两个 JOP 链示例:一个直接调用 execv,另一个先调用 fork 再调用 execv
  6. 附带有自定义 Ghidra 脚本,用于处理 libandroid_runtime.so 文件并提取函数和 gadgets 的偏移量(以便轻松移植漏洞利用到其他目标)

演示/截图

这是一个视频演示,展示漏洞利用将 PC 修改为指向自定义地址: PoC 演示视频

链的第一个迭代版本可在 jop_experiment 中看到。此链直接调用 execv 而不调用 fork。它位于提交 ca28fdf 中。使用此链时会发生以下情况: Execv 链

链的第二个迭代版本先调用 fork 再调用 execv。此链的完整详情可在此找到。使用此链时会发生以下情况: Fork 链

幸好,Pixel 3 XL 具有保护机制,可防止蓝牙进程调用 fork 和/或 execv。就知识共享或展示而言,我的工作到此结束。如果我编写并分享更高级的内容,可能会对黑帽黑客过于有用。

漏洞利用的结论

我认为此漏洞利用已完成。未来可能的改进包括:

  • 编写一个 JOP 链来调用 dlsym 然后 mprotect 以运行自定义 shellcode
  • 收集并保存不同目标的偏移量数据库
  • 在多个目标上测试漏洞利用,以实现相对通用性
  • 将该漏洞利用与操作系统级漏洞利用链结合以获取 root 权限(如我之前 CVE-2019-2215 漏洞利用)
  • 等等……

所有这些事情将该项目从一个有趣的知识共享项目转变为可武器化的黑帽漏洞利用,因此我的旅程到此结束,暂时如此……如有任何问题,欢迎联系我。

使用方法

要运行漏洞利用,只需运行:

root@kitploit:~
make build run ARGS="00:00:00:00:00:00" 

其中 00:00:00:00:00:00 是目标/受害设备的 MAC 地址。除了 make clean 之外,其余构建目标仅在你尝试修改、改进或重新实现漏洞利用时才有帮助,因此无需深入提及。

调试

  • Android 的 gdbserver 二进制文件可在 NDK 文件夹中找到
  • 使用此方法调试目标(不推荐):
root@kitploit:~
# On target
/data/local/tmp/gdbserver 0.0.0.0:1234 --attach $(ps -A | grep -i "com.android.bluetooth" | awk '{print $2}')

# On host
adb forward tcp:1234 tcp:1234
gdb-multiarch -q -x ./gdbinit
  • 通过 termux 的 gdb 直接在手机上调试(推荐):
root@kitploit:~
# On host
adb push ./gdbinit /data/local/tmp/gdbinit

# On target
su
/data/data/com.termux/files/usr/bin/gdb -q -x /data/local/tmp/gdbinit -p $(ps -A | grep -i "com.android.bluetooth" | awk '{print $2}') 
# OR
/data/data/com.termux/files/usr/bin/gdb -q -p $(ps -A | grep -i "com.android.bluetooth" | awk '{print $2}') 

如果蓝牙服务停止工作,您可以在攻击者机器上重启它:

root@kitploit:~
sudo systemctl restart bluetooth.service

备注

本节解释在开发此漏洞利用过程中观察到的一些现象:

  • SSP 被关闭(创建 HCI 套接字 fd 时),以防止远程目标超时:

SSP PIN 超时

  • 我们正在喷射堆清理包,以减少目标因意外溢出而崩溃的机会,该溢出会修改通过 get_message_loop 使用的 base::MessageLoop 对象的虚表:

CFI MessageLoop 崩溃

  • Insinuator 博文中对此解释不够清楚。我们试图定位 32 字节的 malloc 块来泄漏数据包的地址,这些块包含 partial_packets unordered_map 中每个项目的一个链表项。这是通过 map_experiment 得出的。 map_experiment 与实际程序中泄漏的内容不匹配,因此我遵循了 insinuator 的模式并使用了另一种模式(也是通过实验发现的)。
map_experiment 的结果

Map 实验结果

  • 崩溃和 PC 覆盖成功使 chrome 信号对象崩溃

LibChrome 信号对象崩溃

  • JOP 链已通过 jop_experiment 进行模拟。完整的(第一个,仅 execv)JOP 链在 JOP_PLAN.md 中说明

JOP 实验结果

下载工具