Módulo 3.6

¿Qué es un Sniffer BLE?

Herramienta para interceptar y analizar paquetes BLE "en el aire"

sensors
Peripheral (Sensor)
smartphone
Central (Móvil)
arrow_downward
wifi_tethering
Sniffer (nRF52840)
visibility

Ver lo Invisible

Permite ver EXACTAMENTE lo que se transmite entre dispositivos BLE, incluyendo datos de advertising, parámetros de conexión y comunicación GATT.

bug_report

Debugging Esencial

Herramienta imprescindible para entender el protocolo y solucionar problemas de comunicación a bajo nivel.

memory

nRF Sniffer

Solución de Nordic usando un DK o Dongle adicional con firmware especializado + Wireshark.

lock_open

Incluso Encriptado

Con la LTK correcta, puedes descifrar la comunicación encriptada para análisis completo.

UNIVERSIDAD DE SEVILLA • INGENIERÍA ELECTRÓNICA • MÓDULO 3.6

¿Por qué Usar un Sniffer?

Casos de uso donde el sniffer se vuelve imprescindible

troubleshoot

Problemas de Conexión

Debugging de problemas difíciles: ¿por qué no conecta? ¿por qué se desconecta?

school

Entender el Protocolo

Ver cómo funciona BLE a bajo nivel, ideal para aprendizaje profundo.

verified

Verificar Comportamiento

Confirmar que advertising y conexión funcionan según lo esperado.

timer

Analizar Tiempos

Medir intervalos de advertising, latencia de conexión, tiempos de timeout.

support_agent

Soporte Técnico

Capturar trazas para reportar problemas a Nordic o al equipo de desarrollo.

enhanced_encryption

Análisis de Seguridad

Ver comunicación encriptada proporcionando la LTK al sniffer.

lightbulb Escenario Típico

Problema: "Mi dispositivo aparece en el escaneo pero no puedo conectarme"

Sin sniffer: Revisar logs, adivinar, probar cambios a ciegas...

Con sniffer: Ver el CONNECT_IND, confirmar que llega, ver si hay respuesta, identificar el punto exacto del fallo.

UNIVERSIDAD DE SEVILLA • INGENIERÍA ELECTRÓNICA • MÓDULO 3.6

Cómo Funciona el nRF Sniffer

Firmware especializado que captura paquetes siguiendo el protocolo BLE

memory

Firmware Bare-Metal

Firmware especial en nRF52 (sin Zephyr) optimizado para captura de paquetes.

antenna_signal

Una Antena = Un Canal

Limitación física: solo puede escuchar UN canal a la vez, debe "saltar" entre canales.

warning

Una Conexión a la Vez

Solo puede seguir UNA conexión simultáneamente. Si hay múltiples dispositivos, hay que elegir cuál seguir.

Comportamiento del Sniffer

Modo Advertising
Canales:
37
37 38 39

Sigue el patrón 37 → 38 → 39

Modo Conexión
Canales:
CH
0 12 25 36

Sigue el channel hopping leyendo CONNECT_IND

Captura de una Conexión

1 Escucha canales 37/38/39
arrow_forward
2 Detecta ADV_IND del dispositivo seleccionado
arrow_forward
3 Captura CONNECT_IND
arrow_forward
4 Extrae parámetros de hopping
arrow_forward
5 Sigue la conexión canal a canal
UNIVERSIDAD DE SEVILLA • INGENIERÍA ELECTRÓNICA • MÓDULO 3.6

Hardware Soportado

Dispositivos Nordic compatibles con el firmware del sniffer

Hardware Firmware Notas
developer_board nRF52840 DK
sniffer_nrf52840dk_*.hex Máxima capacidad, soporta coded PHY
usb nRF52840 Dongle
sniffer_nrf52840dongle_*.hex Compacto, ideal como sniffer dedicado
developer_board nRF52833 DK
sniffer_nrf52833dk_*.hex Alternativa económica
developer_board nRF52 DK
sniffer_nrf52dk_*.hex Solo 1M PHY
info

Nota para DK v3

En las versiones v3 del Development Kit, usar el puerto USB etiquetado como "nRF USB" en lugar del puerto "Interface IC" para el sniffer. El puerto Interface IC se usa para programar, pero la comunicación del sniffer debe ser directa con el chip nRF.

recommend Setup Recomendado

  • check_circle Un nRF52840 Dongle como sniffer dedicado
  • check_circle Tu nRF52840 DK para desarrollo normal
  • check_circle Ambos conectados al mismo PC

inventory_2 Alternativa Económica

  • info Usar un solo DK alternando entre desarrollo y sniffer
  • warning Requiere re-flashear firmware cada vez
  • warning No puedes sniffear tu propio dispositivo en desarrollo
