02 octubre 2015

Seguridad Bluetooth: Instalando Ubertooth en Kali Linux 2.0.0


El proyecto Ubertooth es una plataforma de desarrollo de código abierto, con componentes tanto hardware como software, que permite experimentar y profundizar en la seguridad de las tecnologías inalámbricas Bluetooth. Ubertooth proporciona capacidades de captura e inyección de tráfico, y dispone tanto de un sniffer para BLE (Bluetooth Low Energy o Bluetooth Smart) como para las conexiones Bluetooth clásicas que emplean el estándar de trasmisión básico (o Basic Rate, BR).

El proyecto Ubertooth está constituido por tres componentes:
  • Dispositivo hardware Ubertooth One, que se puede construir (al ser un proyecto hardware de código o diseño abierto) o comprar. Su potencia de transmisión y sensibilidad de recepción son similares a las de un dispositivo Bluetooth de Clase 1.
  • Firmware: Software que ejecuta en el procesador ARM del propio Ubertooth One, compuesto por el gestor de arranque (bootloader) y el firmware de recepción y transmisión de Bluetooth (bluetooth_rxtx).
  • Software (o host code): Software que ejecuta en un ordenador de propósito general (por ejemplo, Linux) al que está conectado el Ubertooth One mediante un puerto USB. 

El proyecto Ubertooth estaba disponible originalmente en Sourceforge, pero se ha movido a GitHub. La documentación oficial está disponible en el Wiki, dónde se dispone tanto de la guía de instalación como, adicionalmente, de las instrucciones para actualizar el firmware del dispositivo Ubertooth One.

La última versión de Ubertooth disponible en la actualidad es la 2015-09-R2, vinculada a la librería libbtbb, una librería de decodificación de la banda base de Bluetooth (Bluetooth Baseband, btbb), identificada con el mismo número de versión.

Instalación del proyecto Ubertooth en Kali Linux 2.0.0

El proyecto Ubertooth tiene numerosas dependencias o prerrequisitos necesarios para su instalación. Las siguientes instrucciones hacen uso de Kali Linux 2.0.0 como plataforma para instalación de la última versión de Ubertooth disponible, 2015-09-R2, ya sea directamente en un sistema real o en una máquina virtual.

En primer lugar se debe actualizar Kali Linux 2.0.0 con las últimas versiones de los paquetes y aplicaciones existentes por defecto en Kali Linux mediante los dos comandos siguientes:
$ sudo apt-get update
$ sudo apt-get dist-upgrade

A continuación se deben instalar todas las dependencias de Ubertooth. Este proceso se puede llevar a cabo manualmente, o automatizarse mediante un script (referenciado posteriormente):
$ sudo apt-get install cmake libusb-1.0-0-dev make gcc g++ libbluetooth-dev pkg-config libpcap-dev python-numpy python-pyside python-qt4

Es necesario instalar previamente la librería libbtbb para que las herramientas de Ubertooth puedan decodificar paquetes Bluetooth (por defecto, en "/usr/local/lib/libbtbb.so"), junto al fichero de cabeceras ("/usr/local/include/btbb.h") y a la herramienta "btapbtap" (bajo "/usr/local/bin"), un sniffer para teclados Bluetooth:
$ wget https://github.com/greatscottgadgets/libbtbb/archive/2015-09-R2.tar.gz -O libbtbb-2015-09-R2.tar.gz
$ tar xf libbtbb-2015-09-R2.tar.gz
$ cd libbtbb-2015-09-R2
$ mkdir build
$ cd build
$ cmake ..
$ make
$ sudo make install

NOTA: Si se desea instalar libbtbb en una ubicación diferente se podría hacer uso del siguiente comando, en lugar de utilizar simplemente "cmake ..":
$ cmake -DINSTALL_DIR=/path/to/install -DINCLUDE_DIR=/path/to/include ..

A continuación se deben instalar las herramientas de Ubertooth, que incluyen (entre otros) el software para la captura de tráfico Bluetooth (referenciado como host code), para configurar el dispositivo Ubertooth y para actualizar el firmware:
$ wget https://github.com/greatscottgadgets/ubertooth/releases/download/2015-09-R2/ubertooth-2015-09-R2.tar.xz -O ubertooth-2015-09-R2.tar.xz
$ tar xf ubertooth-2015-09-R2.tar.xz
$ cd ubertooth-2015-09-R2/host
$ mkdir build
$ cd build
$ cmake ..
$ make
$ sudo make install
$ sudo ldconfig

