
Prueba de concepto e informe que muestran cómo recuperar el SSID/contraseña de Wi-Fi de un interruptor inteligente D-Link Komfy a través de BLE mediante ingeniería inversa de la codificación base64 personalizada de la aplicación iOS.
Introducción
Este writeup detallará mi hallazgo en el Komfy Switch with Camera de D-Link para recuperar el SSID y la contraseña wifi asociados al dispositivo a través de bluetooth 4.0 (BLE). El Komfy switch es un producto de seguridad y automatización para el hogar que puede reemplazar un interruptor de pared para proporcionar videovigilancia, monitoreo de temperatura, niveles de humedad, calidad del aire y control remoto de interruptores de luz.
Perfilado de Bluetooth BLE
Se realizó un perfilado rápido del dispositivo BLE con la aplicación LightBlue para iOS antes de decidir profundizar más. En ese momento, el dispositivo Komfy estaba en línea y configurado con los ajustes típicos de uso. Al conectarme a Komfy con LightBlue, noté un servicio GATT no estándar que revelaba ocho características (o funciones) personalizadas. Un par de esas características recibían una cantidad inusual de datos, considerando que 20 bytes es el máximo según la especificación BLE. Si tanto el dispositivo periférico como el maestro lo soportan, se puede negociar una MTU más alta para admitir lo que comúnmente se conoce como lecturas o escrituras "largas". Las primeras capturas de pantalla muestran los servicios y características GATT (desde 0xB002 hasta 0xB00A). Las dos siguientes capturas muestran las dos características en las que se centrará este writeup (0xB006 y 0xB007). La característica 0xB006 mostró el SSID de wifi y la 0xB007 mostró lo que parecía ser una cadena codificada en base64 después de decodificarla a ascii. Sin embargo, decodificar la cadena en base64 no reveló ningún dato legible, como se ilustra en la última captura.
La app Komfy: Trazado de llamadas a métodos
Para comprender mejor las características GATT implementadas por el dispositivo Komfy, volqué los métodos de la app iOS de Komfy usando class-dump-z y configuré el trazado de métodos para los métodos de interés. El volcado de clases completo se puede consultar aquí. Me interesaba particularmente la clase BLEDevice junto con cualquier otro método que hiciera referencia a bluetooth. El trazado de métodos puede configurarse usando el script perl Logify.pl detallado por Prateek aquí.
La captura de pantalla anterior muestra la salida del trazado de métodos durante una instalación y configuración nuevas de Komfy. Obsérvese la contraseña wifi "chipotlemakesmehappy" en texto claro y luego esa cadena con aspecto de base64 que la app LightBlue recuperó de la característica GATT 0xB007 vista antes. El trazado muestra en realidad una llamada al método +[Base64 encode:], lo que causó confusión al principio dado que no podía decodificarse en base64 con una biblioteca estándar. Casi se determinó que el valor decodificado en base64 estaba cifrado o codificado aún más, hasta que se comprendió que +[Base64 encode:] era un método implementado de forma privada (no de la clase NSData). Había que lidiar con esta codificación extraña.
Desensamblaje con Hopper
Ahora, a la ingeniería inversa del esquema de codificación "base64" implementado por D-Link (la "ingeniería inversa" hace que suene mucho más difícil de lo que realmente fue, dado el resultado final). Cargar la app de Komfy en Hopper y analizar los métodos -[BLEDevice getWifiPassword:] y +[Base64 decode:] fueron los puntos de partida obvios. El análisis de -[BLEDevice getWifiPassword:] confirmó que la característica GATT 0xB007 estaba efectivamente recuperando la contraseña wifi.
Al revisar el ensamblador ARM de +[Base64 decode:] parecía bastante similar a la implementación estándar de la clase NSData, así que salté a revisar +[Base64 encode:]. Hopper rápidamente me dio la pista de la respuesta. Una constante de cadena se mostraba cerca de una de las instrucciones de ensamblador e incluía todas las letras del alfabeto base64 estándar, pero completamente desordenadas. Un poco avergonzado por no haber pensado en una sustitución trivial no más difícil que el cifrado César original, escribí un script para descifrar el orden de los caracteres base64 y ¡viola! "chipotlemakesmehappy" se imprimió en la pantalla.
Así que, esencialmente, así es como se descifra y decodifica la cadena en base64:

El script autopwn completo aquí.
Y, sí, Chipotle realmente me hace feliz.
La captura de Ubertooth BLE se puede descargar aquí.