titiomathias/sec-for-ble
GitHub: titiomathias/sec-for-ble
基于ESP32与FastAPI的BLE攻击性安全教学靶场,通过模拟存在漏洞的智能家居环境演示未认证写入、重放攻击和客户端冒充等BLE安全威胁。
Stars: 0 | Forks: 0
# 蓝牙低功耗(BLE)的攻击性安全
这是一个教学实验室,旨在使用两个存在漏洞的 ESP32 设备和一个模拟实时智能家居的外部 API 来演示 BLE 攻击。
## 场景目标
本项目专为蓝牙低功耗(BLE)的攻击性安全实践课程而设计:
- `ESPA (home)` 充当存在漏洞的 BLE 外围设备,并控制房屋状态。
- `ESPB (client)` 充当 BLE 中心设备并发送命令。
- `Smart Home API` 在浏览器中呈现房屋,记录事件,并便于直观观察攻击的影响。
其核心是重现、观察并解释不安全的行为,例如未经验证的写入、重放攻击以及 BLE 客户端冒充。
## 架构
```
[ESPB_CLIENT_VULN] --BLE plaintext--> [ESPA_HOME_VULN] --HTTP--> [Smart Home API + UI]
| | |
(comandos) (sem auth BLE) (estado + eventos)
```
## 仓库结构
```
.
├── espa_home_vuln/
│ └── espa_home_vuln.ino # ESPA: periférico BLE vulnerável + integração HTTP com API
├── espb_client_vuln/
│ └── espb_client_vuln.ino # ESPB: central BLE vulnerável (auto/demo/manual)
└── smarthome/
├── app/main.py # FastAPI + WebSocket + painel visual
├── app/state_store.py # Persistência e trilha de eventos
├── data/state.json # Estado da casa
└── requirements.txt
```
## 蓄意设置的漏洞
在固件 `espa_home_vuln` 中:
- 无强制性的 pairing/bonding。
- 无 BLE 链路加密。
- 命令采用明文形式(`SALA:ON`, `COZINHA:OFF` 等)。
- 无防重放的 nonce/counter/token。
- 用于命令的 Characteristic 具有开放的写入权限。
在固件 `espb_client_vuln` 中:
- 客户端以纯文本形式发送命令。
- 自动化流程便于生成可重复的流量,以用于重放/演示。
## 实验室使用的 BLE 协议
- `BLE_DEVICE_NAME` (home): `ESP32_HOME_VULN`
- `SERVICE_UUID`: `b7e15000-7d99-4c80-9a9e-b8d537d9e111`
- `CMD_CHAR_UUID`: `b7e15001-7d99-4c80-9a9e-b8d537d9e111` (write)
- `STATE_CHAR_UUID`: `b7e15002-7d99-4c80-9a9e-b8d537d9e111` (read/notify)
房屋接受的命令:
- `SALA:ON` / `SALA:OFF`
- `COZINHA:ON` / `COZINHA:OFF`
- `BANHEIRO:ON` / `BANHEIRO:OFF`
- `STATUS`
- `RESET`
## 启动房屋 API(外部模拟器)
前置条件:
- Python 3.10+
步骤:
```
cd smarthome
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cd app
python3 main.py
```
API 将启动于:
- `http://127.0.0.1:8080`
- `http://SEU_IP_LOCAL:8080`(用于在同一网络内访问 ESPs)
## ESPs 配置
### ESPA(存在漏洞的房屋)
文件:`espa_home_vuln/espa_home_vuln.ino`
在上传前调整以下值:
- `WIFI_SSID`
- `WIFI_PASS`
- `API_BASE_URL`(例如:`http://192.168.0.10:8080`)
使用 NimBLE-Arduino 栈进行编译,并上传到房屋的 ESP32 设备。
### ESPB(存在漏洞的客户端)
文件:`espb_client_vuln/espb_client_vuln.ino`
将其上传到客户端 ESP32。它将进行扫描,连接 BLE 服务,并支持:
- 自动模式(周期性随机命令)
- 演示模式(引导序列)
- 通过串口的手动模式(任何文本命令)
## 如何运行演示
1. 启动 API(`python3 main.py`)并打开 Web 面板。
2. 打开 ESPA(`ESP32_HOME_VULN`)并确认其处于广播状态。
3. 打开 ESPB 并等待 BLE 连接。
4. 通过 ESPB 的串口发送命令(`demo`, `STATUS`, `SALA:ON` 等)。
5. 在面板上观察实时变化(WebSocket + 事件)。
## 用于课堂演示的攻击场景
1. 未经验证的 BLE 写入
使用另一个 BLE 中心设备(例如:手机上的通用 BLE 应用程序)直接向 `CMD_CHAR_UUID` 写入。
预期结果:无需合法客户端,房屋状态即发生改变。
2. 命令重放
重新发送之前截获的有效命令。
预期结果:动作重复发生,因为不存在 nonce/counter 或新鲜度验证。
3. 客户端冒充
攻击者以预期格式发送 payload(`SALA:ON`, `COZINHA:OFF` 等),即可获得相同的操作效果。
预期结果:API 会记录具有技术来源的事件,但无法保证可靠的身份认证。
## 主要 API 端点
- `GET /api/state` -> 房屋当前快照
- `POST /api/command` -> 按目标执行操作
- `PATCH /api/state/{device_type}/{device_id}` -> 直接更改状态
- `GET /api/events?limit=20` -> 事件历史记录
- `POST /api/reset` -> 重置场景
- `WS /ws` -> 面板的实时更新
通过 API 发送命令的示例:
```
curl -X POST http://127.0.0.1:8080/api/command \
-H 'Content-Type: application/json' \
-d '{"target":"doors.front","action":"open","source":"attacker-replay"}'
```
## 负责任的使用
本项目仅限于受控实验室、教学环境及授权研究。未经明确许可,请勿在设备、网络或系统上使用这些技术。
标签:ESP32, Homebrew安装, 数据展示, 漏洞环境, 物联网安全, 红队, 蓝牙低功耗, 逆向工具