一个完全公开的 CVE-2020-0022 BlueFrag Android RCE 漏洞利用程序(已在 Pixel 3 XL 上测试)
非常感谢 Insinuator 的精彩博文和代码!
Insinuator 帖子中提到的所有步骤都已完成,而且还不止于此。要把这些步骤写进 README.md 文件实在太多了,所以请随意查看上面提到的 Insinuator 的帖子。
该漏洞利用已完全完成,达到了以下程度:
此漏洞利用与 Insinuator 的实现有以下不同:
libandroid_runtime.so 中的地址,而非 libicuuc.so,因为前者在这台手机/目标上效果更好execv,另一个先调用 fork 再调用 execvlibandroid_runtime.so 文件并提取函数和 gadget 的偏移量(以便于将该漏洞利用移植到其他目标)这是一个视频演示,展示了漏洞利用将 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 对象的 vtable:
partial_packets unordered_map 中每个项的一个链表项。这是通过 map_experiment 弄清楚的

