Ymsniper/BBF
GitHub: Ymsniper/BBF
一款蓝牙安全审计工具,通过暴力破解 UAP 来定位不可发现模式的设备 BD_ADDR,并支持名称解析与可选的拒绝服务攻击。
Stars: 44 | Forks: 2
# BBF --- BD_ADDR(UAP) 暴力破解工具
在已知 LAP 的情况下,通过 `l2ping` 所有可能的值,对目标蓝牙
`BD_ADDR` 中一个未知字节(UAP)进行暴力破解。
当部分地址已知时(通过先前的扫描、OUI 查询、嗅探流量等),
这对于定位不可发现的设备非常有用。
如果命令行中没有提供 LAP,`bbf` 会转而驱动一个交互式的
`ubertooth-rx` 调查,在空中寻找候选地址,
然后让你选择一个输入到扫描中。
UAP 空间只有 256 个值,因此一次完整的扫描也就几百次
串行 l2ping 调用,在使用默认 pageto 的情况下最坏大约需要 5 分钟。
通常会更快,因为大多数候选地址在超时之前很久就会失败。
## 名称解析
任何时候只要 `bbf` 获得了完整的地址(即已知的 UAP),无论是
直接从调查中获得的“可直接使用”的结果,还是通过扫描确认在线的
地址,它现在都会对其运行 `hcitool name` 并报告
结果。这是一个独立于 `l2ping`/寻呼的无线电交换过程,并且
它甚至适用于 `bbf` 本身从未明确 ping 过的地址:
Remote_Name_Request 不需要配对/绑定,因此任何
支持寻呼扫描的设备 —— 大多数设备,即使是处于
“不可发现”模式的设备 —— 通常也会对此做出响应。
```
Resolving names for 2 known-UAP address(es) from the survey...
[survey] 00:00:be:b4:f1:3f -> Redmi Note 14 5G
[survey] 00:00:5c:06:3e:0f -> JBL TUNE BEAM
```
`(no name response)` 结果本身就是包含信息的,而不仅仅是一个未命中 —
它可能意味着该地址已确认在线,但其协议栈针对未经身份验证的名称公开进行了强化(一些较新的协议栈会对此进行限流或限制,作为一种追踪缓解措施),而这可能正是你要审计的那种不一致性。
使用 `--save FILE` 还可以将每个已解析(或已尝试)的结果
追加到 TSV 日志中,格式为 `timestampaddressnamesource`,其中
`source` 为 `survey` 或 `sweep`,具体取决于 UAP 是如何得知的。
如果文件不存在则会创建,并且只会进行追加操作,因此在不同 LAP/会话中的重复
运行会累积到一个日志中。使用
`--no-resolve-names` 可以完全跳过名称解析并获得旧的
仅限地址行为;`--name-timeout`(默认 20s)限制了每次
`hcitool name` 调用可以阻塞的时间,与 `--pageto` 无关。
## 合法 / 道德使用
仅对你拥有或获得明确授权的设备运行此操作
(例如,作为你获得书面许可的测试任务的一部分)。
暴力破解设备的地址会攻破蓝牙的不可发现
模式,而有些人正是依赖此模式来保护隐私。未经同意定位或指纹识别
他人的设备在你的司法管辖区可能属于非法行为,这
也不是本工具的预期用途。
大多数蓝牙设备都已配对并设置为不可发现,因为大多数人和操作系统在初始设置完成后都会关闭常规发现扫描,但不可发现模式仅会阻止扫描,并不会阻止连接。L2CAP 是面向连接的,本身没有发现机制;l2ping/l2flood 都会直接调用 connect() 并且只需要 LAP+UAP(不需要 NAP,不需要确切完整的 BD_ADDR),而这正是 bbf + ubertooth 所做的工作。因此,bbf 使得针对真实目标的 flood 工具变得更加容易。
## 环境要求
- 带有 BlueZ 的 Linux(`l2ping`、`hciconfig`)— `sudo apt install bluez`
- 已安装 l2flood-emp-mode https://github.com/Ymsniper/l2flood/tree/emp-mode(已随 BBF 打包)**原始版本:https://github.com/kovmir/l2flood **
- `sudo` 权限(`l2ping` 和 `hciconfig pageto` 都需要 root)
- 一个已启动的蓝牙适配器(`hciconfig hci0 up`)
- 可选,仅用于调查前端:一个
[Ubertooth One](https://github.com/greatscottgadgets/ubertooth) 并且
`PATH` 中存在 `ubertooth-rx` — `sudo apt install ubertooth`
## 安装
```
git clone https://github.com/Ymsniper/BBF
cd BBF
pip install .
# 如果需要,运行 (pip install . --break-system-packages)
# 可选的 DOS attack 运行方式:
cd l2flood-emp-mode
make # Use `make serial` to build upstream l2ping.
sudo make install
```
此操作会安装一个 `bbf` 命令。对于本地开发,请连同测试依赖项一起以
可编辑模式安装:
```
pip install -e ".[dev]"
```
## 用法
```
bbf [known_octets] [--prefix XX:XX] [--hcidev hci0]
[--pageto SLOTS] [--no-pageto-override] [--no-retry]
[--retries N] [--only BYTES] [--scan-time SECONDS]
[--save FILE] [--no-resolve-names] [--name-timeout SECONDS]
```
| 选项 | 默认值 | 含义 |
|---|---|---|
| `known_octets` | *(无)* | 3 个已知的尾随字节 (LAP),例如 `1E:B7:E4`。如果省略,则首先运行交互式 `ubertooth-rx` 调查。 |
| `--prefix` | `00:00` | 2 个已知的前导字节 (NAP)。 |
| `--hcidev` | `hci0` | 要调整的 HCI 适配器。 |
| `--pageto` | `1600` | 扫描期间使用的控制器寻呼超时(以 slot 为单位,1 slot = 0.625 ms),因此失效的地址不会长时间占用控制器。在重新检查阶段之前会恢复此设置。 |
| `--no-pageto-override` | off | 保持适配器的寻呼超时设置不变。 |
| `--no-retry` | off | 完全跳过串行重新检查阶段。 |
| `--retries` | `2` | 重新检查阶段每个地址的额外尝试次数(因此默认总共尝试 3 次)。 |
| `--only` | *(无)* | 直接测试以逗号分隔的十六进制字节,而不是扫描 `00..ff`,例如 `5c` 或 `04,5c,a1`。 |
| `--scan-time` | *(提示输入,30s)* | 交互式调查的 `ubertooth-rx -t` 持续时间。仅在省略 `known_octets` 时使用。 |
| `--save` | *(无)* | 将每个已知 UAP 地址的 `timestamp`、`address`、`name`、`source` (TSV) 追加到此文件中,无论来自调查还是扫描。如果不存在则创建,从不截断。 |
| `--no-resolve-names` | off | 完全跳过 `hcitool name` 解析;仅报告地址(旧行为)。 |
| `--name-timeout` | `20` | 每次 `hcitool name` 调用的子进程级超时时间(以秒为单位),与 `--pageto` 无关。 |
### 示例
针对已知的 LAP 扫描所有 256 个可能的 UAP 值:
```
bbf 1E:B7:E4
# 针对 XX in 00..FF,探测 00:00:XX:1E:B7:E4
```
直接测试一个特定的候选字节,跳过扫描:
```
bbf 1E:B7:E4 --only 5c
# 仅测试 00:00:5c:1E:B7:E4
```
尚未知道 LAP — 运行交互式 `ubertooth-rx` 调查,从结果中
选择一个目标,然后对其进行扫描:
```
bbf
```
## 工作原理
### 调查(当省略 `known_octets` 时)
`bbf` 运行 `ubertooth-rx -z -t `,实时流式传输其输出
并解析最后的“Survey Results”部分。每一行都是
以下之一:
```
??:??:BE:B4:F1:3F UAP resolved (BE). Nothing left to sweep — this is
already a complete candidate modulo the assumed
NAP. Listed as "ready to use".
??:??:??:C5:9D:87 UAP unresolved (extra ??). LAP (C5:9D:87) is
offered as a numbered sweep target.
```
### 扫描
探测严格按照串行方式运行,一次只进行一个 `l2ping`,这是
有意为之,而不是为了简化。针对典型适配器的 `btmon` 捕获显示
每个 Create Connection 命令都有 `Num_HCI_Command_Packets` (`ncmd 1`),
这意味着控制器只会向主机授予一个未完成的
寻呼尝试信用。在此之下,Link Controller 只有一个
基带和一个 RF 前端,因此无论如何它一次只能占用一个
目标的跳频序列的寻呼状态。`--pageto` 是
真正能改变总扫描时间的唯一旋钮。
`l2ping` 探测本身没有外部超时 — 每个地址
都会阻塞,直到 `l2ping` 自行退出,这受限于控制器自身的
寻呼超时(`--pageto`)。如果你需要手动退出,Ctrl-C 依然
有效。
在第一次扫描之后,任何返回“否”的地址都会进行串行
**重新检查阶段**:此时会恢复原始(较大的)寻呼超时,
并且每个地址最多获得 `--retries` 次额外尝试,
因为蓝牙设备仅在其自身的寻呼扫描窗口期间监听寻呼 —
即使针对完全正确的地址,一次未命中也可能仅仅意味着
尝试没有落在该窗口内。
## 开发
```
pip install -e ".[dev]"
pytest
```
# 致谢
感谢 [@kovmir](https://github.com/kovmir) 提供的 l2flood,以及
感谢 [@Great Scott Gadgets](https://github.com/greatscottgadgets) 提供的 ubertooth
## 许可证
MIT — 查看 [LICENSE](LICENSE)。
标签:PoC, 插件系统, 暴力破解, 蓝牙安全, 逆向工具