El Bandito | Try Hack Me

En este tutorial voy a mostrar como logré resolver la máquina "El Bandito" de Try Hack Me. Esta propiedad se presenta como un desafío de nivel dificil.

a183d2d10f868ab17143370c5834086e

29 de noviembre de 2024

Enumeración


En primer lugar, voy a realizar un escaneo de puertos con nmap:

nmapnmap portsnmap ports p2

Veo que se encuentran abiertos los puertos 22, 80, 8080 y 631.

Voy a ingresar en los puertos 80 y 8080 (el puerto 80 tiene la particularidad de que utiliza el protocolo HTTPS, mientras que el 8080 usa HTTP).

Ingresando al puerto 80 no encontré nada interesante de momento, simplemente un mensaje que dice “nothing to see”.

80

En el puerto 8080 me encontré con una página de una criptomoneda llamada “Bandit-Coin”.

8080

También hay una sección /burn.html, la cual permite quemar tokens:

burn

También intenté ingresar al puerto 631 para ver con que me encontraba y por lo que veo no tengo acceso:

err sin acceso

Investigando un poco encontré que el puerto 631 es comúnmente usado para servicios CUPS, el cual es un servicio que proporciona una interfaz web para gestionar impresoras. A parte por lo que puedo ver en el título de la pestaña, está usando la versión 2.4.7. Probablemente este puerto me sirva para más adelante sacarle provecho.

Lo que voy a hacer ahora es una búsqueda de directorios ocultos para el puerto 8080:

gobuster p1gobuster p2

Se encontraron una gran cantidad de directorios, de los cuales no puedo acceder a casi ninguno debido a un error 403, lo cual significa que no tengo permisos para acceder.

Voy a realizar lo mismo para el puerto 80:

gobuster 80

Al ingresar en /Access me encuentro con un login:

access

A continuación lo que hice fue buscar todos los archivos que se encuentran en la IP, tanto para el puerto 80 como para el puerto 8080, lo hice con gobuster:

gobuster dir -u http://10.10.191.220:8080 -w /usr/share/seclists/Discovery/Web-Content/raft-medium-files.txt -x php,txt,js,json

Y encontré que hay un archivo /services.html, que contiene los detalles del estado del ecosistema:

service

Explotación


Investigando el código fuente de la maquina note este fragmento de javascript:

const response = await fetch(`/isOnline?url=${serviceUrl}`, { method: 'GET' });

El cual puede llegar a representar una vulnerabilidad, ya que el navegador está enviando una petición al backend con una URL externa como parámetro. Esto nos habilita a poder enviar cualquier otra petición para probar y que sea interpretada como correcta, ya que la enviamos desde una url conocida.

Voy a interceptar la conexión con burpsuite para ver si le puedo montar un servidor propio y pasarlo como parámetro en la url.

El primer paso es montar un servidor con Python:

Python3 –m http.server 8000

Luego voy a pasar mi dirección IP junto con el puerto en la url desde burpsuit:

port 200 test

Lo que voy a hacer ahora es utilizar un payload que me permita realizar un bypass y así poder ingresar en las url que estaban bloqueadas. El payload es el siguiente:

import sys

from http.server import HTTPServer, BaseHTTPRequestHandler

if len(sys.argv)-1 != 1:

print("""

Usage: {}

""".format(sys.argv[0]))

sys.exit()

class Redirect(BaseHTTPRequestHandler):

def do_GET(self):

self.protocol_version = "HTTP/1.1"

self.send_response(101)

self.end_headers()

HTTPServer(("", int(sys.argv[1])), Redirect).serve_forever()

Lo voy a guardar bajo el nombre server.py y voy a dejarlo escuchando con el siguiente comando:

python3 server.py 5555

Para finalizar me dirijo a burpsuit y voy a pasar como parámetro de url mi dirección ip:5555, adicionalmente a la petición de burpsuit hay que agregarle ciertos valores para que el bypass se realice con éxito. Este es el payload que hice en burpsuite:

GET /check-url?server=http://10.10.11.155:5555 HTTP/1.1

Host: MACHINE_IP:8002

Sec-WebSocket-Version: 13

Upgrade: WebSocket

Connection: Upgrade

Sec-WebSocket-Key: nf6dB8Pb/BLinZ7UexUXHg==

GET /flag HTTP/1.1

Host: MACHINE_IP:8002

¡Y es un éxito! Logre acceder a /env

burp bypass env

Por lo que obtuve en /env me doy cuenta que estoy ante una aplicación “java spring boot”, por lo que me puse a buscar vulnerabilidades de java spring boot y encontré una vulnerabilidad que parece ser la mas conocida para este tipo de aplicaiones y es la de “Spring Boot Actuator Exposed“. Básicamente implica que la aplicación deja expuestos los endpoints.

Dejo acá el enlace del cual obtuve esta información:

https://github.com/pyn3rd/Spring-Boot-Vulnerability

Para este punto voy a realizar lo mismo que en el paso anterior solo que esta vez en lugar de /env voy a usar /mappings (este es un endpoints donde se almacenan todas las rutas).

mappings

Acá me encuentro con datos sumamente valiosos. Veo una ruta /admin-creds y otra ruta /admin-flag.

Al ingresar en /admin-creds obtengo unas credenciales: username:hAckLIEN password:YouCanCatchUsInYourDreams404

admin-creds

Y en admin-flag obtengo la primera bandera:

admin-flag

Lo que voy a hacer ahora es dirigirme a /Access del puerto 80 para probar esas credenciales que encontré:

access ok

Y así logro ingresar. Al realizar el login me lleva directamente a /messages. Es una aplicación para chatear y por lo que veo ya hay un chat iniciado en hakalien y Jack.

Analizando las solicitudes veo que en la pestaña “network” del inspector al enviar un mensaje se realiza una petición POST a /send_messages.

send messages

Además analizando el código fuente encontré un archivo /statics/messages.js en donde encontré otra ruta /getMessages.

Me voy a dirigir a burpsuit para analizar las tres solicitudes (/messages, /send_messages y /getMessages).

En /send_messages se me indica que la petición no es la correcta, ya que se trata de un GET y debería ser un POST, al modificarlo obtengo un mensaje de recibido.

send POST

Todas las solicitudes que realicé son HTTP/2, no hay muchas posibilidades de hacer smuggling en HTTP/2, a menos que podamos forzar al servidor a que use HTTP/1.1.

Voy a pasar la petición a HTTP/1.1 para ver si es compatible:

send message http1.1

Y por lo visto si es compatible.

Lo que se me ocurre es que puede ser vulnerable a H2.CL, este es un ataque en donde el frontend recibe una petición HTTP/2 y el backend entiende solo HTTP/1.1. Si logro manipular el Content-Length, puedo hacer que el backend se descincronice e inyectar una petición que se ejecute con la sesión de otro usuario.

503

Me arrojo un error 503, lo que significa que logré desincronizar al backend, ahora me dirijo hacia /getMessages para ver si pude capturar algo.

flag2

¡Y así encuentro la última bandera!

Espero que este tutorial te haya ayudado!