Este paso instalará la librería "/usr/local/lib/libubertooth.so", junto a nuevos ficheros de cabeceras (bajo "/usr/local/include/ubertooth*.h") y múltiples herramientas bajo "/usr/local/bin/ubertooth*". Adicionalmente se instalará el fichero de reglas de detección y acceso al dispositivo Ubertooth One (y Zero), tanto en modo de funcionamiento estándar como DFU (Device Firmware Upgrade) bajo "/etc/udev/rules.d/40-ubertooth.rules".

NOTA: Los comandos de la presente guía (instalación y uso) pueden ser ejecutados como "root", opción desaconsejada desde el punto de vista de seguridad ;-) Sin embargo, las reglas de Ubertooth creadas permiten el acceso al dispositivo por parte de cualquier usuario perteneciente al grupo "plugdev".

Instalación del plugin de Ubertooth para Kismet

La versión de Kismet disponible por defecto en Kali Linux 2.0.0 es la "2013-03-R0":
$ kismet -v 
Kismet 2013-03-R0

Para poder hacer uso de Ubertooth en Kismet es necesario compilar Kismet a partir de su código fuente, incluyendo todas las dependencias necesarias:
$ sudo apt-get install libpcap0.8-dev libcap-dev pkg-config build-essential libnl-dev libncurses-dev libpcre3-dev libpcap-dev libcap-dev
$ wget https://kismetwireless.net/code/kismet-2013-03-R1b.tar.xz
$ tar xf kismet-2013-03-R1b.tar.xz
$ cd kismet-2013-03-R1b
$ ln -s ../ubertooth-2015-09-R2/host/kismet/plugin-ubertooth .
$ ./configure
$ make dep && make && make plugins
$ sudo make suidinstall
$ sudo make plugins-install

Como resultado se dispondrá del plugin de Ubertooth bajo "/usr/local/lib/kismet_client/ubertooth_ui.so".

Adicionalmente, es necesario añadir "pcapbtbb" a la línea "logtypes=..." en "/etc/kismet/kismet.conf" para que Kismet genere ficheros de log con el formato de captura de Bluetooth.

Instalación de los plugins de Ubertooth para Wireshark 

La versión de Wireshark disponible por defecto en Kali Linux 2.0.0 es la "1.12.6":
$ wireshark -v 
wireshark 1.12.6 … 

Por un lado, desde la versión 1.12 de Wireshark (en concreto desde la versión de desarrollo 1.12.0-rc2) se incluye por defecto el plugin de Ubertooth para BLE (Bluetooth Low Energy o Bluetooth Smart).

Por otro lado, los plugins de Ubertooth para BTBB (BlueTooth BaseBand) y BR/EDR (Basic Rate / Enhanced Data Rate), más nuevo, permiten analizar y diseccionar (o decodificar) desde Wireshark el tráfico de banda base Bluetooth que ha sido capturado mediante Kismet y las herramientas de Ubertooth, respectivamente.

En el caso de Kali Linux 2.0.0 (64 bits), el directorio de instalación indicado en "cmake" a través de "MAKE_INSTALL_LIBDIR" que corresponde con la ubicación de los plugins de Wireshark debe ser "/usr/lib/x86_64-linux-gnu/wireshark/plugins/1.12.6".

Para poder hacer uso de Ubertooth en Wireshark y, por ejemplo, analizar el tráfico generado por Kismet, es necesario compilar los dos plugins de Bluetooth a partir de su código fuente, incluyendo todas las dependencias necesarias, aparte del resto de herramientas de Ubertooth y de la librería libbtbb.

NOTA: Antes de llevar a cabo los siguientes pasos es necesario consultar los detalles del siguiente apartado, debido a la existencia de un conflicto en los plugins de Ubertooth para Wireshark.

En primer lugar, debe instalarse el plugin BTBB:
$ sudo apt-get install wireshark wireshark-dev libwireshark-dev cmake
$ cd libbtbb-2015-09-R2/wireshark/plugins/btbb
$ mkdir build
$ cd build
$ cmake -DCMAKE_INSTALL_LIBDIR=/usr/lib/x86_64-linux-gnu/wireshark/plugins/1.12.6 ..
$ make
$ sudo make install

A continuación, debe instalarse el plugin Bluetooth (BT) BR/EDR:
$ sudo apt-get install wireshark wireshark-dev libwireshark-dev cmake
$ cd libbtbb-2015-09-R2/wireshark/plugins/btbredr
$ mkdir build
$ cd build
$ cmake -DCMAKE_INSTALL_LIBDIR=/usr/lib/x86_64-linux-gnu/wireshark/plugins/1.12.6 ..
$ make
$ sudo make install

Este proceso instalará los plugins "btbb.so" y "btbredr.so" en el directorio de plugins de Wireshark indicado previamente.

Conflicto de nombres duplicados en los plugins de Ubertooth para Wireshark

Ambos plugins actualmente (en la última versión oficial de libbtbb, 2015-09-R2) emplean el mismo nombre completo de plugin, "Bluetooth Baseband" y el mismo nombre corto, "BT Baseband" (aunque hacen uso de referencias diferentes para los filtros de visualización de tráfico, "btbb" y "btbredr"), por lo que es necesario modificar los mismos para poder utilizar Wireshark.

Una futura versión de libbtbb y de los plugins de Wireshark asociados evitará este conflicto, al disponerse ya de una solución (commit) en la última versión de libbtbb disponible en GitHub.

Sino se lleva a cabo ninguna modificación, al ejecutar Wireshark se obtiene el siguiente mensaje de error que indica que hay un nombre de protocolo duplicado en Wireshark para el tráfico de banda base Bluetooth:
$ wireshark & 
… 
Err Duplicate protocol name "Bluetooth Baseband"! This might be caused by an inappropriate plugin or a development error. 

Sin embargo, es posible evitarlo aplicando el parche asociado a ese commit concreto que soluciona el problema de nombres duplicados en los plugins de Ubertooth/libbtbb para Wireshark. El parche puede ser generado mediante Git:
$ mkdir Ubertooth-git 
$ cd Ubertooth-git/ 
$ git clone https://github.com/greatscottgadgets/libbtbb.git 
Cloning into 'libbtbb'... 
remote: Counting objects: 1460, done. 
remote: Compressing objects: 100% (4/4), done. 
remote: Total 1460 (delta 0), reused 0 (delta 0), pack-reused 1456 
Receiving objects: 100% (1460/1460), 415.78 KiB | 508.00 KiB/s, done. 
Resolving deltas: 100% (880/880), done. 
Checking connectivity... done. 
S cd libbtbb/ 
$ git format-patch -1 ae840325b61ad74181b079db288b4309ce96746b 0001-Fix-Ubertooth-issue-112-duplicate-plugin-names.patch 

Posteriormente, sólo es necesario copiar y aplicar ese parche sobre la versión 2015-09-R2 oficial de libbtbb antes de compilar e instalar los plugins:
$ cd libbtbb-2015-09-R2/ 
$ ls 0001-Fix-Ubertooth-issue-112-duplicate-plugin-names.patch 
… 
$ patch -p1 < 0001-Fix-Ubertooth-issue-112-duplicate-plugin-names.patch 
patching file wireshark/plugins/btbb/CMakeLists.txt 
patching file wireshark/plugins/btbb/packet-btbb.c 
patching file wireshark/plugins/btbb/packet-btbrlmp.c 
patching file wireshark/plugins/btbb/packet-btlmp.c 
patching file wireshark/plugins/btbredr/packet-btbredr.c

Automatizando el proceso de instalación del proyecto Ubertooth

Con el objetivo de automatizar el proceso de instalación de Ubertooth en Kali Linux 2.0.0, se ha publicado el siguiente script, "ubertooth_install.sh", en el repositorio GitHub de DinoSec.

Una vez se dispone de conexión a Internet, su ejecución automatiza todo el proceso de instalación de Ubertooth descrito previamente:
$ sudo ./ubertooth_install.sh

El parche previamente descrito está también disponible en el repositorio GitHub de DinoSec y ya es utilizado directamente por el script de instalación.

