Zero-click蓝牙RCE漏洞利用工具,针对Android 8-9(CVE-2020-0022),包含堆喷射、地址泄露和JOP链执行,通过BlueFrag漏洞实现远程代码执行。
非常感谢 Insinuator 提供的精彩博文和代码!
Insinuator 博客中提到的所有步骤都已完成,甚至更多。这些步骤太多,无法完整放入 README.md 文件,因此请自行查阅上述 Insinuator 的博文。
该漏洞利用已完成到以下阶段:
此漏洞利用与 Insinuator 的实现有以下不同:
libandroid_runtime.so 中的地址而非 libicuuc.so,因为这样在此手机/目标上效果更好execv,另一个先调用 fork 再调用 execvlibandroid_runtime.so 文件并提取函数和 gadgets 的偏移量(以便轻松移植漏洞利用到其他目标)这是一个视频演示,展示漏洞利用将 PC 修改为指向自定义地址:

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

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

幸好,Pixel 3 XL 具有保护机制,可防止蓝牙进程调用 fork 和/或 execv。就知识共享或展示而言,我的工作到此结束。如果我编写并分享更高级的内容,可能会对黑帽黑客过于有用。
我认为此漏洞利用已完成。未来可能的改进包括:
dlsym 然后 mprotect 以运行自定义 shellcode所有这些事情将该项目从一个有趣的知识共享项目转变为可武器化的黑帽漏洞利用,因此我的旅程到此结束,暂时如此……如有任何问题,欢迎联系我。
要运行漏洞利用,只需运行:
make build run ARGS="00:00:00:00:00:00"
其中 00:00:00:00:00:00 是目标/受害设备的 MAC 地址。除了 make clean 之外,其余构建目标仅在你尝试修改、改进或重新实现漏洞利用时才有帮助,因此无需深入提及。
gdbserver 二进制文件可在 NDK 文件夹中找到# 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
# 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}')
如果蓝牙服务停止工作,您可以在攻击者机器上重启它:
sudo systemctl restart bluetooth.service
本节解释在开发此漏洞利用过程中观察到的一些现象:

get_message_loop 使用的 base::MessageLoop 对象的虚表:
partial_packets unordered_map 中每个项目的一个链表项。这是通过 map_experiment 得出的。

