¿Qué es SQLMAP?
SQLMAP es una herramienta de código abierto que automatiza el proceso de detección y explotación de fallos de inyección SQL y acceso a servidores de bases de datos. Su arquitectura está bien diseñada y viene con un motor de detección potente además de muchas características que permiten ir más allá de la recolección de datos de una base de datos, el acceso al sistema de archivos subyacente y la ejecución de comandos en el sistema operativo. En este corto artículo vamos a ver cómo aprovecharnos de vulnerabilidades que nos permiten subir una shell al servidor e incluso cambiar la contraseña del usuario administrador a través de ejecución de comandos con SQLi.
¿Cómo puedo subir una shell?
Antes de entrar en materia podemos ver en Security by Default un Cheatsheet de esta herramienta. Esta plantilla es realmente útil para no andar volviéndote loco con las funciones de SQLMAP que son muchas y muy variadas. Para el caso que nos ocupa, una vez descubierta una inyección vamos a usar dos parámetros. Uno para indicarle el fichero local que deseamos subir al servidor y otro para indicarle donde lo vamos a copiar en remoto.
El problema que se presenta en estos casos es que necesario que se cumplan algunas premisas primero que vamos a comentar a continuación.
- Conocer la ruta donde se encuentra el contenido web instalado en el servidor.
Puede ser una tarea algo tediosa pero es posible encontrar la ruta donde esta instalada y desplegada la aplicación web bien sea a través de fallos de programación o bien porque el modo debug esté activado, entre otros casos.
Este tipo de vulnerabilidades, aunque son marcadas como de riesgo bajo pueden proporcionar información muy útil a un atacante según va recopilando más información, es lo que conocemos como “information disclosure”. Este término significa que el servidor revela información interesante o incluso información interna sobre sí mismo.
Esto nos ayudará mucho durante un proceso de auditoría para conocer las rutas internas del servidor, detectar que versión exacta de sistema operativo se está utilizando o incluso para revelar la versión del servidor de aplicaciones desplegado. SQLMAP puede realizar ataques de fuerza bruta, pero si somos capaces de encontrar esta información, podemos ser más directos y provocar menos alarmas en los sistemas de detección de intrusos en el caso de estar desplegados.
- Tener permisos de escritura en esa ruta.
El objetivo de localizar la ruta es para poder luego invocar a la shell desde un navegador. Tener permisos de escritura en ella es igual de importante.
Si las carpetas fueron creadas con el usuario root y el administrador se ha preocupado de que las mismas no tengan permisos de escritura tendremos la cosa complicada, aunque no debemos de olvidar nunca lo enlaces simbólicos, que algunas veces los carga el diablo y nos permite invocar archivos de otras ubicaciones. Otras opciones que podemos intentar es la de localizar y explotar fallos “LFI”.
No debemos de olvidar comprobar si el usuario que está ejecutando la base de datos es el usuario DBA, en este caso tendremos muchas menos restricciones y el impacto de explotar un SQLi e intentar subir una shell puede que tenga más posibilidades de éxito.
A continuación se puede ver un ejemplo del comando.
1 2 |
# Ejemplo de inyección y subir un fichero sqlmap -u "http://192.168.1.252/login_action.php" "--data=username=admin&password=admin" --file-write=/var/www/c99.php --file-dest=/var/www/htm/c99.php |
Después de ejecutar el comando, SQLMAP ejecuta esta secuencia para subir el fichero llamado c99.php al servidor. A continuación, solo nos queda explotar la vulnerabilidad a través de un simple navegador. Una vez que tengamos la shell en el servidor podremos ejecutar muchas acciones sobre él, aunque también es posible que nos encontremos con restricciones que no nos permitan realizar ciertas acciones.
Cambiar la contraseña del administrador con un ataque SQLi
En esta prueba de concepto creamos una página asp “Active Server Pages” vulnerable a SQLi en un servidor Windows 2003 que contenga cualquiera de esta versión de base de datos: Windows SQL 2000, 2005, 2008 con xp-cmd activado. En las versiones 2000 y 2005 está activado por defecto, sin embargo, en las versiones posteriores no, por lo que deberemos hacerlos nosotros.
Si el usuario no es DBA o carece suficientes permisos no será posible realizar este ataque, nosotros hemos configurado el entorno para poder llevar a cabo esta prueba de concepto.
Herramientas
- SQLMAP user’s manual.
- SQLMAP ChangeLog e histórico de versiones.
- SQLMAP Frequently Asked Questions (FAQ).
- Material útil de SQLMAP.
Para la prueba de concepto tenemos un formulario de login con los campos txtlogin y txtpassword. Lo primero que probamos es introducir una comilla simple para ver si la estructura de la sentencia de SQL está mal implementada y esperar que con algo de suerte nos muestra algún error.
Lo habitual con una aplicación web es que devuelva un error que muestre un mensaje de SQL o por el contrario que simplemente muestre un error de aplicativo con código 500 o incluso que muestre una página de error definida. Lo importante va a ser analizar el contenido que devuelva.
Podemos verificar manualmente que la aplicación web es vulnerable bien sea por introducir una comilla simple o bien por introducir en el campo password una sentencia de SQL que nos permita realizar un bypass del formulario de login y acceder a su contenido a través de la sentencia (‘or+’1’=’1).
Significa que después de ver que es posible inyectar parámetros SQL podemos hacer otras acciones, en este caso vamos a cambiar la password al usuario administrador del servidor a través de la herramienta de SQLMAP.
Lo primero que voy hacer es ver como crea la query string del POST y para ello voy a utilizar el proxy Burp Suite para capturar la petición que luego utilizaré en el comando SQLMAP. SQLMAP tras realizar varias comprobaciones nos dirá que el parámetro es inyectable y por lo tanto vulnerable a SQLi.
1 2 |
# una vez consultado, la cosa quedaria de la siguiente manera sqlmap.py --url="http://servidorvulnerable.com/login.asp --data="txtlogin=pepe&txtpassword=juan" |
1 |
sqlmap.py --url="http://servidorvulnerable.com/login.asp --data="txtlogin=pepe&txtpassword=juan" --dba |
Si recibimos este mensaje significa que el usuario es el usuario DBA.
Nuestro objetivo ahora es poder ejecutar comandos en el servidor y para ello podemos usar múltiples opciones.
Podríamos usar la opción de –0s-pwn con –msf-path para combinar el ataque con metasploit y de ese modo inyectar un meterpreter y extraer las tablas con los hashes de los usuarios y no tener la necesidad de cambiar la password de ningún usuario. Como vamos hacer en este caso, es aún más fácil cambiar la contraseña al administrador.
Debemos de tener en cuenta que en una auditoría no se suele tener esta posibilidad, ya que cambiar la contraseña al administrador no es algo que deba hacerse, debe solamente reportarse. Es posible que existan múltiples servicios que estén corriendo con esa cuenta y por lo tanto podamos afectar a la producción o los servicios que se estén ejecutando en el cliente, puedo causar serios perjuicios.
Ejecutando desde SQLMAP es comando –os-shell podremos subir una shell en la cual podremos ejecutar diferentes comandos, entre ellos cambiar la contraseña ejecutando por ejemplo “net user administrador 12345” del mismo modo podemos crear usuarios y agregar al usuario al grupo administradores.
1 |
sqlmap.py --url="http://servidorvulnerable.com/login.asp --data="txtlogin=pepe&txtpassword=juan" --os-shell |
Tras introducir el comando nos preguntará si queremos ver la salida y podemos decir que si o que no, es recomensable mostrar la salida para asegurar que el comando fue ejecutado con éxito.
Os recomiendo los siguientes links de referencia: