
Prova de conceito e artigo técnico mostrando como obter o SSID/senha de Wi-Fi de um smart switch D-Link Komfy via BLE, fazendo engenharia reversa da codificação base64 personalizada do aplicativo iOS.
Introdução
Este write-up detalha minha descoberta no Komfy Switch with Camera da D-Link para recuperar o SSID e a senha wifi associados ao dispositivo via Bluetooth 4.0 (BLE). O Komfy Switch é um produto de automação e segurança residencial que pode substituir um interruptor de parede em sua casa para fornecer vigilância por vídeo, monitoramento de temperatura, níveis de umidade, qualidade do ar e controle remoto de interruptores de luz.
Perfil Bluetooth BLE
Algumas análises rápidas do dispositivo BLE foram feitas com o aplicativo LightBlue para iOS antes de decidir investigar mais a fundo. Nesse ponto, o dispositivo Komfy estava online e configurado com configurações típicas de uso. Ao conectar ao Komfy com o LightBlue, notei um serviço GATT não padrão revelando oito características (ou funções) personalizadas. Algumas dessas características recebiam uma quantidade incomum de dados, considerando que 20 bytes é o máximo permitido pela especificação BLE. Se ambos os dispositivos periférico e mestre suportarem, um MTU maior pode ser negociado para suportar o que é comumente chamado de leituras ou gravações "longas". As primeiras capturas de tela abaixo mostram os serviços e características GATT (de 0xB002 a 0xB00A). As próximas duas capturas de tela mostram as duas características nas quais este write-up se concentrará (0xB006 e 0xB007). As características 0xB006 e 0xB007 exibiam o SSID do Wifi e o que parecia ser uma string codificada em base64 após decodificá-la para ascii. No entanto, a decodificação base64 da string não revelou nenhum dado legível, como ilustrado na última captura de tela.
O App Komfy: Rastreamento de Chamadas de Métodos
Para entender melhor as características GATT implementadas pelo dispositivo Komfy, fiz um dump dos métodos do app Komfy para iOS usando o class-dump-z e configurei o rastreamento de métodos para os métodos de interesse. O dump de classes completo pode ser consultado aqui. Eu estava particularmente interessado na classe BLEDevice, juntamente com quaisquer outros métodos que referenciassem bluetooth. O rastreamento de métodos pode ser configurado usando o script perl Logify.pl, detalhado por Prateek aqui.
A captura de tela acima mostra a saída do rastreamento de métodos durante uma instalação limpa e configuração do Komfy. Observe a senha do Wifi "chipotlemakesmehappy" em texto claro e, em seguida, aquela string aparentemente base64 que o app LightBlue recuperou da característica GATT 0xB007 vista anteriormente. O rastreamento mostra, na verdade, uma chamada ao método +[Base64 encode:], o que causou confusão no início, já que a string não podia ser decodificada com base64 usando uma biblioteca padrão. Quase se concluiu que o valor decodificado em base64 estava criptografado ou codificado ainda mais, até perceber que +[Base64 encode:] era um método implementado privadamente (não da classe NSData). Essa codificação esquisita precisava ser resolvida.
Desmontagem com Hopper
Agora, para a engenharia reversa do esquema de codificação "base64" implementado pela D-Link ("engenharia reversa" faz parecer muito mais difícil do que realmente foi, dado o resultado final). Carregar o app Komfy no Hopper e analisar os métodos -[BLEDevice getWifiPassword:] e +[Base64 decode:] eram os pontos de partida óbvios. A análise de -[BLEDevice getWifiPassword:] confirmou que a característica GATT 0xB007 estava de fato recuperando a senha do Wifi.
Ao examinar a montagem ARM de +[Base64 decode:], ela parecia bem semelhante à implementação padrão da classe NSData, então pulei para examinar +[Base64 encode:]. O Hopper rapidamente me deu a resposta. Uma constante de string foi exibida perto de uma das instruções de montagem, que incluía todas as letras do alfabeto base64 padrão, mas completamente fora de ordem. Um pouco envergonhado por não ter pensado em uma substituição trivial não mais difícil que a cifra de César original, escrevi um script para desembaralhar os caracteres base64 e viola! "chipotlemakesmehappy" foi impresso na tela.
Então, essencialmente, aqui está como desembaralhar e decodificar a string em base64:

O script autopwn completo pode ser encontrado aqui.
E, sim, o Chipotle realmente me deixa feliz.
A captura BLE do Ubertooth pode ser baixada aqui.