Engenharia Reversa IoT - Parte 1 [PT-BR]
Tue, Jul 18, 2023PARTE 1 - Identificação de Hardware (identificando portas de debug).
Nesta primeira parte, vamos passar pelo processo de engenharia reversa de um “roteador” MitraStar GPT-2741GNAC-N1. Este dispositivo é interessante pelo fato de ser um dos aparelhos mais utilizados nas casas dos brasileiros, fornecido por um dos provedores ou o maior provedor de acesso a internet no Brasil, é fácil de desmontar, há diversas informações principalmente de versões anteriores (GPT-2541GNAC) na internet, além de poder usar/testar alguns brinquedos de hardware hacking que adquirir recentemente. Como se trata de hardware, espero não quebrar (brickar) nada, já que não possuo backup, isso é um fator complicador para sucesso na análise.
Introdução:
No mundo dos dispositivos conectados (IoT), encontramos diversas abordagens interessantes do ponto de vista de segurança da informação.
São dispositivos conectados à internet, com uma ou mais interfaces sem fio, e com alguns serviços expostos (documentados ou não);
Muitos desses dispositivos são relativamente baratos;
Em quase todos os casos, a segurança não é um elemento central de seu design, logo, por mais seguros que sejam, é muito provável que haja algum forma de acesso que não deveria estar disponível. Com esses pontos, entre muitos outros, IoT é um campo muito interessante e divertido se gosta de quebrar coisas. Literalmente um parque de diversão para quem gosta de eletrônica, engenharia reversa, fuzzing, exploitation entre outros assuntos, tudo em um único dispositivo.
Análise Inicial (hardware):
O primeiro passo antes de realizar qualquer procedimento relacionado ao hardware é analisá-lo da forma menos intrusiva possível. Como pode ser visto na imagem abaixo, o roteador possui na parte frontal os LEDs e indicadores, respectivamente de telefone, rede WiFi 2.4GHz, rede WiFi 5GHz e conexão com a internet.
GPT-2741GNAC-N1 – Parte da frente:
Já na parte de trás as portas de conexão da esquerda para direita (conexão de energia, botão Power, conexão fibra óptica (ótica), uma conexão de telefone RJ11, quatro conexões de rede RJ45, botão WPS 2.4GHz, botão WPS 5GHz e por fim botão de reset do aparelho).
GPT-2741GNAC-N1 – Parte traseira:
Durante a análise, localizamos os parafusos na parte de baixo da carcaça que predem cada peça no lugar. Com cuidado, abrimos o aparelho, revelando a placa com todos os componentes eletrônicos.
Placa base do roteador GPT-2741GNAC-N1:
O próximo passo é identificar os componentes mais relevantes, tanto para saber como o aparelho funciona, quanto para buscar na internet informações sobre cada um deles.
- CPU: Unidade de processamento de dados, é interessante sempre pesquisar na internet as especificações da cpu, outro ponto interessante é verificar dispositivos que utilizam o mesmo chip e analisar seu comportamento/problemas.
- RAM: Assim como a CPU, não interagimos com frequência com a memória RAM, porém nos ajuda a localizar modelos parecidos que já foram analisados na internet e pode fornecer informações sobre a estrutura da memória. O chip geralmente fica próximo da CPU, cercado por barramentos que os conectam.
- WI SoC: Esses componentes geralmente são cercados por uma estrutura retangular e localizados não muito longe de um ou mais conectores de antena. Nos casos dos roteadores, são um dos elementos mais importantes.
- Flash / NVRAM: Memória não volátil do sistema, onde são armazenadas todas as informações que precisam ser preservadas após a reinicialização do dispositivo. Aqui que o firmware do dispositivo e os arquivos de configuração persistentes estão localizados.
- Portas I/O: Essas portas nos fornecem um método de comunicação com o dispositivo, geralmente a maneira mais direta de analisá-lo (UART, JTAG etc). No caso desse roteador, as portas de I/O estão sem os terminais soldados, o que dificulta a análise dinâmica, em alguns casos será necessário modificar a placa (soldar pinos) correndo o risco de danificar o dispositivo. Veremos algumas possibilidades de acesso nos próximos capítulos.
Portas de debug:
Nos estágios iniciais, esse é o tipo mais básico de análise. Vamos simplesmente procurar por uma porta serial que os engenheiros que projetaram o dispositivo deixaram na placa para fins de depuração (debug) e/ou suporte técnico. Apesar que estamos realizando o processo em um roteador, ele pode ser aplicado a vários outros dispositivos IoT, que executam algum sistema embarcado (*unix), provavelmente também terá portas de depuração ocultas, parecida com as que procuramos nesse dispositivo.
Encontrando a porta serial:
Grande parte dos dispositivos comerciais possuem portas UART com 4 ou 6 pinos, geralmente bem alinhados e às vezes marcadas no PCB (Printed Circuit Board). Essas portas não são para usuários finais, logo quase nunca possuem pinos ou conectores na placa. Depois de analisar a placa por algum tempo, 3 conjuntos de pinos chamaram atenção (UART1, UART2 e uma possível interface JTAG).
Este dispositivo parecer ter 2 portas seriais para se comunicar com 2 circuitos integrados (CI) diferentes. Com base na localização na placa e seguindo os rastros podemos descobrir qual deles está conectado ao CI principal.
Identificando a pinagem:
Encontramos 2 fileiras de pinos que parecem ser portas UART (UART1 e UART2). A primeira coisa a fazer é descobrir se algum desses contatos não estão sendo utilizados e tentar identificar cada um desses pinos.
UART (Universal Asynchronous Receiver Transmitter) é um protocolo serial assíncrono que permite dois dispositivos se comunicarem. As duas linhas necessárias para cada parte são as linhas de transmissão (Tx) e recepção (Rx). Um UART pode ser usado para diversas finalidades em um sistema embarcado, incluindo comunicação com outros processadores, comunicações de sensores e acesso de depuração (debug). UART é um protocolo assíncrono, o que significa que não há necessidade de sinal de “clock”. Em vez disso, ambas as partes em comunicação são pré-configuradas para se comunicar a uma determinada velocidade, conhecida como taxa de transmissão. A taxa de transmissão é medida em bits por segundo.
Temos 2 conectores com 4 pinos cada. Ainda não verificamos se as portas estão funcionando ou identificamos o protocolo serial usado pelo dispositivo, mas o número e a disposição dos pinos indicam UART.
No protocolo UART existem 6 tipos de pinos especificados:
- Tx (Pino transmissor. Conecta-se ao Rx no dispositivo de debug);
- Rx (Pino que recebe dados. Conecta-se ao Tx no dispositivo de debug);
- VCC /GND (Linha de energia da placa. Geralmente 3,3V ou 5V;
- CTS (Geralmente não é utilizado);
- DTR (Geralmente não é utilizado).
Nessa primeira parte iremos abordar duas formas de identificar cada pino.
Vamos começar com um simples multímetro e identificar o pino GND (Ground) que é o mais fácil de encontrar.
No multímetro, coloque no modo contínuo (continuity mode) e teste cada um dos pinos, quando ouvir o som de um beep esse será o pino GND.
Agora podemos tentar encontrar os pinos Tx e Rx. Utilizando o multímetro coloque no modo 20V, ligue o dispositivo e teste cada um dos pinos que restaram. O pino que tiver 0 volts é provavelmente o pino Rx, pois está esperando receber dados. O pino que tiver uma voltagem flutuante será o Tx, esse é o pino transmissor, ele envia os dados do chip. No início é um pouco complicado identificar utilizando o multímetro, mas com o tempo e prática torna-se fácil a identificação.
Nota: Para identificar o Rx e Tx, sempre tente com o dispositivo reiniciando (boot), com ele já ligado após o processo de inicialização fica mais difícil pois não vai ter muita atividade do sinal.
Nem sempre será possível ver flutuações de tensão ao procurar uma porta serial. As flutuações estão diretamente relacionadas com a atividade do sinal, o que significa que, se houver pouco tráfego, você verá pouca ou nenhuma flutuação. Se você suspeitar que um PCB possui UART ou algum tipo de interface digital, é sempre uma boa ideia verificar com um analisador lógico.
Aqui que a brincadeira fica legal, a pouco tempo comprei um analisador lógico Saleae Logic 8 da empresa Saleae, que por sinal é um ótimo produto e pretendo utilizar em outras análises de hardware e trazer nas próximos postagens do blog.
Vamos conectar o analisador lógico na porta UART, seguindo a pinagem que encontramos anteriormente (Tx, Rx e GND).
No software (Logic 2) utilizado em conjunto com o analisador lógico (Saleae Logic 8), percebemos o que parece atividade de sinal por conta das flutuações de tensão. Podemos ver alguns dados trafegando, o que significa que o roteador enviou informações do chip para o analisador lógico, logo estamos snifando o tráfego. Os analisadores lógicos nos ajudam a converter essas flutuações de tensão em zeros e uns (binário) onde fica mais fácil para interpretar, conforme ilustrado pela imagem abaixo.
Portanto, agora sabemos qual pino é qual, mas se quisermos falar com a porta serial, precisamos descobrir sua taxa de transmissão, com um analisador lógico isso fica fácil. Porém se não tiver um, terá que realizar tentativas de acerto e erro, com uma lista das taxas mais comuns utilizadas nos dispositivos. As taxas de transmissão padrão incluem 110, 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 38400, 57600, 115200, 128000 e 256000 bits por segundo.
Após identificar a taxa de transmissão que nesse caso é 115200. Podemos utilizar o próprio software Logic 2 para decodificar o tráfego e verificar na aba Data
o resultado.
Essa funcionalidade de decodificação já vem incorporada com o software, por se tratar de um protocolo padrão e adotado pelo mercado (UART), em alguns casos, terá que fazer isso por conta própria utilizando o datasheet de cada chip ou verificar na internet se algum pesquisador já desenvolveu um módulo para decodificar aquele padrão específico.
Na imagem abaixo conseguimos visualizar o que parece com informações do bootloader do dispositivo.
Temos um UART ativo e conhecemos sua taxa de transmissão, agora precisamos encontrar uma maneira de conversar com ele. Para fazer isso, usaremos um circuito integrado que fornece uma solução simples para conversão USB-UART.
Conectando na Porta Serial:
Poderíamos utilizar uma infinidade de conversores (Hydrabus, bus pirate, flipper zero, jtagulator etc.), mas nesse caso vamos utilizar o mais simples e barato dentre eles, o CP2102 ilustrado na imagem abaixo.
Para interagir com a porta serial do dispositivo, usaremos o utilitário screen
do Linux. A tela requer que passemos a interface mapeada pelo sistema operacional (/dev/ttyUSB0) e a taxa de transmissão. Caso não consiga identificar qual a interface do CP2102 mapeado pelo sistema, pode verificar utilizando o comando dmesg
.
screen /dev/ttyUSB0 115200
Esta é a minha configuração final para comunicar com a porta serial do roteador.
Depois de conectar o CP2102 na porta UART do roteador e executar o comando screen
no terminal, ligamos o dispositivo e podemos ver a tela de inicialização carregar (U-Boot).
Após a inicialização do dispositivo, esperava conseguir acesso direto ao sistema (shell), mas para minha surpresa não aconteceu, em vez disso o roteador solicita uma credencial para liberar o acesso. =/
Próximo passo:
Na parte 2 da análise, veremos como ter acesso ao sistema e/ou extrair o firmware do dispositivo.
Conclusão:
Essa primeira parte foi uma introdução para consolidar alguns conceitos básicos e aprender a reconhecer componentes e portas, que serão necessários para os procedimentos que vamos realizar nos próximos capítulos.
Stay tuned. \ 0/
comments powered by Disqus