volvervolver
Inteligencia artificial en Ciberseguridad

POR:
Miguel Mendez
(Researcher & Pestester - Professional Services)

COMPARTIR

Inyección de comandos en router

Introducción

Recientemente apareció una nueva vulnerabilidad que afectaba a los Routers NR1800X (CVE-2022–41525). En particular, afecta a la versión V9.1.0u.6279_B20210910. Buscando entender el contexto de dicha vulnerabilidad, podemos proceder a hacer algunas pruebas, como emular el firmware y ejecutar algunos scripts en Ghidra para identificar otras funciones potencialmente peligrosas que permitan ejecución de código o desbordamiento de buffer. Como resultado de esto, obtenemos una gran lista de funciones que podemos identificar como prometedoras (como ser strcpy, system, sprintf, y otras).

En este caso nos enfocaremos específicamente en la función cuyo status aparece resaltado en rojo (ver imagen) con dirección 0x0041a68c, el cual apunta a la función que contiene la vulnerabilidad.




Después de haber ejecutado un pre-análisis con scripts (Ghidra) continuamos analizando el binario cstecgi.cgi en IDA. Cabe destacar que el uso de múltiples herramientas es solo por comodidad. Comenzamos entonces con el análisis estático sobre la función 0x0041a68c, donde podemos ver rápidamente la vulnerabilidad en el búfer v17 que se está formateando en la línea 26 y luego se envía como un parámetro a la función system() el que ejecuta la cadena. Esto puede apreciarse a continuación:



Análisis dinámico


A fin de avanzar en el proceso y profundizar en mayor detalle, veremos cómo se pasan los parámetros a memoria, depurando el firmware en modo sistema y con un análisis dinámico. Como primer paso colocamos un breakpoint en la función websGetVar() que se encarga de obtener los valores enviados en el cuerpo de la petición. En este caso, valida que el valor enviado sea ussd.




Luego, la cadena se formatea con snprintf() y se almacena en el búfer 0x7fff5230.




Aquí podemos ver cómo se ve finalmente la cadena formateada en el búfer.




Finalmente, la llamada a la función system() se realiza con el búfer como parámetro.




Prueba de Concepto


Para que la ejecución del comando sea posible, es necesario identificar el nombre setUssd que activa la acción, con esto ya podemos recrear un payload para iniciar el servicio telnetd en el router.




Considerando todo esto, es posible desarrollar un exploit concatenando dos vulnerabilidades. La primera correspondiente a una solicitud para omitir la autenticación, que hace que la sesión se envíe a la segunda solicitud, que es la que explota la ejecución del código en sí. La explotación final puede verse en la siguiente imagen.




Para verlo en acción en tiempo real, los invitamos a ver el siguiente video, donde se realiza en solo unos pocos segundos.




Conclusión


Como solemos comprobar con frecuencia, siempre es posible encontrar nuevas vulnerabilidades en sistemas ya analizados. Si bien todos los fabricantes y equipos pueden ser vulnerables en algún punto, en algunos casos, como en este en que la marca se autoproclama diciendo que tiene “los dispositivos de red más inteligentes” (The Smartest Network Devices) podemos hacer referencia a la “Ley de Hypponen”, que siempre vale la pena recordar: “Si se anuncia como inteligente, es vulnerable”.