
Proof-of-concept e writeup che mostrano come recuperare SSID/password Wi-Fi da uno smart switch D-Link Komfy tramite BLE, effettuando il reverse engineering della codifica base64 personalizzata dell'app iOS.
Intro
Questa analisi descrive la mia scoperta sul Komfy Switch with Camera di D-Link per recuperare l'SSID e la password WiFi associati al dispositivo via bluetooth 4.0 (BLE). Il Komfy switch è un prodotto per la sicurezza domestica e l'automazione che può sostituire un interruttore a muro in casa per fornire videosorveglianza, monitoraggio di temperatura, livelli di umidità, qualità dell'aria e controllo remoto degli interruttori della luce.
Profilazione Bluetooth BLE
Prima di approfondire, ho effettuato una rapida profilazione del dispositivo BLE con l'app iOS LightBlue. A questo punto, il dispositivo Komfy era online e configurato con tipiche impostazioni d'uso. Connettendomi a Komfy con LightBlue, ho notato un servizio GATT non standard che rivelava otto caratteristiche (o funzioni) personalizzate. Un paio di queste caratteristiche ricevevano una quantità insolita di dati, considerando che 20 byte è il massimo secondo la specifica BLE. Se sia il dispositivo periferico che quello master lo supportano, può essere negoziato un MTU più alto per supportare quelle che vengono comunemente chiamate letture o scritture "lunghe". Le prime schermate qui sotto mostrano i servizi e le caratteristiche GATT (da 0xB002 a 0xB00A). Le due schermate successive mostrano le due caratteristiche su cui si concentra questa analisi (0xB006 e 0xB007). La caratteristica 0xB006 e 0xB007 mostrava l'SSID WiFi e quella che sembrava essere una stringa codificata in base64 dopo averla decodificata in ascii. Tuttavia, decodificare la stringa in base64 non ha rivelato alcun dato leggibile, come illustrato nell'ultima schermata.
L'app Komfy: Tracciamento delle chiamate ai metodi
Per comprendere meglio le caratteristiche GATT implementate dal dispositivo Komfy, ho estratto i metodi dell'app iOS Komfy usando class-dump-z e ho impostato il tracing dei metodi per quelli di interesse. Il dump completo delle classi può essere consultato qui. Ero particolarmente interessato alla classe BLEDevice e a qualsiasi altro metodo che facesse riferimento al bluetooth. Il tracing dei metodi può essere configurato usando lo script perl Logify.pl descritto da Prateek qui.
La schermata sopra mostra l'output del tracing dei metodi durante una nuova installazione e configurazione di Komfy. Notate la password WiFi "chipotlemakesmehappy" in chiaro e poi di nuovo quella stringa dall'aspetto base64 che l'app LightBlue aveva recuperato dalla caratteristica GATT 0xB007 vista in precedenza. Il tracing mostra in realtà una chiamata al metodo +[Base64 encode:], che all'inizio ha causato confusione, dato che non poteva essere decodificata in base64 usando una libreria standard. Si era quasi concluso che il valore decodificato in base64 fosse cifrato o ulteriormente codificato, finché non ci si è resi conto che +[Base64 encode:] era un metodo implementato privatamente (non della classe NSData). Questa strana codifica doveva essere gestita.
Disassemblaggio con Hopper
Ora al reverse engineering dello schema di codifica "base64" implementato da D-Link (il termine "reverse engineering" lo fa sembrare molto più difficile di quanto non sia stato, visti i risultati finali). Caricare l'app Komfy in Hopper e analizzare i metodi -[BLEDevice getWifiPassword:] e +[Base64 decode:] sono stati i punti di partenza ovvi. L'analisi di -[BLEDevice getWifiPassword:] ha confermato che la caratteristica GATT 0xB007 recuperava effettivamente la password WiFi.
Esaminando l'assembly ARM di +[Base64 decode:], sembrava abbastanza simile all'implementazione standard della classe NSData, quindi sono passato a esaminare +[Base64 encode:]. Hopper mi ha subito messo sulla buona strada. Una costante stringa era stampata vicino a una delle istruzioni assembly e includeva tutte le lettere dell'alfabeto base64 standard, ma completamente fuori ordine. Lievemente imbarazzato per non aver pensato a una banale sostituzione non più difficile del cifrario di Cesare originale, ho scritto uno script per decifrare i caratteri base64 e voilà! "chipotlemakesmehappy" è apparso sullo schermo.
Quindi, in sostanza, ecco come decifrare e decodificare in base64 la stringa:

Lo script autopwn completo è qui.
E sì, Chipotle mi rende davvero felice.
La cattura BLE con Ubertooth può essere scaricata qui.