DogCat es una maquina de TryHackMe, explotando la vulnerabilidad LFI con wrappers de PHP obtuvimos la primera flag. Realizando Log Poisoning obtuvimos una shell. Escalamos privilegios utilizando ENV y Sudo en contenedor de Docker. Un script ejecutado por un CronJob del Host permitio escalar privilegios.
Room
Titulo | dogcat |
---|---|
Descripción | I made a website where you can look at pictures of dogs and/or cats! Exploit a PHP application via LFI and break out of a docker container. |
Puntos | 435 |
Dificultad | Media |
Maker |
NMAP
Escaneo de puertos tcp, nmap nos muestra el puerto http (445) y el puerto ssh (22) abiertos.
|
|
GOBUSTER
Utilizamos gobuster para busqueda de directorios y archivos.
|
|
HTTP
Encontramos una pagina sencilla en el puerto 80, que al darle click a la opcion de perro (dog) nos muestra una imagen.
Vemos que en la url le pasa por parametro la palabra dog. Dentro del escaneo de GOBUSTER vimos que existe un archivo cat y dog con extension en php, al ver el codigo fuente de ambas paginas y al recargar por repetidas ocaciones la imagen que genera junto al codigo html es distinta.
Por lo que cada vez que se selecciona la opcion de dog o cat, nos muéstra distintas imagenes.
LFI - CAT OR DOG
Intentamos utilizar LFI basico (/etc/passwd, /var/log/apache2/access.log, etc) pero no logramos leer ninguno de los archivos ya que la pagina nos mostraba el mensaje Sorry, only dogs or cats are allowed.
.
Lo curioso de este reto es que, al pasarle la palabra cat dentro de una peticion de un archivo o lo que fuera, nos mostraba el mensaje Here you go!
y un error de la funcion include()
. Desde aqui tiene un poco de sentido el mensaje de error anterior (Sorry, only dogs or cats are allowed.
) podemos utilizar tanto dog o cat dentro de las peticiones para que sean aceptadas.
Utilizamos php://filter/convert.base64-encode/dog/resource=ARCHIVO
para leer archivos, en este caso leemos el archivo index.php que es el que utiliza ?view=
, logramos obtener el archivo en base64.
Logramos obtener el codigo fuente de index.php, logramos ver que hay una funcion que verifica si existe cat o dog dentro de la peticion, tambien vemos que podemos enviarle como parametro una extension de lo contrario la tomara como .php
.
**ALERTA DE SPOILER** `SPOILER` `SPOILER` `SPOILER`
|
|
Leemos el archivo flag.php y logramos leer nuestra primera flag.
RCE - Apache Log Poisoning
Utilizamos el User-Agent para poder ejecutar nuestro codigo php el que tendra como objetivo obtener y ejecutar un comando que le pasemos. Utilizamos php://filter/dog/resource=../../../../var/log/apache2/access.log&ext=
para leer el archivo log, además de esto agregamos el comando que deseamos ejecutar en la maquina &cmd=whoami
, por lo que luciría de la siguiente forma.
|
|
Vemos que en la respuesta tenemos acceso como usuario www-data
.
USER - WWW-DATA [ DOCKER ]
Ahora, creamos un archivo que contenga una shell inversa para descargarlo mediante un servidor de python (python3 -m http.server 80) en la maquina.
Comando para descargar y ejecutar nuestra shell (Codificamos a URL los espacios)
|
|
Logramos obtener una shell con el usuario www-data.
Nuestra segunda flag.
PRIVILEGE ESCALATION - DOCKER
Hacemos una pequeña enumeracion con sudo -l -l
y vemos que tenemos permisos root (sudo) para ejecutar el comando env
. Utilizamos env para obtener una shell root.
|
|
Òbtenemos nuestra shell como usuario root y nuestra tercera flag.
ESCAPING DOCKER
Tenemos privilegio root pero vemos que estamos limitados de comandos y vemos en la raiz de la maquina que existe un archivo .dockerenv
por lo que en el lugar que estamos es un contenedor.
Dentro de la carpeta /opt/backup
encontramos una carpeta que contiene dos archivos un bash y un tar, los cuales se utilizaron para crear el contenedor (backup.tar), vemos que el archivo bash descomprimer el archivo tar dentro de /root/container. Agregamos un ping hacia nuestra maquina en el archivo y logramos obtener paquetes en tcpdump.
TCPDUMP
Podemos deducir que existe un crontab que ejecuta el archibo backup.sh, ahora, agregamos una shell inversa a este archivo y ponemos a la escucha netcat en nuestra maquina y esperamos a que nos devuelva una shell.
SHELL
NETCAT
Logramos obtener una shell y nuestra ultima flag.
Crontab del archivo backup.sh