UNIVERSIDAD DE SEVILLA • INGENIERÍA ELECTRÓNICA • MÓDULO 3.6

Configuración del Sniffer (1/2)

Instalación del firmware y software necesario

1

Descargar Firmware

Descargar nRF Sniffer for Bluetooth LE v4.x desde nordicsemi.com

nrf_sniffer_for_bluetooth_le_4.x.x.zip
2

Flashear el Firmware

Usar nRF Connect Programmer para cargar el .hex correspondiente al hardware.

hex/sniffer_nrf52840dongle_*.hex
3

Instalar Wireshark

Descargar e instalar Wireshark (versión 3.x o superior recomendada).

UNIVERSIDAD DE SEVILLA • INGENIERÍA ELECTRÓNICA • MÓDULO 3.6

Configuración del Sniffer (2/2)

Integración con Wireshark

4

Instalar Plugin de Captura

Desde la carpeta extcap del sniffer descargado:

$ pip3 install -r requirements.txt
5

Copiar Extcap a Wireshark

Copiar el contenido de extcap a la carpeta Personal Extcap de Wireshark:

Windows: %APPDATA%\Wireshark\extcap\
macOS: ~/.config/wireshark/extcap/
Linux: ~/.config/wireshark/extcap/
6

Habilitar Toolbar

En Wireshark: View → Interface Toolbars → nRF Sniffer for Bluetooth LE

verified Verificación

Si la instalación es correcta, al abrir Wireshark verás "nRF Sniffer for Bluetooth LE" en la lista de interfaces de captura. Al seleccionarla, aparecerá la toolbar con controles específicos.

UNIVERSIDAD DE SEVILLA • INGENIERÍA ELECTRÓNICA • MÓDULO 3.6

La Interfaz de Wireshark (1/2)

Las tres ventanas principales para analizar capturas BLE

list Packet List - Lista de paquetes capturados
0.000 aa:bb:cc:dd LE LL ADV_IND
0.020 11:22:33:44 LE LL SCAN_REQ
0.021 aa:bb:cc:dd LE LL SCAN_RSP
0.100 11:22:33:44 LE LL CONNECT_IND
expand_more Packet Details - Detalles expandibles del paquete seleccionado
▼ Bluetooth Low Energy Link Layer
Access Address: 0x8e89bed6
PDU Type: ADV_SCAN_RSP (0x4)
▼ Advertising Data
Device Name: "Nordic_HRS"
TX Power Level: 0 dBm
memory Packet Bytes - Datos raw en hexadecimal
0000 d6 be 89 8e 44 14 dd cc bb aa 02 01 04 0b 09 4e 6f 72 64 69 63
UNIVERSIDAD DE SEVILLA • INGENIERÍA ELECTRÓNICA • MÓDULO 3.6

La Interfaz de Wireshark (2/2)

Columnas importantes en la lista de paquetes

Columnas Importantes en Packet List

Columna Descripción
No. Número secuencial del paquete
Time Timestamp relativo desde inicio de captura
Source Dirección BLE origen (puede ser random)
Protocol Capa del stack: LE LL, L2CAP, ATT, SMP
Channel Index Canal de captura (37-39 adv, 0-36 datos)
Delta time Tiempo desde el paquete anterior
Info Resumen del contenido del paquete
UNIVERSIDAD DE SEVILLA • INGENIERÍA ELECTRÓNICA • MÓDULO 3.6

Analizando Advertising

Qué buscar en los paquetes de advertising

Puntos Clave a Observar

  • radio_button_checked
    Tipo de advertising: ADV_IND, ADV_SCAN_IND, ADV_NONCONN_IND
  • radio_button_checked
    Canales: 37, 38, 39 en secuencia
  • radio_button_checked
    Intervalo: Delta time entre clusters (~N ms configurado)
  • radio_button_checked
    Random delay: 0-10ms extra (evita colisiones)
  • radio_button_checked
    SCAN_REQ/SCAN_RSP: Deben estar en el mismo canal

Contenido del Advertising Data

  • Flags: Capacidades del dispositivo
  • Complete Local Name: Nombre visible
  • Service UUIDs: Servicios ofrecidos
  • Manufacturer Specific: Datos propietarios

Estructura AD (Advertising Data)

Formato: Length + Type + Data

Ejemplo: Flags
0x02
Len
0x01
Type
0x04
Data

= Flags (0x01), valor BT_LE_AD_NO_BREDR

Ejemplo: Manufacturer Specific
0x05
Len
0xFF
Type
0x59
CID-L
0x00
CID-H
0x00
D1
0x00
D2

= Manufacturer (0xFF), Company ID 0x0059 (Nordic)

filter_alt Filtros Útiles en Wireshark

btle.advertising_address == aa:bb:cc:dd:ee:ff

Filtrar por dirección de advertising

btle.advertising_header.pdu_type == 0x00

Solo ADV_IND

UNIVERSIDAD DE SEVILLA • INGENIERÍA ELECTRÓNICA • MÓDULO 3.6

Analizando Conexiones

Secuencia típica de establecimiento y comunicación

Secuencia de Conexión

1
CONNECT_IND

Parámetros iniciales (interval, timeout, channel map)

2
LL_PHY_REQ / LL_PHY_UPDATE_IND

Negociación de PHY (1M, 2M, Coded)

3
Empty PDU

Keep-alive mientras no hay datos

4
L2CAP Connection Parameter Update

Request/Response para ajustar parámetros

5
LL_CONNECTION_UPDATE_IND

Nuevos parámetros con Instant (cuándo aplicar)

tips_and_updates Filtrar Empty PDUs

Los Empty PDU son paquetes de keep-alive sin datos. Para ocultarlos:

!(btle.data_header.length == 0)

Parámetros en CONNECT_IND

  • schedule Interval: Tiempo entre eventos de conexión
  • hourglass_empty Latency: Eventos que puede saltar el peripheral
  • timer_off Timeout: Tiempo máximo sin comunicación
  • grid_view Channel Map: Canales habilitados (37 bits)

info El Campo "Instant"

Cuando se actualiza la conexión, el Instant indica el número de evento de conexión en el que los nuevos parámetros entran en vigor. Ambos dispositivos cuentan los eventos y cambian simultáneamente.

UNIVERSIDAD DE SEVILLA • INGENIERÍA ELECTRÓNICA • MÓDULO 3.6

Analizando Comunicación GATT

Operaciones GATT y proceso de pairing visibles en el sniffer

Operaciones GATT Comunes

edit
Write Request al CCCD

Habilitar notificaciones (0x0001) o indicaciones (0x0002)

notifications_active
Handle Value Notification

Datos enviados desde el peripheral (ej: valor de sensor)

visibility
Read Request / Response

Central solicita valor de una característica

error
Error Response

Ej: "Insufficient Authentication" (requiere pairing)

Secuencia de Pairing

1
Write Request rechazado

Error: Insufficient Authentication

2
Pairing Request / Response

Intercambio de IO capabilities

3
Key Exchange (SMP)

Generación de claves compartidas

4
LL_START_ENC_REQ

Inicio de encriptación

5
Paquetes encriptados

Requieren LTK para descifrar

filter_alt Filtros para Análisis GATT

btatt

Solo paquetes ATT (operaciones GATT)

btatt.opcode == 0x12

Solo Write Request

btatt.opcode == 0x1b

Solo Notifications

btsmp

Solo paquetes SMP (pairing)

UNIVERSIDAD DE SEVILLA • INGENIERÍA ELECTRÓNICA • MÓDULO 3.6

Descifrando Conexiones Encriptadas (1/2)

Cómo ver el contenido de comunicaciones cifradas con la LTK

lock

El Problema

Después de LL_START_ENC_REQ, todos los paquetes están encriptados. El sniffer los captura pero no puede interpretar el contenido. Solo vemos datos aleatorios sin sentido.

Solución: Exportar la LTK

1. Habilitar Log de LTK en Zephyr

# prj.conf
CONFIG_BT_LOG_SNIFFER_INFO=y

2. Observar el Log Serial

I: SC LTK: 0xe58c6433...

Este valor aparece cuando se completa el pairing

3. Configurar en Wireshark

  1. 1. Toolbar sniffer → dropdown "Key"
  2. 2. Seleccionar "SC LTK"
  3. 3. Pegar la LTK (sin 0x)
  4. 4. Clic en "Apply"
UNIVERSIDAD DE SEVILLA • INGENIERÍA ELECTRÓNICA • MÓDULO 3.6

Descifrando Conexiones Encriptadas (2/2)

Verificación y ejercicio práctico

Verificación

check_circle Confirmar Descifrado Exitoso

En Packet Details, expandir nRF SnifferFlags:

lock Encrypted: Yes lock_open Decrypted: Yes

Antes vs Después

close
Sin LTK: Encrypted Data (can't decrypt)
check
Con LTK: ATT: Handle Value Notification

warning Importante

  • - La LTK cambia con cada nuevo pairing
  • - Debes capturar DESDE el inicio del pairing
  • - Si reconectas con bonding, necesitas la LTK original
  • - Solo funciona en modo desarrollo

science Ejercicio Práctico

  1. 1 Configura el sniffer y captura
  2. 2 Conecta desde nRF Connect móvil
  3. 3 Identifica CONNECT_IND, Empty PDUs, ATT
  4. 4 Mide el intervalo de conexión (Delta time)
  5. 5 Habilita CONFIG_BT_LOG_SNIFFER_INFO y descifra
1 / 10