WriteUp Jarvis de Hack The Box

Introducción

Jarvis es un CTF de dificultad Medium que podemos encontrar en la plataforma de Hack The Box. Es una aplicación web vulnerable a inyección SQL, existe un script de Python vulnerable a la inyección de comandos y finalmente, abusaremos de un binario SUID para obtener el acceso root.

Enumeración

NMAP

Como siempre, comenzamos realizando un escaneo de los servicios abiertos en el target.

Una vez tenemos los puertos de la máquina, vamos a realizar un escaneo más exhaustivo de los servicios abiertos.

Servicios disponibles

  • Puerto 80 HTTP
  • Puerto 22 SSH

Enumeración de directorios

Al visitar la URL  http://1010.10.143:80, obtenemos un sitio web de un hotel llamado Stark Hotel.

Vamos a buscar directorios interesantes para esta web. Para ello, vamos a utilizar la herramienta dirsearch.

Tenemos un resultado que puede ser interesante, /phpmtadmin.

phpMyAdmin es una herramienta destinada a manejar la administración de MySQL en la Web. phpMyAdmin admite una amplia gama de operaciones en MySQL y MariaDB. Las operaciones de uso frecuente (administración de bases de datos, tablas, columnas, relaciones, índices, usuarios, permisos, etc.) se pueden realizar a través de la interfaz de usuario.

Puede ser útil más adelante si encontramos credenciales válidas, pero por el momento, seguimos en la web.

Explotación

Inyección SQL en la sección “rooms-suites.php”

Hacemos clic en cualquiera de las habitaciones disponibles. Vemos que las solicitudes contienen un parámetro cod más el número de habitación.

Vamos a probar si es vulnerable a inyección SQL añadiendo una ‘ al final de la solitud. Esto genera un comportamiento erróneo en la aplicación.

Realizamos esta petición cod=1+and+1=1. Se recupera la información de la habitación, lo cual nos indica que el parámetro es vulnerable a inyección SQL. El siguiente paso será determinar el número de columnas de la consulta.

cod=1+union+select+1

cod=1+union+select+1,2

cod=1+union+select+1,2,3

cod=1+union+select+1,2,3,4

cod=1+union+select+1,2,3,4,5

cod=1+union+select+1,2,3,4,5,6

cod=1+union+select+1,2,3,4,5,6,7

cod=1+union+select+1,2,3,4,5,6,7,8

Realizo solicitudes con diferentes números de columnas y solo se provoca un error cuando introducimos la octava columna. Esto significa que la consulta tiene 7 columnas.

Una vez tenemos la información anterior, vamos a intentar extraer información realizando inyecciones SQL.

Tenemos un usuario DBadmin.

Tenemos el nombre de la base de datos: hotel. Vamos a probar si podemos leer archivos a través de esta vulnerabilidad de SQLi.

Tenemos la posibilidad de leer archivos internos del sistema. Sabiendo esto, vamos a intentar subir archivos al sistema objetivo.

Una vez creamos la petición y la lanzamos, si navegamos por http://10.10.10.143/test.txt vemos el contenido del archivo que hemos creado.

Sabiendo esto, vamos a crear una Shell PHP de prueba y la colocamos en el mismo directorio.

Podemos ver el usuario www-data. Vamos a intentar ganar acceso al sistema.

Acceso al sistema

Ya sabemos que podemos subir archivos al sistema a partir de la vulnerabilidad de SQL. Sabiendo esto, vamos a crear una Shell reversa.

Lanzamos una reverse Shell. Previamente, colocamos a la escucha la máquina atacante.

Estamos dentro del sistema.

Antes de continuar la Shell a una Bash, para facilitar el trabajo.

Vamos a comprobar que comandos podemos ejecutar con el usuario www-data. En ciertas ocasiones puede llevarnos a una escalada de privilegios.

Pivoting desde usuario www-data a Pepper

Como vemos el usuario www-data puede ejecutar el script simple.py como pepper. Veamos que función tiene este script.

Si ejecutamos el script, podemos observar una utilidad que lanza pings a máquinas definidas por el comando –p.

Vamos a analizar el código de este script en busca de alguna información que pueda ser interesante.

La opción – p (ping) puede ser interesante puesto que es raro que se implemente en Python. Debe existir una llamada a system o subprocess.

exec_ping se llama desde main si utilizamos el comando –p del script.

Vemos una inyección de comandos en exec_ping donde se lee la entrada command:

Aunque como podemos ver en el código tenemos limitados ciertos caracteres. Vamos a ejecutar un comando entre $(). Estos símbolos no se encuentran entre los limitados.

Este código funciona. Ejecuta ping a la IP 10.10.16.6.

Los caracteres limitados son primordiales en cualquier Shell conocida, por lo que vamos a escribir un archivo y luego a llamarlo desde el script.

Ya hemos generado la Shell en archivo. Vamos a ejecutar.

Ya somos usuario Pepper.

Volvemos a cambiar la Shell por una Bash de la misma manera que en el caso anterior. Ya podemos buscar la flag user.txt.

Elevación de privilegios

Ejecutamos LinEnum en la máquina víctima y encontramos interesante el siguiente resultado referido al binario SUID: el servicio systemctl.

Debido a que podemos ejecutar systemctl como root, podemos registrar nuevos servicios que se ejecutan como cualquier usuario que queramos.

Creamos el siguiente archivo.

Ahora uso systemctl para vincular este servicio:

Finalmente, iniciamos el servicio.

Por otro lado, tenemos activo un oyente en el puerto 4003.

Ya solo quedará buscar la flag root.txt, que podemos encontrar en el directorio /root.

No responses yet

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *