mirror of
				https://github.com/HackTricks-wiki/hacktricks.git
				synced 2025-10-10 18:36:50 +00:00 
			
		
		
		
	Translated ['', 'src/todo/radio-hacking/pentesting-ble-bluetooth-low-ene
This commit is contained in:
		
							parent
							
								
									cff8223bf5
								
							
						
					
					
						commit
						bb52e700a6
					
				@ -2,23 +2,23 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
{{#include ../../banners/hacktricks-training.md}}
 | 
					{{#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**, відправивши його безпосередньо рекламному пристрою. **Відповідь** на цей скан має ту саму структуру, що й **рекламний** пакет, з додатковою інформацією, яка не помістилася у початковому рекламному пакеті, наприклад повна назва пристрою.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.png>)
 | 
					.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
 | 
					### 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
 | 
					```bash
 | 
				
			||||||
hciconfig #Check config, check if UP or DOWN
 | 
					hciconfig #Check config, check if UP or DOWN
 | 
				
			||||||
# If DOWN try:
 | 
					# If DOWN try:
 | 
				
			||||||
@ -30,8 +30,8 @@ spooftooph -i hci0 -a 11:22:33:44:55:66
 | 
				
			|||||||
```
 | 
					```
 | 
				
			||||||
### GATTool
 | 
					### GATTool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**GATTool** дозволяє **встановити** **з'єднання** з іншим пристроєм, перераховуючи **характеристики** цього пристрою та читаючи і записуючи його атрибути.\
 | 
					**GATTool** дозволяє **встановити** **з'єднання** з іншим пристроєм, перелічуючи **характеристики** того пристрою, а також читати та записувати його атрибути.\
 | 
				
			||||||
GATTTool може запустити інтерактивну оболонку з опцією `-I`:
 | 
					GATTTool може запустити інтерактивну оболонку за допомогою опції `-I`:
 | 
				
			||||||
```bash
 | 
					```bash
 | 
				
			||||||
gatttool -i hci0 -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
 | 
					[ ][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 <MAC ADDR> <UUID> <HEX DATA>
 | 
					>> ble.write <MAC ADDR> <UUID> <HEX DATA>
 | 
				
			||||||
>> ble.write <mac address of device> ff06 68656c6c6f # Write "hello" in ff06
 | 
					>> ble.write <mac address of device> 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}}
 | 
					{{#include ../../banners/hacktricks-training.md}}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user