viernes, 4 de febrero de 2022

TryHackMe: SQLMap Writeup

Explotación de la vulnerabilidad SQL Injection con sqlmap - Byte Mind

En esta ocasión os traigo una entrada para el blog algo distinta de a lo que estoy acostumbrado. 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 demás de cómo se soluciona, eso sí, sin poneros las respuestas para que podáis afrontar este reto con una guía pero sin 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.


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:


Vemos 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.

No hay comentarios:

Publicar un comentario