zPanel es un panel de administración de hosting, pensado para ser la alternativa gratuita a cPanel, es bastante completo y dispone de una interfaz sencilla y completa.
La historia de este exploit comenzó con el conocido bug del binario zsudo descubierto en la versión 10.0.2, publicado por Zenny en fulldisclosure, se trata de una vulnerabilidad de elevación de privilegios por ejecución de comandos como superusuario.
A día de hoy, la última versión del sistema (10.1.0) sigue siendo vulnerable al mismo fallo. Además en el mismo binario existe un bug de buffer overflow que tiene un papel secundario debido al fallo de ejecución de comandos, más fácil de explotar, pero no menos importante.
Reporté el fallo al bugtrack de zPanel (bugs.zpanelcp.com) el día 6/11/2013, casi tres meses después, el día 30/1/2014 recibí contestación.
A grandes rasgos el desarrollador me hizo entender que al no proporcionar acceso SSH a los clientes el fallo no podía ser explotado. Esto ya me parece un craso error, no se puede basar la seguridad de un sistema informático en la confianza, como quedará demostrado a continuación.
Al recibir esa contestación me puse a indagar en busca de algo que permitiese ejecutar el binario zsudo, tras encadenar varios bugs y errores de configuración resultó en un exploit que puede ser utilizado para obtener acceso como root al sistema sin necesidad de estar autentificado en el panel.
El primer fallo reside en la librería pChart2 2.1.3 incluida en el panel. Utiliza una versión para la cual han publicado recientemente un fallo de revelación de archivos (http://www.exploit-db.com/exploits/31173/). El problema está en los ficheros de ejemplo que trae dicha librería.
Esto permite acceder al archivo de configuración de zpanel que almacena la clave de root de MySQL. El directorio que almacena las librerías debería estar restringido al público para evitar llamadas directas a ellas, cosa que no ocurre en zpanel.
A continuación y con la clave de root de MySQL, podemos acceder via phpMyAdmin que se encuentra en la ruta del panel http://localhost/etc/apps/phpmyadmin/, que tampoco restringe la entrada y puede ser accedido por cualquiera sin estar autentificado previamente.
Una vez dentro se puede localizar la ruta donde está instalado el panel mediante una simple consulta SQL. Esta ruta dispone de permisos 777 por defecto en todos los archivos, lo que permite modificar cualquier fichero dentro de esta carpeta o lo que más interesa para el desarrollo de este exploit, crearlos.
MySQL dispone de sentencias para volcar información de la base de datos en archivos (INTO OUTFILE), esto junto a los permisos máximos que otorga el usuario root, abre la puerta a la subida de una shell en php al directorio de zPanel.
Una vez llegados a este punto el sistema está comprometido, aunque solo dispondríamos de permisos limitados al usuario www-data. Aquí es donde entra la elevación de privilegios, que no sería posible si el programa zsudo no fuera vulnerable.
Las directivas de seguridad de PHP como disable_functions podrían mitigar este ataque bloqueando funciones potencialmente dañinas, que permiten la ejecución de comandos como puede ser passthru(), exec(), system(), popen(), etc... pero zPanel permite su utilización.
Para conseguir la elevación de privilegios, se puede abusar de zsudo. Primero se modifica el fichero de configuración del servicio SSH para permitir el acceso remoto como root, una vez conseguido esto solo es necesario cambiar la password de root y entrar con esa clave a través de SSH.
Esta es la ruta que he seguido para conseguir permisos de superusuario, pero aquí puede haber muchas variantes: conexión inversa como root, creación de superusuario, etc.
En resumen se ha demostrado que no se puede confiar en un sistema infalible con una única capa de seguridad, ya que tarde o temprano habrá una mínima brecha, que si se complementa con fallos públicos no parcheados puede comprometer el servidor por completo.
Además de estos fallos, he reportado otros bugs menores:
- XSS (https://github.com/zpanel/zpanelx/pull/106)
- XSS (https://github.com/zpanel/zpanelx/pull/104)
- Information disclosure (http://bugs.zpanelcp.com/view.php?id=704)
A continuación dejo el seguimiento de la vulnerabilidad realizada por el equipo de zPanel y el exploit que da acceso root al servidor.
Timeline:
- 06/11/2013: Inyección de comandos y buffer overflow en zsudo reportado.
- 30/01/2014: Respuesta del desarrollador: No se considera explotable y no liberará ningún parche.
- 31/01/2014: Exploit reportado
- 01/02/2014: Zsudo reescrito por mi en github (https://github.com/zpanel/zpanelx/pull/97)
- 01/03/2014: Zpanel lanza la versión 10.1.1
ACTUALIZACIÓN (27/10/2015):
Exploit publicado: http://pastebin.com/y5Pf4Yms
Vulnerabilidad descubierta por Jose Antonio Pérez
japp{at}0xlabs{dotz}com