martes, abril 05, 2016

MySqlDumper: Un script de backup que no debes publicar

La noche antes de mi viaje a Ecuador me dio uno de esos días de estrés en los que me cuesta dormir, así que aprovechando la tranquilidad de la noche decidí ponerme a mirar algún software de esos que tengo marcados como "sospechosos" en mi lista de tareas. Estos programas los marco para que luego todo lo que encuentre se convierta en un plugin de auditoría de nuestro sistema de Pentesting Persistente Faast. En esta ocasión le tocó el turno a MySqlDumper.

Figura 1: MySqlDumper. Un script de backup que no debes publicar.

MySqlDumper se define como un script de backup y restore para bases de datos MySQL basado en un interfaz web. Es importante entender esto, pues no es una plataforma de administración por lo que no hay ni proceso de login. Es decir, MySqlDumper no tiene usuarios, ni roles, ni nada parecido. Se configura la conexión a la base de datos y se pueden hacer copias de seguridad, restaurar bases de datos, consultar tablas, crear tablas, o consultar variables de estado de la base de datos y el servidor en general.

Figura 2: Scripts de MySqlDumper a copiar en el servidor web

Dicho esto, si publicas el script en tu web y lo configuras, cualquiera que lo encuentre podrá hacer lo que le de la gana con tus bases de datos, así que más vale que no lo hagas si no quieres tener problemas serios de seguridad y si lo usas que sea solo con acceso local o restringido por un .htaccess a tus servidor.

El usuario y la contraseña de MySQL para todo el mundo

Los scripts más importantes que hay que conocer de esta herramienta son main.php, sql.php, filemanagement.php e install.php. El último de ellos es el que configura la conexión a la base de datos y que, para que sea cómodo este script, una vez configurada la conexión, las credenciales de acceso a MySQL quedan cacheadas.

Figura 3: La instalación de MySqlDumper es completa y el usuario y la password están cacheados

Así, si estos scripts, que habitualmente se configuran en el directorio /msd/ están bien configurados en el servidor, lo que podremos ver es que el usuario y la contraseña aparecen en este mismo script si se ha terminado el proceso de instalación de MySqlDumper en este sitio web.

Figura 4: Accediendo al código fuente de install.php se pueden ver el usuario y la contraseña de MySQL

Solo deberemos echar un vistazo al código fuente para tener las credenciales necesarias para acceder a la base de datos de MySQL que hay corriendo en este servidor, así que perfecto para un auditor de seguridad que con solo consultar este fichero ya se lleva el acceso al SGDB.

Acceso a información del sistema

Si se ha completado la instalación del script, como he dicho al principio, MySqlDumper no tiene ninguna gestión de usuarios, por lo que para un atacante remoto será tan sencillo como solicitar el script main.php y tener acceso a todas las opciones disponibles que van, desde hacer backup y restore con filemanagement.php, ejecutar comandos con sql.php o incluso acceder a información del sistema operativo por medio de un PHP Info, tal y como se ve en la pantalla.

Figura 5: Acceso a main.php donde hay un PHP-Info enlazado

También se puede acceder a las variables de MySQL y conocer el estado de todas las variables del sistema de las que os hablé en el artículo de "Cómo sacar partido a las variables del sistema en un ataque de SQL Injection a MySQL". 

Figura 6: Accediendo a sql.php y seleccionando la tabla de Global_Variables de Information_Schema
se puede acceder a todas las variables del sistema

En este caso, como podéis ver, el hostseguro no queda tan seguro solo por el hecho de haber instalado este script.

Acceso a bases de datos y tablas de WordPress o Joomla!

Por supuesto, desde la opción de main.php se puede acceder a todas las bases de datos y a todas las tablas, por lo que es sencillo buscar las credenciales de los sitios web que se encuentren alojados en este motor de MySQL al que se ha conectado MySqlDumper.

Figura 7: Una tabla de usuarios y contraseñas de un sitio web con credenciales en texto claro

Pero si en la base de datos de MySql se ha configurado el repositorio de un framework como WordPress, también se puede acceder, sin necesidad de vulnerar ninguna medida de seguridad, a las tablas que almacenan los usuarios y datos de WordPress.

Figura 8: Un WordPress en un MySql con MySqlDumper configurado

O, en el caso de que hubiera otro framework, pues a sus tablas de credenciales. En este caso un framework Joomla! alojando en un SGBD MySql al que se le ha conectado MySqlDumper.

Figura 9: Un joomla en un MySql con un MySqlDumper configurado

Instalación no completada: Ataques XSPA (Cross-Site Port Attacks)

En el caso de que no se haya completado la instalación, al acceder al script de main.php podemos encontrarnos con un error como el que sigue, en el que se puede ver que las credenciales de acceso de MySql no son correctas.

Figura 10: Instalación de MySqlDumper incompleta

Aún así, accediendo al script install.php y seleccionando el idioma se llega a una pantalla en la que se pueden hacer ataques de XSPA (Cross-Site Port Attacks) para escanear la DMZ en la que se encuentra hospedado este servidor o para analizar cualquier otro servidor de Internet.

Figura 11: Script de install.php. Permite conectar a servidor y puerto y hacer XSPA

Solo se debe jugar con la dirección IP del servidor y el puerto al que se quiere conectar. Así, podremos recibir un mensaje "Credenciales No validas", lo que implicará que hay un servidor MySql en ese puerto pero el usuario no es correcto, o "MySql Server has gone away" lo que significará que el puerto está abierto aunque no hay un servidor MySql. Este es el ejemplo siguiente en el que se puede ver que en esa dirección IP de la DMZ hay un servicio FTP abierto.

Figura 12: Un FTP en un servidor de la DMZ

Si el servidor no es alcanzable, en este caso porque la máscara de red lo tiene limitado y no hay ruta hasta ese segmento de red en el router, nos toparemos con un mensaje de "No route to host".

Figura 13: No route to host

Si el puerto está cerrado o hay un filtrado de tráfico en la respuesta del servidor, se obtendrá un mensaje típico de Time-Out

Figura 14: Puertos bloqueados en el firewall de salida de la DMZ

Y si el puerto está cerrado y se puede acceder a la respuesta del servidor, se obtiene un mensaje de "Connection Refused", tal y como se puede ver en la imagen siguiente.

Figura 15: Connection Refused

Con estos mensajes se podría hacer un escaneo de, no solo la DMZ sino, cualquier servidor de Internet al que hubiera conectividad desde el host que hospeda el script de MySqlDumper aún sin instalar correctamente.

Unsafe data manipulation

La última de las pruebas que le hice a este caso en concreto es ver cómo gestionaba la aparición de datos inseguros en los registros a los que recibe de MySQL. Al final, "all input is evil until it proves otherwise".

Figura 16: Se ejecuta el contenido de los registros de la base de datos

Como se puede probar, es posible inyectar registros con ataques XSS en los datos de las tablas de MySQL y la aplicación no realiza el envío de los datos al cliente de forma segura.

Reflexiones sobre gestores web de bases de datos

Los gestores de bases de datos basados en entornos web son difíciles de asegurar al 100%, y ya hemos visto en el pasado problemas en una buena cantidad de ellos. Si tienes uno de estos gestores, lo recomendable es que limites su acceso por medio de una protección extra basada en el servidor web, en el firewall o en el acceso solo local. Solo como recordatorio, os dejo la lista de gestores de bases de datos de los que se ha hablado por aquí y los bugs que se han encontrado en ellos:
Como veis, estas herramientas suelen ser especialmente peligrosas si están expuestas a Internet sin ningún control extra en su acceso. Lo suyo es que la pongas en tu red local y con acceso remoto vía VPN.

Saludos Malignos!

2 comentarios:

Daniel Maldonado dijo...

Excelente investigación sobre esta herramienta chema!

Saludos cordiales.

carl-OS dijo...

Una entrada muy didáctica, saludos

Entrada destacada

10 maneras de sacarle el jugo a tu cuenta de @MyPublicInbox si eres un Perfil Público

Cuando doy una charla a algún amigo, conocido, o a un grupo de personas que quieren conocer MyPublicInbox , siempre se acaban sorprendiendo ...

Entradas populares