
Preuve de concept et analyse montrant comment récupérer le SSID et le mot de passe Wi-Fi d'un interrupteur intelligent D-Link Komfy via BLE en rétro-ingénierie de l'encodage base64 personnalisé de l'application iOS.
Intro
Ce rapport détaillera ma découverte sur l'interrupteur Komfy avec caméra de D-Link pour récupérer le SSID et le mot de passe Wi-Fi associés à l'appareil via Bluetooth 4.0 (BLE). L'interrupteur Komfy est un produit de sécurité et d'automatisation domestique qui peut remplacer un interrupteur mural chez vous pour fournir une vidéosurveillance, le suivi de la température, des niveaux d'humidité, de la qualité de l'air, et la commande à distance des interrupteurs d'éclairage.
Profilage Bluetooth BLE
Un profilage rapide du périphérique BLE a été effectué avec l'application iOS LightBlue avant de décider d'aller plus loin. À ce stade, l'appareil Komfy était en ligne et configuré avec des paramètres d'utilisation typiques. En connectant Komfy avec LightBlue, j'ai remarqué un service GATT non standard révélant huit caractéristiques (ou fonctions) personnalisées. Deux de ces caractéristiques recevaient une quantité de données inhabituelle, sachant que 20 octets est le maximum selon la spécification BLE. Si le périphérique et le maître prennent tous deux en charge une MTU plus élevée, celle-ci peut être négociée pour permettre ce que l'on appelle communément des lectures ou écritures « longues ». Les premières captures d'écran ci-dessous montrent les services et caractéristiques GATT (de 0xB002 à 0xB00A). Les deux captures suivantes montrent les deux caractéristiques sur lesquelles ce rapport se concentre (0xB006 et 0xB007). Les caractéristiques 0xB006 et 0xB007 affichaient le SSID Wi-Fi et ce qui semblait être une chaîne encodée en base64 après décodage en ascii. Cependant, le décodage base64 de la chaîne n'a révélé aucune donnée lisible, comme illustré dans la dernière capture d'écran.
L'application Komfy : trace des appels de méthodes
Pour mieux comprendre les caractéristiques GATT implémentées par le périphérique Komfy, j'ai extrait les méthodes de l'application iOS Komfy à l'aide de class-dump-z et configuré le tracing des méthodes d'intérêt. Le dump de classe complet est disponible ici. Je m'intéressais particulièrement à la classe BLEDevice ainsi qu'à toute autre méthode faisant référence au Bluetooth. Le tracing de méthodes peut être configuré à l'aide du script Perl Logify.pl détaillé par Prateek ici.
La capture d'écran ci-dessus montre la sortie du tracing de méthodes lors d'une nouvelle installation et configuration de Komfy. Remarquez le mot de passe Wi-Fi "chipotlemakesmehappy" en clair, puis cette chaîne à l'allure base64 que l'application LightBlue avait récupérée depuis la caractéristique GATT 0xB007 vue précédemment. Le tracing montre en réalité un appel à la méthode +[Base64 encode:], ce qui a d'abord semé la confusion étant donné que la chaîne ne pouvait pas être décodée en base64 avec une bibliothèque standard. On a presque conclu que la valeur décodée en base64 était chiffrée ou encodée davantage, jusqu'à ce qu'on réalise que +[Base64 encode:] était une méthode implémentée de manière privée (et non issue de la classe NSData). Cet encodage farfelu devait être élucidé.
Désassemblage avec Hopper
Passons à la rétro-ingénierie du schéma d'encodage « base64 » implémenté par D-Link (« rétro-ingénierie » fait paraître cela bien plus difficile que ce ne l'était en réalité vu le résultat final). Charger l'application Komfy dans Hopper et analyser les méthodes -[BLEDevice getWifiPassword:] et +[Base64 decode:] étaient les points de départ évidents. L'analyse de -[BLEDevice getWifiPassword:] a confirmé que la caractéristique GATT 0xB007 récupérait effectivement le mot de passe Wi-Fi.
En parcourant l'assemblage ARM de +[Base64 decode:], il ressemblait beaucoup à l'implémentation standard de la classe NSData, alors j'ai basculé pour examiner +[Base64 encode:]. Hopper m'a rapidement mis sur la piste. Une constante de chaîne apparaissait près d'une des instructions assembleur, contenant toutes les lettres de l'alphabet base64 standard, mais complètement dans le désordre. Légèrement embarrassé de ne pas avoir pensé à une substitution triviale pas plus compliquée que le chiffre de César original, j'ai écrit un script pour démêler les caractères base64 et voilà ! "chipotlemakesmehappy" s'est affiché à l'écran.
Donc, en résumé, voici comment démêler puis décoder en base64 la chaîne :

Le script autopwn complet ici.
Et oui, Chipotle me rend vraiment heureux.
La capture BLE Ubertooth peut être téléchargée ici.