12 septiembre 2012

SQLMap, algo más que Dump



SQLMap es una herramienta muy completa y flexible. Fue creada por Bernardo Damele Assumpcao Guimaraes y Miroslav Stampar. Se caracteriza por permitir la realización de ataques de SQL Injection automatizados contra un sitio web vulnerable y, debido a su gran variedad de opciones, se podrá personalizar las técnicas usadas dependiendo del objetivo. 

SQLMap agrupa sus comandos por categorías, denominadas de la siguiente forma: Target, Request, Optimization, Injection, Detection, Techniques, Fingerprint, Enumeration, Brute force, User-defined function injection, File system access, Operating system access, Windows registry access, General y Miscellaneous. Todas estas categorías se encuentran detalladas en el manual de esta herramienta, que esta disponible en el siguiente enlace sqlmap.sourceforge.net/doc/README.pdf.

A pesar de las múltiples funciones que trae consigo SQLMap, el comando mas usado y conocido por muchos es dump, con el cual se podrá bajar o dumpear la base de datos. En esta ocasión haré caso omiso de dump, y "jugaré" con otras opciones que también me parecen interesantes; sin embargo, no hablaré de todas, puesto que no pretendo realizar un manual. Mirando el --help de esta herramienta podremos encontrar todos los comandos que nos permitirán personalizar las técnicas usadas dependiendo de la aplicación en que nos encontremos.

Tomaré como ejemplo un sitio vulnerable a SQL Injection para la realización de esta practica. Con el fin de proteger la identidad y los datos sensibles que puedan ser expuestos, algunas imágenes y consultas han sido modificadas.

Teniendo ya mi sitio con una variable vulnerable a SQL Injection, lo primero que se me vino a la mente fue saber con qué usuario se están realizando las peticiones, para ello uso el  parámetro --Current-user y armo mi consulta de la siguiente forma:



Como respuesta, el servidor trae el nombre del usuario como se presenta en la siguiente imagen:





Ya identificado el usuario, quiero saber si este es el administrador de la base de datos, para lo cual use --is-dba. Y si quiero saber a qué base de datos se está conectando usaré: --Current-db





La consulta anterior nos dice que no es el dba.




Ahora se necesita saber qué privilegios posee el usuario que realiza dicha consulta dentro del servidor, para así poder enfocar mejor nuestro vector de ataque. El comando a usar para la enumeración de los privilegios es --privileges






Se encontraron varios "administradores", pero con distintos privilegios. A continuación presento solo el resultado de nuestro usuario:




Como se observa en la imagen anterior, se poseen muchos privilegios; ahora sí todo depende de la imaginación y del objetivo del atacante.

Al momento de identificar si el sitio era vulnerable o no a la técnica de SQL Injection, se generaron errores en la aplicación y gracias a que hay un mal manejo de ellos se pudo obtener la ruta raíz del servidor (Full path disclosure). Ésta será de ayuda más adelante para la lectura y escritura de algunas páginas, siempre y cuando el usuario de la consulta tenga los permisos suficientes en el servidor web.

Para realizar la lectura de ficheros se usa el comando --file-read acompañado de la ruta en que se encuentra este, para este caso "/etc/passwd"





Como respuesta, SQLMap lo descarga y lo guarda en la carpeta files.





Además, esta herramienta permite la lectura del código fuente de las páginas de la aplicación que se le especifique. Para este ejemplo, el objetivo era conseguir los datos de conexión de la base de datos. Para ello, le pedí a SQLMap leer la pagina de inicio, index.php






En el código fuente extraído, se muestra que hay una pagina que está incluyendo, conn.php. Posiblemente ésta nos brinde más información.





Leyendo conn.php





Y ésta nos da más datos, esta vez la ruta donde se encuentra la información que se está buscando.




Leyendo Ruta/local_db.inc






y como respuesta tenemos los datos de conexión de la base de datos:



Y si lo que se quiere es tener una shell sql, con el siguiente comando --sql-shell se puede obtener de la siguiente forma:






Como respuesta nos da una shell sql en donde se podrá realizar consultas, como se muestra a continuación:





En caso de poseer los suficientes privilegios, se podrá ejecutar comandos en el sistema operativo, entre otra multitud de acciones. Para no hacer muy extenso este post solo usaré el comando --os-shell, que nos permitirá conseguir una shell en el servidor.






Después de ejecutar la sentencia anterior, SQLMap nos arrojará información sobre el sistema operativo en el que corre la aplicación y pedirá que se le especifique el lenguaje de la misma y la ruta raíz del servidor.



Y finalmente, crea una página, en este caso en php, en el servidor con la ruta especificada con el siguiente código:





Esta página que se insertó en el servidor web nos permitirá subir cualquier archivo, en este caso una phpshell, para así tener control completo del sitio.





Estas son unas pocas muestras de la potencia y flexibilidad de las opciones no tan populares de esta fantástica herramienta. Es aconsejable investigar con mayor profundidad las posibilidades de SQLMap, ya que serán de gran utilidad en próximas auditorías.

Contribución cortesía de Karina Padilla Torres


6 comments :

Drederik dijo...

Un post realmente bueno ! no sabía que SQLmap era tan completo.


Muchas gracias !

LagartoSeb dijo...

Amigo no quiero ser severo ni aguafiestas, pero leyendo el post (que dicho sea de paso esta muy bueno, felicitaciones) en el primer comando "-current-user" que aparece ahi, antes de -current-user va otro - (guion medio), quedando asi '--current-user, como la mayoria de comandos de las opciones de Enumeration de sqlmap. Sigo esperando mas aportes tuyos, saludos (;

d3nn dijo...

aclaraste alguna dudas que tenia, felicitaciones por el post y sigue adelante, gracias.

Matias Alvarado dijo...

perfecto gracias

camilo dijo...

a que te refieres a ruta_raiz_servidor_web ??

vrS dijo...

Necesitas una ruta absoluta para poder incluir la shell