
Navaja suiza de Bluetooth Low Energy
BtleJack: una navaja suiza de Bluetooth Low Energy #####################################################
Btlejack proporciona todo lo que necesitas para esnifar, interferir y secuestrar dispositivos Bluetooth Low Energy. Se basa en uno o más dispositivos BBC Micro:Bit <http://microbit.org/>_ que ejecutan un firmware dedicado. También es posible que quieras usar un sniffer Bluefruit LE de Adafruit <https://www.adafruit.com/product/2269>_ o un Kit de evaluación nRF51822 <https://www.waveshare.com/wiki/BLE400>_, ya que hemos añadido soporte para estos dispositivos.
La versión actual de esta herramienta (2.0) es compatible con BLE 4.x y 5.x. El soporte para BLE 5.x es limitado, ya que solo admite el PHY sin codificar de 1 Mbps y no admite actualizaciones del mapa de canales.
Necesitas un sistema basado en UNIX (por ejemplo, una Raspberry Pi). Si usas el BBC Micro:Bit, necesitarás de uno a tres dispositivos Micro:Bit (se recomiendan tres dispositivos) y para cada dispositivo un puerto USB libre. El consumo de energía de un Micro:Bit es bastante bajo, por lo que puedes usar un solo puerto USB y un hub pasivo para alimentar las tres unidades recomendadas.
Si conectas 3 microbits al mismo tiempo en tu computadora, Btlejack podrá esnifar en todos los canales de publicidad y tendrá muchas más posibilidades de capturar la solicitud de conexión.
Primero, instala el software cliente de Python3 btlejack con Pip:
::
$ sudo pip3 install btlejack
Luego, conecta tu dispositivo Micro:Bit a tu computadora con un cable USB, monta el dispositivo de almacenamiento masivo asociado (el punto de montaje debe contener MICROBIT), y ejecuta el siguiente comando:
::
$ btlejack -i
Esto programará cada dispositivo Micro:Bit conectado a tu computadora y los dejará listos para usar con Btlejack. Usará la versión de firmware correcta para el software cliente actual, por lo que se recomienda encarecidamente realizar este procedimiento de instalación de firmware cada vez que actualices Btlejack.
Si estás usando un sniffer Bluefruit LE o un Kit de evaluación nRF51822, entonces usa un programador SWD externo para flashear tu dispositivo con este firmware <https://github.com/virtualabs/btlejack-firmware/raw/master/dist/btlejack-firmware-ble400.hex>_.
Mantén tus dispositivos conectados y ¡listo!
NOTA Esto solo funciona con sistemas compatibles con POSIX.
Usar Btlejack es bastante fácil. Btlejack puede:
Btlejack normalmente intenta autodetectar y usar dispositivos compatibles conectados (solo Micro:Bit por el momento), pero dado que el firmware puede ser hackeado o modificado para funcionar con otras placas basadas en nRF51822, proporciona una opción específica para permitir la compatibilidad con estos dispositivos.
La opción -d te permite especificar uno o más dispositivos con Btlejack. Ten en cuenta que esta opción deshabilitará la detección automática de dispositivos, y deberías agregar tantos dispositivos como necesites:
::
$ btlejack -d /dev/ttyACM0 -d /dev/ttyACM2 -s
Primero, encuentra una conexión existente para atacar con btlejack:
::
$ btlejack -s BtleJack version 1.1
[i] Enumerating existing connections ... [ - 54 dBm] 0xcd91d517 | pkts: 1 [ - 46 dBm] 0xcd91d517 | pkts: 2
El primer valor (en dBm) muestra la potencia de la señal, cuanto mayor sea este valor, mejor será la conexión esnifada.
El segundo valor (hex) es la dirección de acceso asociada, un valor de 32 bits que identifica un enlace entre dos dispositivos compatibles con Bluetooth Low Energy.
El último valor es el número de paquetes vistos con esta dirección de acceso. Cuanto mayor sea este valor, más probable será que la dirección de acceso correspondiente esté en uso.
Luego, usa la opción -f para seguir una conexión específica:
::
$ btlejack -f 0xdda4845e BtleJack version 1.1
[i] Detected sniffers:
Sniffer #0: fw version 1.1
[i] Synchronizing with connection 0xdda4845e ... ✓ CRCInit: 0x2a035e ✓ Channel Map = 0x1fffffffff ✓ Hop interval = 39 ✓ Hop increment = 15 [i] Synchronized, packet capture in progress ... LL Data: 02 07 03 00 04 00 0a 03 00 LL Data: 0a 08 04 00 04 00 0b 5a 69 70 LL Data: 02 07 03 00 04 00 0a 03 00 LL Data: 0a 08 04 00 04 00 0b 5a 69 70
Si estás usando más de 1 microbit, Btlejack paralelizará algunas de las operaciones de esnifado para acelerar la recuperación de los parámetros de conexión.
La opción -c soportada por btlejack te permite especificar la dirección BD objetivo, o puedes usar any para capturar cualquier nueva conexión creada.
::
$ btlejack -c any BtleJack version 1.1
[i] Detected sniffers:
Sniffer #0: version 1.1 Sniffer #1: version 1.1 LL Data: 05 22 df b4 6f 95 c5 55 c0 0a f6 99 23 40 1d 7b 2f 0a 9a f4 93 01 12 00 27 00 00 00 d0 07 ff ff ff ff 1f 0b [i] Got CONNECT_REQ packet from 55:c5:95:6f:b4:df to 40:23:99:f6:0a:c0 |-- Access Address: 0x0a2f7b1d |-- CRC Init value: 0x93f49a |-- Hop interval: 39 |-- Hop increment: 11 |-- Channel Map: 1fffffffff |-- Timeout: 20000 ms
LL Data: 03 09 08 0f 00 00 00 00 00 00 00 LL Data: 03 09 08 0f 00 00 00 00 00 00 00 LL Data: 0b 06 0c 08 0f 00 09 41 LL Data: 03 06 0c 07 1d 00 d3 07
o también puedes especificar la dirección BD objetivo:
::
$ btlejack -c 03:e1:f0:00:11:22
Una vez que una conexión es identificada por su dirección de acceso, puedes interferirla usando la opción -j:
::
$ btlejack -f 0x129f3244 -j̀
Btlejack también puede secuestrar una conexión existente, usa la opción -t para hacerlo. Una vez secuestrada, Btlejack te dará un prompt que te permitirá interactuar con el dispositivo secuestrado.
Primero, secuestra una conexión existente:
::
$ btlejack -f 0x9c68fd30 -t -m 0x1fffffffff BtleJack version 1.1
[i] Using cached parameters (created on 2018-08-11 01:48:24) [i] Detected sniffers:
Sniffer #0: fw version 1.1
[i] Synchronizing with connection 0x9c68fd30 ... ✓ CRCInit: 0x81f733 ✓ Channel map is provided: 0x1fffffffff ✓ Hop interval = 39 ✓ Hop increment = 9 [i] Synchronized, hijacking in progress ... [i] Connection successfully hijacked, it is all yours \o/ btlejack>
Luego usa los siguientes comandos para interactuar con el dispositivo:
Comando discover ^^^^^^^^^^^^^^^^^^
El comando discover enviará y recibirá paquetes Bluetooth LE y recuperará todos los UUID de servicios y parámetros, así como los UUID de características y parámetros:
::
btlejack> discover start: 0001 end: 0005 start: 0014 end: 001a start: 0028 end: ffff Discovered services: Service UUID: 1801 Characteristic UUID: 2a05 | handle: 0002 | properties: indicate (20) \ value handle: 0003
Service UUID: 1800 Characteristic UUID: 2a04 | handle: 0019 | properties: read (02) \ value handle: 001a
Characteristic UUID: 2a00 | handle: 0015 | properties: read (02) \ value handle: 0016
Characteristic UUID: 2a01 | handle: 0017 | properties: read (02) \ value handle: 0018
Service UUID: 1824 Characteristic UUID: 2abc | handle: 0029 | properties: write indicate (28) \ value handle: 002a
Comando read ^^^^^^^^^^^^^^
El comando read acepta un solo parámetro, el manejador de valor correspondiente a la característica de la que deseas leer:
::
btlejack> read 0x16 read>> 4c 47 20 77 65 62 4f 53 20 54 56
Comando write ^^^^^^^^^^^^^^^
El comando write acepta tres parámetros:
::
btlejack> write
Formatos de datos soportados:
hex: datos hexadecimales (ej. "414261")str: cadena de texto, puede estar encapsulada entre comillas doblesComando ll ^^^^^^^^^^^^
Este último comando te permite enviar PDU de la capa de enlace de Bluetooth Low Energy, en formato hexadecimal, como se especifica en el Volumen 6, Parte B, Capítulo 2.4.
Una característica interesante de Btlejack es la posibilidad de exportar los datos capturados a un archivo PCAP.
Btlejack soporta los siguientes formatos DLT:
El archivo de salida puede especificarse mediante la opción -o, mientras que el formato de salida puede especificarse con la opción -x. Los valores de formato válidos son: ll_phdr, nordic, o pcap (por defecto).
::
$ btlejack -f 0xac56bc12 -x nordic -o capture.nordic.pcap
El tipo de exportación ll_phdr es útil al esnifar una conexión cifrada, ya que también es compatible con crackle <https://github.com/mikeryan/crackle>_. Así que si quieres esnifar y romper conexiones cifradas, esta es la opción a seguir.
También es posible que necesites indicar a crackle que use una estrategia de descifrado específica, mediante la opción -s:
::
$ crackle -i some.pcap -s 1
Btlejack utiliza una caché de conexión para almacenar algunos valores relacionados con la conexión con el fin de acelerar las cosas. Esta caché de conexión puede causar algunos problemas, especialmente si una dirección de acceso ha sido vista previamente.
Esta caché se puede vaciar con la opción -z:
::
$ btlejack -z
Btlejack 2.0 introduce una nueva opción -w que te permite especificar una ruta FIFO (existente o no) para realizar un análisis en vivo de paquetes:
::
$ btlejack -c any -w /tmp/blepipe
Incluso puedes usar un FIFO y un archivo de salida al mismo tiempo:
::
$ btlejack -c any -w /tmp/blepipe -o blepackets.pcap
Si has habilitado previamente ethernet virtual sobre USB (RNDIS), por ejemplo, para configurar una Raspberry Pi Zero W a través de USB, debes deshabilitarlo nuevamente (es decir, elimina dtoverlay=dwc2 de boot/config.txt y modules-load=dwc2,g_ether de boot/cmdline.txt, luego sudo reboot), porque esto interferiría con las conexiones USB de los sniffer.
Esta versión es compatible con las versiones 5 y 5.1 de Bluetooth Low Energy y especialmente con el nuevo algoritmo de selección de canal introducido en la versión 5 (CSA #2). Sin embargo, dado que el hardware utilizado no soporta los dos nuevos PHY agregados desde la versión 5, solo podrá esnifar, interferir y quizás secuestrar conexiones que utilicen el PHY sin codificar de 1 Mbps.
Ten en cuenta también que la implementación actual de CSA #2 incluida en Btlejack no admite actualizaciones del mapa de canales, por el momento.
Btlejack detecta automáticamente el algoritmo de selección de canal utilizado, por lo que no tienes que preocuparte y solo capturar paquetes como de costumbre.
Esnifar una conexión BLE 5 existente (que utiliza el PHY sin codificar de 1 Mbps, y solo este PHY) no es tan difícil. Primero, debes especificar que deseas atacar una conexión BLE 5, utilizando la opción -5. Ten en cuenta que no hay forma de saber si una conexión existente utiliza CSA #2 o CSA #1, por lo que debes probar ambas técnicas hasta que una funcione.
::
$ btlejack -f 0x11223344 -5
Btlejack recuperará entonces el mapa de canales utilizado y luego el valor del intervalo de salto:
::
$ btlejack -f 0x11223344 -5 [i] Synchronizing with connection 0x11223344 ... ✓ CRCInit: 0x40d64f ✓ Channel Map = 0x1fffffffff ✓ Hop interval = 160
Luego intentará recuperar el valor del contador PRNG de esta conexión:
::
$ btlejack -f 0x11223344 -5 [i] Synchronizing with connection 0x11223344 ... ✓ CRCInit: 0x40d64f ✓ Channel Map = 0x1fffffffff ✓ Hop interval = 160 ✓ CSA2 PRNG counter = 5137 [i] Synchronized, packet capture in progress ...
Una vez hecho esto, Btlejack está sincronizado con esta conexión y procesará los paquetes como de costumbre.
Aquí no hay nada nuevo, excepto que debes especificar que estás atacando una conexión BLE 5, usando la opción -5.
Ten en cuenta que puedes optimizar este ataque especificando también el mapa de canales y el valor del intervalo de salto a utilizar, usando respectivamente las opciones -m y -p. Ambos DEBEN ser proporcionados, de lo contrario no funcionará.
No he logrado secuestrar una conexión BLE 5 en este momento, ya que este ataque es sensible al tiempo. Mis dispositivos BLE 5 usan una latencia de 0, lo que no permite ningún retraso y hace que este ataque falle.
Cuando consiga algunos dispositivos BLE 5 legítimos, mejoraré esto.