TryHackMe – GameZone walkthrough

Buenas de nuevo! Vamos a resolver la máquina GameZone del Offensive Path de TryHackMe. Es una máquina Linux en la que nos aprovecharemos de Inyección SQL para extraer datos de la base de datos. Posteriormente crackearemos el hash de un user para obtener acceso a la máquina vía SSH. Crearemos un túnel para tener acceso a un webmin vulnerable interno de la máquina y conseguir explotarlo consiguiendo privilegios del usuario root.

Reconocimiento de puertos abiertos

Empezamos haciendo un reconocimiento de puertos abiertos.

sudo nmap -p- --open -sS --min-rate 5000 10.10.96.42 -n -Pn -oG allPorts

Starting Nmap 7.92 ( https://nmap.org ) at 2022-01-23 09:18 CET
Nmap scan report for 10.10.96.42
Host is up (0.045s latency).
Not shown: 65497 closed tcp ports (reset), 36 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

Nmap done: 1 IP address (1 host up) scanned in 12.42 seconds

Puerto 22 y 80, le lanzamos scripts básicos de enumeración.

nmap -p22,80 -sCV 10.10.96.42 -oN gameZone.Nmap

Starting Nmap 7.92 ( https://nmap.org ) at 2022-01-23 09:21 CET
Nmap scan report for 10.10.96.42
Host is up (0.047s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.2p2 Ubuntu 4ubuntu2.7 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 61:ea:89:f1:d4:a7:dc:a5:50:f7:6d:89:c3:af:0b:03 (RSA)
|   256 b3:7d:72:46:1e:d3:41:b6:6a:91:15:16:c9:4a:a5:fa (ECDSA)
|_  256 53:67:09:dc:ff:fb:3a:3e:fb:fe:cf:d8:6d:41:27:ab (ED25519)
80/tcp open  http    Apache httpd 2.4.18 ((Ubuntu))
| http-cookie-flags: 
|   /: 
|     PHPSESSID: 
|_      httponly flag not set
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Game Zone
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: 1 IP address (1 host up) scanned in 13.02 seconds

Nmap nos reporta versiones de OpenSSH, Apache y poco más. Esa versión de OpenSSH es vulnerable a enumeración de usuarios pero sabemos que el camino va por el puerto 80, así que vamos a echarle un vistazo.

WhatWeb

whatweb http://10.10.96.42 | tee whatweb.log

Whatweb no añade mucha más información de la que ya sabíamos, podemos intuir por las cookies que se ejecuta en PHP y viendo el PasswordFeld que tendremos un formulario de login. Vamos a echar un vistazo a la web con el navegador.

Enumeración manual puerto 80

Podemos ver varios menús y formularios, ya os adelanto que lo único “funcional” es el User Login…y de aquella manera. Probamos combinaciones típicas … root:root, root:password, admin:admin, admin:password… nada!

Inyección SQL

Llegados a este punto, podemos probar si los datos enviados por el formulario están bien sanitizados. Combinación típica que se puede probar en este caso es la de ‘ OR 1=1– –

Bien! Conseguimos bypassear el login y acceder al portal.php.

Probamos el siguiente formulario, nos pide el nombre de un juego a buscar, no sabemos que nombres habrán, así que vamos probando varias letras y conseguimos sacar datos sobre el juego Call of Duty introduciendo la letra “C“.

Vale, que pasaría si introducimos la típica comilla simple para provocar un error?

Parece que hemos provocado un error SQL con esa comilla simple, además nos indica que es un MySQL. Vamos a ver si podemos aprovecharnos de este formulario para obtener datos de la base de datos.

El primer paso es determinar el número de columnas que devuelve. Esto lo podemos ver con la cláusula ORDER BY. Probando ordenar por 1, 2 o 3 no nos da error…pero en el 4 sí!

Esto quiere decir que la consulta SQL que hay por detrás devuelve 3 columnas.
Segundo paso, vamos a ver que campos podemos utilizar para imprimir datos.

' UNION SELECT 'a','b','c'-- -

Vale, sabemos que el segundo campo de la consulta es para Title y el tercer campo para Review.
Tercer paso, vamos a sacar los nombres de las bases de datos existentes.

' UNION SELECT null,schema_name,null FROM information_schema.schemata-- -

Existen 5 bases de datos, vamos a revisar la db que es donde están los datos que necesitamos.
Cuarto paso, sacamos las tablas de esa base de datos.

' UNION SELECT null,table_name,null FROM information_schema.tables WHERE table_schema='db'-- -

Nos devuelven 2 tablas, post y users.
Quinto paso, sacamos las columnas de la tabla users de la base de datos db.

' UNION SELECT null,column_name,null FROM information_schema.columns WHERE table_name='users' AND table_schema='db'-- -

La tabla users únicamente dos campos, username y pwd.
Último paso, sacar usuarios y contraseñas de esa tabla.

' UNION SELECT null,username,pwd FROM users-- -

Aquí lo tenemos! Hemos conseguido sacar el usuario y su hash de la base de datos.

Crackeando con Hashcat

Guardamos el hash en local para hacer fuerza bruta con hashcat.

hashcat -m 1400 hash /usr/share/wordlists/rockyou.txt

Crackeada! Vamos a probar esas credenciales al servicio SSH.

Escalación de privilegios

Ya tenemos acceso a la máquina y enumerando podemos ver que hay un servicio corriendo en el puerto 10000 que nmap no nos los había sacado.

Si intentamos acceder con netcat nos rechaza la comunicación pero nos muestra el servicio que está corriendo.

Perfecto, está corriendo webmin pero solo tenemos acceso desde la máquina. Vamos a crear un túnel para tener acceso a ese puerto en nuestra máquina. Esto lo podemos hacer con el mismo servicio SSH.

ssh -L 10000:localhost:10000 [email protected]

Ya tenemos el túnel creado! Ya podemos acceder desde el navegador.

Accediendo con las credenciales de agent47 podemos ver la versión de webmin.

Aún teniendo acceso al servicio no podemos hacer nada en el sistema.
Buscando si esa versión es vulnerable nos encontramos con este repositorio de John Hammond.
https://github.com/JohnHammond/CVE-2012-2982

Nos descargamos el exploit y vemos su funcionamiento. Debemos indicarle la url, el usuario, contraseña y el comando a ejecutar en el sistema.

Aparentemente ha ido todo bien, pero no recibimos ningún output. Vamos a intentar entablar una reverse-shell.

Rooted!

Óscar Montoya