
Exploit de injeção de comando para a câmera TP-Link Tapo C200 (CVE-2021-4045) fornecendo acesso ao shell root via UART e análise do binário uhttpd com engenharia reversa.
CVE-2021-4045
CVE-2021-4045 é uma vulnerabilidade de injeção de comandos descoberta na câmera TP-Link Tapo C200, que permite que um atacante assuma o controle total do dispositivo com privilégios de root. Esta vulnerabilidade afeta todas as versões de firmware anteriores à 1.1.16 Build 211209 Rel. 37726N.
🔗 Aviso oficial do INCIBE: https://www.incibe.es/incibe-cert/alerta-temprana/vulnerabilidades/cve-2021-4045 (Substituir pelo link real)
🔧 Solução recomendada: Atualizar o firmware para a versão 1.1.16 ou superior.
$ nmap -sV -p- 192.168.1.81
**Resultado**:```
PORT STATE SERVICE
443/tcp open https
554/tcp open rtsp
2020/tcp open xinupageserver
8800/tcp open sunwebadmin
Como podem ver, o dispositivo tem algumas portas abertas interessantes. A primeira coisa que testei foi a porta 443. Embora o nmap indique claramente que usa https, quando fiz a varredura inicial, passei por cima disso e perdi bastante tempo pensando que a porta 443 estava usando http. Por causa disso, só testei http://192.168.1.81:443 em vez de https://192.168.1.81:443, então só obtive respostas 400. Como disse na introdução, esse processo foi cheio de falhas. Quanto às outras portas, os serviços que rodavam nelas eram totalmente desconhecidos para mim e não encontrei nenhuma informação clara a respeito. Naquele momento, fiquei sem opções conhecidas, então era hora de pesquisar mais a fundo.
----[ Obter uma shell ]-------------------------------
Antes de comprar a câmera, pesquisei na internet investigações anteriores sobre o dispositivo e, por sorte, encontrei este repositório no GitHub onde as pessoas colaboravam para fazer engenharia reversa. Um dos problemas explicava como obter acesso ao console através da porta UART, algo que eu desconhecia completamente na época. Então aprendi o básico e comprei um conversor USB para TTL para me conectar.
Com a ajuda do problema mencionado, consegui abrir o dispositivo com uma faca e uma chave de fenda e localizar rapidamente o UART. Depois de algumas tentativas e muita paciência, finalmente consegui soldar alguns fios nas almofadas.
Depois, chegou a hora de verificar se a solda era boa o suficiente para a transmissão de dados. Conectei os fios ao adaptador USB, lembrando que Rx do UART vai para Tx do adaptador e vice-versa, e conectei o adaptador ao meu computador. Novamente, graças ao problema mencionado, eu sabia que a velocidade de transmissão para a conexão serial era 57600, então executei:
$ sudo screen /dev/tty.usbserial-0001 57600
Onde '/dev/tty.usbserial-0001' é a porta USB à qual o adaptador está conectado e que alimenta o dispositivo. Imediatamente comecei a receber dados, ótimo.
No entanto, ainda não tinha acesso ao console. O que eu recebia era simplesmente a sequência de inicialização do dispositivo, que na verdade era o bootloader U-Boot. Tinha uma aparência semelhante a esta:
U-Boot 2014.01-v1.2 (Jul 16 2021 - 18:41:10)
Board: IPCAM RTS3903 CPU: 500M :rx5281 prid=0xdc02 force spi nor mode DRAM: 64 MiB @ 1066 MHz Skipping flash_init Flash: 0 Bytes flash status is 0, 0, 0 SF: Detected XM25QH64A with page size 256 Bytes, erase size 64 KiB, total 8 MiB Using default environment
Autobooting in 1 seconds copying flash to 0x81500000 flash status is 0, 0, 0 SF: Detected XM25QH64A with page size 256 Bytes, erase size 64 KiB, total 8 MiB SF: 8388608 bytes @ 0x0 Read: OK
[...]
Ao pressionar Enter, é solicitado que insiramos um nome de usuário e uma senha. Graças a esse problema do GitHub, conhecemos as credenciais, então podemos fazer login corretamente com o usuário 'root' e a senha 'slprealtek' e, finalmente, obter acesso ao console.
Assim que verifiquei que a conexão funcionava, precisei reforçar a solda, pois ela havia quebrado duas vezes durante o processo de montagem da carcaça. Apliquei silicone termofusível para segurar todos os fios e fechei o dispositivo, desconectando todos os motores. Agora, minha unidade de teste estava pronta.
----[ Explorando o dispositivo ]--------------------------
Agora que temos uma carcaça, vamos explorar o dispositivo:
root@SLP:~# uname -a Linux SLP 3.10.27 #1 PREEMPT Wed Nov 11 20:42:05 CST 2020 rlx GNU/Linux
root@SLP:~# cat /etc/openwrt_version 12.09-rc1
Como podemos ver, trata-se de uma máquina OpenWRT rodando Linux 3.10.27. Agora vamos verificar os processos ativos e as portas abertas: