Figura 1: BluedIoT: Cómo hackear 360Fly Action Cameras usando BlueTooth Low Energy |
No os la voy a “vender” ni cómo la mejor, ni cómo la peor, simplemente se ceñía a nuestras necesidades. El producto nos satisfacía y cumplía con lo que leímos, pero algún “ángulo muerto” se ocultaba en ella.
El misterio de la password de la cámara
Un día, después de terminar una sesión de grabación, mi amigo David me pidió la cámara para pasar-se los vídeos directamente por USB en lugar de transferir-los por la red, ya que al grabar en 360 y resolución 4K, hace que aumente considerablemente el peso de los clips. Cuando la tuve de nuevo en mis manos, algo raro vi que me descuadró. Un pop-up en la app me decía que la “password” era incorrecta, y yo no la había cambiado.
Figura 2: Alerta de contraseña erronea |
Le pregunté a mi amigo David si la había cambiado él, a lo que me dijo que no, que intentó con la app mediante conexión Wi-Fi, Bluetooth, pero nada, y que fue el cable USB el que logró hacer las “paces” con los datos, y la transferencia prosiguió. ¿Qué hace uno cuando el método tradicional no funciona antes de hacer un reset? Pues probar y ver que otros recursos tenía, a lo que me dije, voy a ver si puedo cambiarla (mediante la app oficial para Android), seguro que me dirá que no… ¡ahí va!
Figura 3: Cambiando la contraseña desde la app oficial de Android |
Se la tragó con patatas, inserté una nueva y como si nada. Aí fue cuando pensé que o me quedo con la intriga o investigo, y como me conozco opté por resolver el enigma que me tenía absorto. Durante el “shock” y la incomprensión, me vino un flash sobre un proyecto que se mantuvo un tiempo “top secret” de Chema Alonso y su equipo de ElevenPaths, el ya popular DirtyTooh Hack, que me inspiró para seguir con esto.
Un punto clave era la conexión Bluetooth, ya que cuando la password fue cambiada no se hizo por Wi-Fi, sino por Bluetooth, así que, teniendo eso en cuenta, lo primero era empezar por esta tecnología y el rol que ejerce en este modelo de cámara.
Aprendiendo del enemigo por BlueTooth
A nivel de usuario entendía lo justo, pero tenía cero experiencia en analizar nada con Bluetooth. Me tocaba hacer de “dentista” y sacar “la caries azulada”. Indagando, en busca de algún tipo de sniffer, me topé con Ubertooth One. Esa no era mi parada ya que me estaba pasando de largo. no digo que sea una mala herramienta pero no era la adecuada para lo que necesitaba yo con mi experiencia en el tema. Buscando más, vi que tenía el sniffer más cerca de lo que pensaba. Resulta que el propio sistema operativo Android, a partir de la versión 4.4 ya incorpora un sniffer de tipo activo (es decir, en una conexión controlada/vinculada o pareada).
Figura 4: Activando el log de conexión BlueTooth en Android |
Se activa en las opciones del desarrollador, y se genera un fichero con nombre btsnoop_hci.log (que en mi caso lo guardaba en la raíz de la memoria del terminal). Tras activarlo me puse a cambiar otra vez la password para luego dar una ojeada en Wireshark, y hacer una búsqueda por la palabra que había puesto como nueva contraseña.
Figura 5: Paquete BlueTooth con la password enviada en texto claro |
En la imagen se puede ver la password en claro a ASCII. ¡BINGO! Lo tenemos. ¿¡Y ahora qué!?¿Cómo interactúo y con qué? Esos paquetes capturados se trataban de una versión de BlueTooth más moderna, por así decirlo, se trata del Bluetooth Low Energy. Esta variante de Bluetooth, empieza a partir de la versión 4.0. Diseñado para reducir el consumo de energía en comparación con la versión antigua y nacido para adaptarse en el mundo del IoT. Funciona algo distinto al Bluetooth “clásico”. Se basa en una estructura de GATT: Generic Attribute Profile para la transferencia de datos.
Figura 6: Estructura GATT |
Su organización se estipula en: perfiles, servicios y características.
1.-Perfil: Describe el tipo de dispositivo basado en sus servicios.
2.-Servicio: Define función/es del dispositivo, un servicio tiene una colección de características.
3.- Característica: Contiene un valor y se utiliza para el transporte de los datos. Contiene también propiedades para controlar el comportamiento de la característica (lectura, escritura, notificación) para designar los permisos adecuados, y los descriptores para describir en más detalle mediante línea/s de texto tipo string.
Los servicios y las características tienen un UUID para ser identificados. Bluetooth SIG (Special Interest Group) usa 16 bits del UUID para la especificación de sus nombres como normativa. 128 bits son personalizados, destinados para el fabricante. 360Fly tiene su distintivo como miembro aprobado, usando 16 bits de su UUID como servicio.
Otro valor valioso es el handle, de 16 bits y usado para ser distinguido en el servidor GATT (en la cámara) y va asociado con un UUID en cada una de las características, como si se tratase de un alias cortito para facilitar su uso. Los servicios tienen un rango de handles, este rango se asocia sólo a un UUID (un servicio conlleva un rango e identificado por un UUID) así pues, podremos saber a qué servicio pertenece dicha característica handle. Vamos a clarificarlo en la práctica de manera visual junto a la siguiente figura.
Figura 7: Estructura con la herramienta gatttool |
En los servicios (= primary) tenemos un handle, que empieza por 0x0001 y acaba en 0x0005. Este servicio, llamado “Generic Attribute”, tiene el UUID 1801. El UUID de la característica con nombre “Service Changed” es 2a05 con handle 0x0003, este handle está comprendido en el rango que va desde 0x0001 a 0x0005. En definitiva, la característica “Service Changed” forma parte del servicio “Generic Attribute”. Más claro así, ¿verdad?
PoC en acción
Ya va siendo hora de ponerse manos a la obra, viendo por donde van “los tiros”. Veamos cómo manejarlo bajo Kali Linux. Se puede hacer por la propia app cómo método más fácil para el PoC, pero desde escritorio aporta otras cosas. El resumen de lo que haremos es:
1. Cambiar la password de la Wi-Fi mediante Bluetooth Low Energy.
2. Tomar una foto y guardarla (para el recuerdo ;) ).
3. ¡Borrarlo todo! (simulando que no se deja huella).
(Nota: Importante tener en cuenta de que se use Bluetooth mínimo versión 4.0 Low Energy para que funcione, si no se está seguro, revisad con el comando hciconfig –a
Fase 1: Cambiando la Password
Ponemos en pie la pila Bluetooth con: systemctl enable bluetooth.service y systemctl start bluetooth.service.
Figura 8: Activando BlueTooth con Kali Linux |
Verificamos que todo esté correcto como puede verse en la figura siguiente con hciconfig
Figura 9: Revisando el estado del hardware BlueTooth |
Escaneo en busca de la cámara con hcitool lescan.
Figura 10: Buscando la cámara 360 con BlueTooth LE |
Convertir la password en formato hexadecimal (que usaremos más tarde) con: echo StrongPassword | xxd –p
Figura 11: ASCII a HEX de la password |
Conectar con la cámara mediante gatttool a modo interactivo: gatttool –I y connect . Como veis, no requiere de password, el método de conexión es “Just Works”. ¡Qué fácil!, ¿no? Eso mismo pensé yo.
Figura 12: Conectando a la cámara con gatttool |
Ahora toca cambiar el password con el handle que ya sabemos porque “snifamos” dicho paquete anteriormente: char-write-cmd 0x0048
Figura 13: Cambio de password mediante ghatttool |
Fase 2. Tomando foto y guardándola
Figura 14: Navegando por el Web Server de la cámara |
Figura 15: Tomando la foto con cliente ReST. |
En este caso se utiliza:
-X: para indicarle el tipo de método de solicitud POST en este caso.
–insecure: lo mismo que –k para saltar la verificación de certificado que no tenemos en el almacén de confianza.
Podemos añadir de manera opcional –i o –include para obtener la información de las cabeceras.
Para saber si ha ido bien, verificaremos refrescando el navegador, aparecerá un nuevo .JPG con prefijo “FLY” y pulsando encima, podremos ver nuestro retrato:
Figura 16: Mostrando la foto |
Fase 3. Borrándolo todo
Figura 17: Eliminando el contenido de la cámara |
Bonus Track
Figura 18: Algunas de las funciones bajo BlueTooth y Wi-Fi de la cámara |
Figura 20: CVE-2017-8403 del bug de360fly 4K |
Y aquí un vídeo que también realicé, con lo que hemos expuesto en este artículo, con un aire un tanto cinéfilo para darle un poco de entusiasmo.
Reflexiones Finales
Autor: Gerard Fuguet
FUENTE