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, 物联网, 硬件设备, 网络安全, 蓝牙低功耗, 逆向工具, 隐私保护