[Parte 2] Hacking NETGEAR JWNR2010v5 Router - Command Injection

Ya hemos visto como podemos acceder al router bypasseando la autenticación por completo por lo que en esta entrada quiero centrarme en el compromiso del sistema subyacente. Para esto tenemos que entender como funciona el router internamente y la gestión del interfaz de administración.

Revisando el sistema de archivos que descomprimimos en el anterior post nos encontramos con que casi toda la lógica es gestionada por un unico cgi llamado setup.cgi:


# ls -l | grep cgi
lrwxrwxrwx 1 root root     18 Jul 28 07:51 conf -> restore_config.cgi
lrwxrwxrwx 1 root root      9 Jul 28 07:51 htpwd_recovery.cgi -> setup.cgi
-rwxr-xr-x 1 root root  59784 Apr  1 01:34 restore_config.cgi
-rwxr-xr-x 1 root root 613588 Apr  1 01:34 setup.cgi
-rwxr-xr-x 1 root root 277152 Apr  1 01:34 setupwizard.cgi
lrwxrwxrwx 1 root root      9 Jul 28 07:51 upgrade_flash.cgi -> setup.cgi


Una de las vulnerabilidades mas habituales es la inyección de comandos a traves de funciones mal controladas, por lo que mi prioridad es encontrar en que punto se ejecuta un comando contra el sistema donde nosotros tengamos control sobre el input. Para ello una vez abierto el cgi en IDA hago una búsqueda sobre palabras clave que pueden reportar el resultado deseado, por ejemplo el string '/bin' entre otros:


Como se puede ver en la imagen uno de los resultados mas interesantes es el comando ping que muchos routers utilizan en la página de diagnóstico para validar la conexión a internet y que en el caso concreto de este NETGEAR se encuentra en la página diag.htm, por lo que buscaremos como se realiza la llamada:



En la propia web nos encontramos el primero de los fallos. La integridad de los datos enviados por el usuario se realiza del lado del cliente por lo que simplemente sustituyendo return ping_ck() por return true o interceptando la petición POST podremos modificar los datos a nuestro antojo.




Probamos a inyectar un comando tratando de concatenar ls a la IP mediante ';', pero falla y el comando nunca es ejecutado. Esto se debe a una validación adicional que se realiza del lado del servidor:



Como se puede ver en la imagen, si el caracter ";" se encuentra en la cadena pasada el flujo salta la ejecución del comando. Este filtro es una solución inutil porque existen diferentes formas de concatenar comandos en Linux así que en lugar de usar ';' utilizaremos '&&' que ejecuta el comando siguiente si el primero ha tenido una salida satisfactoria, por lo que tendremos que asegurarnos que el ping funciona, siendo algo tan trivial como apuntarlo a la ip del router o una ip que estemos seguros que responde. Pero no todo iba a ser tan bonito. Tras editar el javascript y preparar el comando enviamos la petición para recibir un error 403 Forbidden.



La request para ejecutar el ping se lanza contra setup.cgi y recibe un parámetro por GET de la siguiente forma setup.cgi?id=0000000, si descompilamos la funcion main() en IDA vemos como se realiza la validación de este parámetro



Lo primero que se hace es validar una serie de parámetros por POST y variables de entorno, si no existen se valida la existencia del parametro id por GET en la URL. Si el parametro id existe se ejecuta un strtol() y si es satisfactorio se extrae el ID de /tmp/SessionFile para comparar. Si el id enviado por GET no es igual al extraido de /tmp/SessionFile se devuelve un 403, de lo contrario se continúa la ejecución.

Así que ahora sabemos que necesitamos firmar la petición con el id devuelto por la página justo antes de realizar la request de lo contrario el id cambiará y devolverá un 403.

Así que preparamos un script que aproveche la vulnerabilidad de bypass de autenticación, extraiga el ID, prepare la inyeccion y devuelva la página.



Y por fin ya conseguimos el resultado esperado en la página devuelta tras ejecutar un 'pwd':



Al contrario que el bypass de autenticación esta vulnerabilidad solamente afecta a los modelos JWNR2000v5 y JWNR2010v5. En el siguiente enlace podeis encontrar una POC que he realizado para aprovechar la vulnerabilidad.

https://github.com/remot3/exploit-POC/blob/master/NETGEAR_JWNR2010v5.py

0 comentarios:

Publicar un comentario

ShellShock Labs es un blog dedicado a seguridad y hacking en general, un lugar donde buscamos que la gente participe con sus opiniones.

Síguenos




Posts Populares