IOT Connect
“Insecure IOT?…”
Introdução
Esta é uma resolução do desafio do Mobile Hacking Lab
onde descobri recentemente que eles estão oferecendo treinamento e laboratórios gratuitos para explorar e praticar suas habilidades de hacking mobile.
Então, decidi fazer o curso e praticar os laboratórios.
Visão geral
Ao ler a página do desafio IOT Connect, há uma descrição bem detalhada do objetivo e das habilidades necessárias. Segundo o site:
Objetivo
Explorar uma vulnerabilidade do bradcast Receiver: Sua missão é manipular a funcionalidade do broadcast receiver no aplicativo Android “IOT Connect”, permitindo que você ative o interruptor principal e controle todos os dispositivos conectados. O desafio é enviar um comando de uma forma onde não é possível ser alcançada pelo usuário guest.
Habilidades necessárias
- Conhecimento básico do desenvolvimento do Android.
- Compreensão das implicações de segurança dos broadcast receivers.
- Técnicas de engenharia reversa para analisar e entender o código do aplicativo.
Analise Broadcast
O primeiro passo foi abrir o app e entender as suas funcionalidades, iniciei a aplicação, criei um usuário e fiz o login. Quando tentei um PIN qualquer na tela de MasterSwitch, apareceu a seguinte mensagem: “The master switch can’t be controlled by guests”. Depois de entender que haviam restrições em alguns comandos para os usuários guests eu decompilei o app e comecei os trabalhos de engenharia reversa para obter mais informações do aplicativo.
Utilizando o jadx-gui
, comecei olhando o ponto de entrada da aplicação, que é o arquivo AndroidManifest.xml. Após uma breve análise notei que o broadcast receiver está com a opção exported="true"
Após procurar pelo nome “MasterReceiver” que é o nome desse componente, encontrei ele declarado dentro da classe “CommunicationManager”.
Após abrir o código dessa classe, notei que essa aplicação não possui nenhum tipo de ofuscação. Após olhar o trecho de código a seguir.
Analise Intent
Descobri as seguintes coisas:
-
A action “MASTER_ON” tem uma string extra chamada “key” que é o PIN da tela Master Switch;
-
O código verifica o valor “key” em um pacote a parte com um segredo chumbado dentro da aplicação;
-
Se o PIN estiver correto, a aplicação irá ligar todos os dispositivos e a mensagem de sucesso será exibida;
-
Caso contrário, aparecerá a mensagem “Wrong PIN!!”.
Sabendo dessas informações, utilizei o comando adb
para tentar criar o meu payload e enviar o valor da chave utilizando a “action” da intent “MASTER_ON”
Como demonstrado na imagem a aplicação devolve sempre a mensagem “Wrong PIN!!” independente do valor que eu enviar.
A princípio pensei em fazer um ataque de força bruta, mas enquanto a aplicação estiver a mostrando a primeira mensagem, é necessário esperar ela desaparecer para que a próxima possa ser exibida. Assim acaba ficando bem demorado o processo de força bruta.
Dando sequência a análise de código percebi que a aplicação realiza o log
da mensagem: “All devices are turned on”
Então, decidi criar um shell script para automatizar este processo.
Exploit
A ideia era enviar um broadcast com um valor do PIN num For Loop e enquanto meu script lê os registos de log do app para que uma vez que a mensagem desejada fosse logada isso significaria que o meu PIN estaria correto independente da mensagem que estivesse na tela.
O shell script fará o trabalho duro e tentará todas as combinações, já que o aplicativo nos diz que o PIN são 3 dígitos.
Depois de executar o script e ter o valor correto, para confirmar o PIN eu fiz o comando: adb shell am broadcast -a MASTER_ON --ei key 345
Abaixo eu deixei um vídeo da PoC para a demonstração dessa execução!
Video
Referências
Posts:
- Post Board parte 2
- Post Board parte 1
- Guess Me Parte 2
- Guess Me Parte 1
- Food Store
- IOT Connect
- UnCrackable L1 Parte 2
- UnCrackable L1 Parte 1
- CVE-2022-26352
- DCA php
- Docker Code Analyzer
- Vulnado Parte 3
- Vulnado Parte 2
- Vulnado Parte 1
- Damm Vulnerable WebSocket
- OWASP ZAP Zed Attack Proxy
- Estratégias de um code review
- O que é code review?