lunes, diciembre 11, 2017

¿Un Backdoor en los routers con ZeroShell?

El pasado mes de octubre, se publicada en este blog el artículo que llevaba por título “Ejecución de Código Remoto en dispositivos GNU/Linux con Zeroshell” donde se explicaba cómo ejecutar código remoto aprovechando la vulnerabilidad CVE 2009-0545 que pone de manifiesto la falta de validación de ciertos parámetros enviados por GET/POST a la aplicación del estándar criptográfico X.590 que soportan.

Figura 1: ¿Un Backdoor en los routers con ZeroShell?

Parece que una buena medida de seguridad sobre este tipo de dispositivos sería detener o no levantar los servicios HTTP y HTTPS para evitar una posible inyección de código de forma remota. Es por anterior que este artículo se mostrará cómo abrir una shell en el dispositivo con privilegios de root.

Explorando la línea de comandos de ZeroShell

En muchos dispositivos destinados a la administración de redes y defensa perimetral, como pueden ser los sistemas ZeroShell, una buena opción para reducir la superficie de exposición es permitir la administración del dispositivo únicamente bajo una interfaz de línea de comandos, a veces de manera remota bajo servicios como SSH, y otras de manera local.

Figura 2: Opciones de la línea de comandos de los dispositivos ZeroShell

Como parece, la superficie de exposición se reduce de manera considerable, pero el sistema sigue quedando expuesto mientras se pueda interactuar con él, aunque sea bajo una interfaz de línea de comandos.

Una primera aproximación es seleccionar la opción <s> Shell Prompt para ver si es posible disponer de una shell sin estar autenticado en sistema. Como es lógico, el sistema solicita la contraseña del usuario que corre en el sistema. Además, como máximo permite tres intentos sobre el password. Si son infructuosos, el sistema regresa a las opciones mostradas en la Figura 2.

Figura 3: Intentos de autenticación fallidos

Ejecución de comandos bajo root

Dado que no conocemos la contraseña de acceso al sistema, se prueban todas posibilidades que ofrece el menú de línea de comandos.

Figura 4: Opciones del router ZeroShell

Ocurre algo curioso si seleccionamos la opción Show Firewall Rules para ver cuáles son las reglas que incorpora en su iptables.


Figura 5: Reglas iptables en el firewall del router ZeroShell

Pulsando la tecla ‘H’ mientras el sistema muestra las cadenas que tiene en iptables, el sistema ofrece diferentes opciones. Una de ellas parece que permite la ejecución de comandos en una subshell. Lo único que hay que hacer es escribir el carácter “!”(ALT+1) seguido del comando que se quiera ejecutar en el sistema.

Figura 6: Opción para abrir una shell "sin privilegios administrativos"
Ejecutando el comando “uname –a”, se observa que la versión de ZeroShell que corre en el sistema es la 3.4.19.

Figura 7: Información del sistema operativo que se está utilizando

Se comprueba que el entorno donde se ejecutan los procesos generados por los comandos que recibe el sistema es el del usuario root y, por lo tanto, es muy posible visualizar archivos críticos del sistema como pueden ser /etc/passwd o /etc/shadow.

Figura 8: El usuario root no utilizado en la ejecución de comandos

Figura 9: Información de los usuarios del sistema en /etc/passwd

Entrando por la puerta de atrás

Dado que el entorno donde se ejecutan los comandos es el del usuario root, probaremos a ejecutar “/bin/sh” o “/bin/bash” para intentar obtener la shell del usuario root, cualquiera de las dos es buena.

Figura 10: Obtención de una shell /bin/bash con privilegios de root

Como se observa, es posible obtener una shell dentro del sistema con privilegios de “root” sin la necesidad de estar autenticado en él.

Consideraciones finales
• Las pruebas realizadas para obtener los resultados expuestos en el artículo, han sido realizadas bajo un entorno virtual con la versión 3.4.19 de Zeroshell, concretamente sobre la máquina virtual proporcionada en uno de los retos de las Cyberolimpiadas organizadas para Centros Educativos en el marco del Cybercamp de este año.

• No se han realizado pruebas exhaustivas en entornos de producción real donde corren este tipo de sistemas, por lo que no se puede determinar que exista realmente un backdoor en la versión
3.14.9 de ZeroShell, en versiones inferiores o posteriores, pero habría que probarlo.
Autores: Amador Aparicio de la Fuente (@amadapa) y Álvaro Gutiérrez Rebollo (@alvgut98), alumno de 1º de Administración de Sistemas Informáticos en Red.

1 comentario:

  1. Hola, acabo de probarlo en la última versión públicada (3.8.1) y sigue siendo posible.

    ResponderEliminar