Instrucciones para actualizar el firmware del dispositivo Ubertooth One 

Tras obtener e instalar la última versión del software de Ubertooth disponible (proceso detallado previamente), se recomienda verificar la versión actual de firmware desde el modo estándar (no DFU), tras conectar el Ubertooth One a un puerto USB:
$ ubertooth-util -v 
Firmware revision: 2014-02-R2 
$ ubertooth-util -V
ubertooth 2014-02-R2 (dominicgs@mercury) Thu Feb 20 13:28:01 GMT 2014 

NOTA: En el caso de no disponer de una conexión USB suficientemente rápida, por ejemplo, al emplear un cable USB de mala calidad o especialmente al hacer uso de una máquina virtual, pueden obtenerse errores de temporización USB:
$ ubertooth-util -v
libUSB Error: Timeout: (-7)
Firmware revision: error: -7

Se recomienda encarecidamente utilizar el Ubertooth One directamente desde Linux empleando un ordenador físico y no hacer uso de una máquina virtual.

En el modo de funcionamiento estándar, por defecto, se encienden los leds verdes de 1V8 y RST, y el led rojo de USB:



Tras cambiar al directorio asociado al firmware, se recomienda hacer uso de la herramienta de actualización del firmware de Ubertooth, "ubertooth-dfu", para cambiar el Ubertooth One al modo DFU (Device Firmware Upgrade) y hacer una copia de seguridad del firmware instalado actualmente en el dispositivo:
$ cd ubertooth-2015-09-R2/
$ cd ubertooth-one-firmware-bin/
$ ls -l
total 228
-rwxrwxr-x 1 1000 inetsim 14732 Sep 5 13:44 assembly_test.bin
-rw-rw-r-- 1 1000 inetsim 41484 Sep 5 13:44 assembly_test.hex
-rwxrwxr-x 1 1000 inetsim 34344 Sep 5 13:44 bluetooth_rxtx.bin
-rw-rw-r-- 1 1000 inetsim 34360 Sep 5 13:44 bluetooth_rxtx.dfu
-rw-rw-r-- 1 1000 inetsim 96633 Sep 5 13:44 bluetooth_rxtx.hex
$ ubertooth-dfu -u bluetooth_rxtx.2014-02-R2.dfu -r
Switching to DFU mode
..................................................................................................................................................................
Detached
$ ls -l
-rw-r--r-- 1 dino dino 245760 Sep 29 11:44 bluetooth_rxtx.2014-02-R2.dfu

Posteriormente, se recomienda actualizar (o flashear) el nuevo firmware en el dispositivo:
$ ubertooth-dfu -d bluetooth_rxtx.dfu -r
Switching to DFU mode...
Checking firmware signature
.......................................................................................................................................
Detached
$ ubertooth-util -v
Firmware revision: 2015-09-R2
$ ubertooth-util -V
ubertooth 2015-09-R2 (dominicgs@hydrogen) Sat Sep 5 12:44:21 BST 2015

En el modo de funcionamiento DFU, por defecto, se encienden los leds verdes de 1V8 y RST, el led rojo de USB parpadea, y los leds de TX, RX y USR parpadean con un patrón de persecución secuencial.

La opción "-r" permite resetear el dispositivo y pasar del modo DFU al modo estándar tras completar la operación, mostrando el mensaje "Detached". Adicionalmente se puede desconectar y volver a reconectar el dispositivo, o llevar a cabo un reset del mismo mediante el comando "ubertooth-util -r".

Si te interesa la seguridad y el hacking ético de tecnologías inalámbricas, como Bluetooth y Wi-Fi, podrás profundizar mucho más, entre muchos otros temas, en el uso del Ubertooth One como un analizador de espectro básico, o emplearlo para la captura de tráfico Bluetooth y BLE desde Kismet o desde Wireshark, descubrir dispositivos Bluetooth ocultos o investigar la seguridad de cualquier dispositivo Bluetooth, como por ejemplo analizar el proceso de emparejamiento entre un Apple Watch y un iPhone, en el Curso online de Hacking Ético de Securízame, donde impartiré el módulo "Módulo V Hacking Ético de tecnologías inalámbricas: Bluetooth y Wi-Fi".

Colaboración por cortesía de Raúl Siles