En esta ocasión vamos a hacer el writeup de la máquina Strutted de Hack the Box, una máquina Linux de dificultad Medium.
Información General
Nombre de la máquina:Strutted
IP:10.10.11.59
Sistema operativo:Linux
Dificultad:🟡 Media
Fecha:29/12/2025
Reconocimiento Inicial
Escaneo de Puertos
Escaneo Simple
Solo encontramos puertos comunes (22 y 80) abiertos. Nos centraremos en el servicio web.
Añadimos la IP al /etc/hosts
Acceso Web
Accedemos a http://strutted.htb y observamos que parece ser una plataforma en la que al subir un archivo genera un link para compartirlo, estilo WeTransfer:
Al pulsar en el botón Download nos descarga el contenedor Docker de la aplicación:
El archivo tomcat-users.xml revela una contraseña en plano de admin:
El archivo pom.xml revela que usa el framework Apache Struts:
Buscando la versión de Struts encontramos que usa la 6.3.0.1:
Explotación
Investigación de CVEs / Exploits
Exploramos CVEs relacionados con Apache Struts 6.3.0.1 en fuentes como:
Al capturar una subida de una imagen con BurpSuite vemos que hace una petición POST a /upload.action y eso nos genera un link en /uploads/FECHA_HORA/imagen.jpg:
También podemos eliminar algunas cadenas PNG, agregar el código cmd.jsp y aún así recibir un mensaje de éxito y una ruta de carga.
Ahora necesitamos manipular la carga del archivo añadiendo el parámetro top.uploadFileName para copiarlo a una ubicación sensible, como el directorio ROOT de Tomcat. Además, debemos cambiar la "u" minúscula de upload por una "U" mayúscula.
Al final de la petición añadimos:
Copiamos la URL y hacemos un forward para enviar la petición y acceder a la webshell:
Tenemos una shell como el usuario Tomcat. En el directorio /home solo encontramos un usuario: james:
No encontramos ninguna manera sencilla de obtener un reverse shell, así que revisamos los directorios y encontramos el archivo tomcat-users.xml en /var/lib/tomcat9/conf.
Como el webshell no podía mostrar el contenido de ese archivo directamente, lo solucionamos usando curl para obtener la URL y guardar su contenido en un archivo:
Al abrir el archivo encontramos la contraseña en plano de james:
User Flag
Accedemos correctamente por SSH y nos hacemos con la user flag:
Escalada de Privilegios
Enumeración de Privilegios
Observamos que podemos ejecutar tcpdump como sudo:
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.10 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 3e:ea:45:4b:c5:d1:6d:6f:e2:d4:d1:3b:0a:3d:a9:4f (ECDSA)
|_ 256 64:cc:75:de:4a:e6:a5:b4:73:eb:3f:1b:cf:b4:e3:94 (ED25519)
80/tcp open http nginx 1.18.0 (Ubuntu)
|_http-title: Did not follow redirect to http://strutted.htb/
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
|_http-server-header: nginx/1.18.0 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
sudo echo "10.10.11.59 strutted.htb" | sudo tee -a /etc/hosts
ls -la
drwxrwxr-x kali kali 4.0 KB Fri Dec 26 18:56:10 2025 .
drwxrwxr-x kali kali 4.0 KB Fri Dec 26 18:56:18 2025 ..
.rw-r--r-- kali kali 1.3 KB Tue Jan 7 13:59:33 2025 context.xml
.rw-r--r-- kali kali 615 B Tue Jan 7 13:59:33 2025 Dockerfile
.rw-r--r-- kali kali 4.0 KB Tue Jan 7 13:59:33 2025 README.md
drwxr-xr-x kali kali 4.0 KB Tue Jan 7 13:59:33 2025 strutted
.rw-r--r-- kali kali 222 B Tue Jan 7 13:59:33 2025 tomcat-users.xml
-bash-5.1$ sudo -l
Matching Defaults entries for james on localhost:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty
User james may run the following commands on localhost:
(ALL) NOPASSWD: /usr/sbin/tcpdump