vikasraj00/ctf-challenge-9
GitHub: vikasraj00/ctf-challenge-9
基于 ESP32 的低功耗蓝牙 CTF 挑战,参赛者需通过 BLE 扫描与 GATT 属性读取来发现隐藏的 flag。
Stars: 0 | Forks: 0
# CTF_9:低功耗蓝牙搜寻
## 部署说明
要在物理硬件上部署挑战,请按照以下部署步骤操作:
1. 在您的计算机上下载并安装 Arduino IDE。
2. 打开 Arduino IDE,导航到 **Tools > Board**,然后选择您特定的 ESP32 开发板型号。
3. 使用支持数据的 micro-USB 或 USB-C 数据线将 ESP32 连接到您的计算机,并在 **Tools > Port** 下选择活动端口。
4. 如果您的核心板封装中尚未包含所需的 ESP32 BLE 库,请进行安装。
5. 将部署代码粘贴到名为 `ctf_9` 文件夹内的 `ctf_9.ino` 文件中。
6. 点击左上角的 **Upload** 箭头图标,编译并将固件烧录到微控制器内存栈中。
7. 将开发板与计算机断开连接,将其连接到便携式移动电源或 USB 电源适配器,并将其安全地隐藏在指定的咖啡休闲区目标区域内。
## 技术概念
挑战的结构依赖于标准的低功耗蓝牙数据架构原理:
* **UUID 定义**:自定义的通用唯一识别码(UUID)是 128 位的十六进制字符串,用于区分不同的 Bluetooth 配置文件。
* **漏洞层**:flag payload 并未在公开的未加密设备广播名称中全局泄露结构化 flag 指标,而是完全隐藏在属性值中。
* **利用门槛**:要成功检索 flag,玩家必须手动处理 Bluetooth 握手协议,发现特定的服务跟踪,定位指定的 Characteristic UUID,并向该内存地址发出显式的 BLE READ 请求命令。
## 运行部署警告
如果您要将设备部署在物理休息区,请牢记硬件的电源限制:
* **电池消耗**:使用基本的 delay 循环将 ESP32 隐藏在桌子下或植物后整整一天,会非常快地耗尽便携式移动电源。
* **优化**:为了确保挑战在为期多天的会议期间可靠运行,请修改固件以使用深度睡眠或降低 Bluetooth 广播频率。
## 阶段 1:信号侦察
1. 根据挑战控制面板的提示,在物理上靠近咖啡休闲区附近的疑似部署区域。
2. 在移动设备上启动 BLE 网络发现工具,例如 BLE Scanner 或 nRF Connect。
3. 在屏幕上下拉以启动对本地无线广播信道的主动扫描。
4. 过滤或滚动浏览发现的外围设备,以识别名为 `Lounge_Terminal_04` 的自定义目标接入点。
## 阶段 2:设备枚举
1. 点击 `Lounge_Terminal_04` 条目旁边的 **Connect** 按钮,以建立通用属性配置文件(GATT)连接。
2. 等待应用程序查询并映射设备的内部属性层次结构。
3. 滚动浏览标准的通用服务标识符(例如 Device Information 或 Generic Access),以定位自定义的 Service UUID:`4fafc201-1fb5-459e-8fcc-c5c9c331914b`。
## 阶段 3:数据包利用
1. 展开自定义服务菜单以显示其底层元素。
2. 识别指定用于数据检索的 Characteristic UUID:`beb5483e-36e1-4688-b7f5-ea07361b26a8`。
3. 点击 **Read** 图标(由向下箭头或文本读取选项表示),直接从 ESP32 内存栈查询 payload 值。
4. 提取数据包值字段中暴露的纯文本字符串:`FLAG{you_are_the_ble_lounge_hero}`。
## 替代方法:Linux 命令行利用
在 Linux 环境中操作的高级玩家可以完全绕过图形应用程序,并使用标准的 Bluetooth 管理工具直接通过终端提取数据 payload。
1. 打开终端窗口并初始化 Bluetooth 发现子系统,以发现目标的硬件地址:
```
bluetoothctl
[bluetooth]# scan on
```
2. 在生成的输出列表中找到 `Lounge_Terminal_04` 并复制其关联的 MAC 地址(例如,`AA:BB:CC:DD:EE:FF`)。
3. 退出控制工具,并直接向目标硬件配置文件发起交互式终端连接字符串:
```
gatttool -b AA:BB:CC:DD:EE:FF -I
```
4. 建立实时连接并请求有效硬件数据特征的完整列表:
```
[AA:BB:CC:DD:EE:FF][LE]> connect
[AA:BB:CC:DD:EE:FF][LE]> characteristics
```
5. 识别跟踪目标 UUID `beb5483e-3688-b7f5-ea07361b26a8` 的条目,并直接读取其指定的十六进制存储句柄:
```
[AA:BB:CC:DD:EE:FF][LE]> char-read-hnd 0x002d
```
6. 将生成的原始十六进制字符串输出转换为纯文本格式以显示 flag。
## 替代方法 2:自动化脚本利用
玩家可以利用程序化方法,通过异步 Python 脚本自动扫描、验证并拉取目标数据 payload。
1. 确保本地系统上已安装必要的异步 Bluetooth 抽象库:
```
pip install bleak
```
2. 执行以下自动化脚本,将 `DEVICE_ADDRESS` 变量替换为初始侦察期间发现的实际硬件 MAC 地址:
```
import asyncio
from bleak import BleakClient
DEVICE_ADDRESS = "AA:BB:CC:DD:EE:FF"
CHARACTERISTIC_UUID = "beb5483e-36e1-4688-b7f5-ea07361b26a8"
async def main():
async with BleakClient(DEVICE_ADDRESS) as client:
if client.is_connected:
raw_data = await client.read_gatt_char(CHARACTERISTIC_UUID)
print(f"Decoded Payload: {raw_data.decode('utf-8')}")
asyncio.run(main())
```
标签:ESP32, 物联网, 硬件设备, 网络安全, 蓝牙低功耗, 逆向工具, 隐私保护