DEV Community

arturo melgarejo
arturo melgarejo

Posted on

Baby-Cached WriteUp

El challenge consiste en un Side-Server Request Forgery, y alguna cosa mas que hay que resolver antes de poder conseguir la flag.
Es un reto de la categoría Web en HackTheBox, siendo su dificultad Facil , pero originalmente catalogado como Medio. Esta retirado, por lo que no hay problemas en hacer writeups.

El funcionamiento de la pagina es el siguiente: Le pasas una URL y el te devuelve una screenshot de la misma.

Explotación
No haría ni falta ver el codigo, ya que analizandolo con Burp y inspeccionando la web nos damos cuenta que no hay apis escondidas, ni nada mas.

El único input que podemos explotar entonces es la pagina web. No obstante aunque sepamos que es un SSRF, necesitamos ver como explotarlo y que grado de severidad tiene, para eso inspeccionamos el codigo. Observamos que dentro de las rutas disponibles hay una que carga una imagen flag.png. No hay mas preguntas señoria. Ese es nuestro objetivo. Pero solamente se puede acceder si url origen es 127.0.0.1.

Vemos una llamada a una función cachear_web

Como curiosidad, aunque no nos va a hacer falta para nuestro reto, no nos deja usar FTP o GOPHER en vez de HTTP en la url para poder pivotar a otros servicios. No es relevante. Además vemos que se realiza una comprobación de si el hostname REAL que le hemos pasado es localhost o alguna forma de llegar directamente hacia el mismo.
Esto provoca que el exploit no sea tan sencillo de poner simplemente http://127.0.0.1/flag por ejemplo.

Entonces ¿Como lo explotamos?. Aunque no lo he mencionado, usa Selenium, para cargar la web y posteriormente una vez cargada o pasados 10 segundos, lo que antes ocurra, hace una screenshot.

La clave esta en saber que es selenium. Selenium es un webdriver que tiene librerías disponibles en varios lenguajes de programacion. Esencialmente permite la automatización de paginas web humanizando el proceso, es decir, abre el navegador literalmente en la maquina como si fueras tu mismo. Vamos a bypassear por tanto los filtros con nuestra propia pagina web.
La idea es muy simple: Crear una pagina web que cargue contenidos de una url de la misma maquina (127.0.0.1), de esta forma no le pasamos directamente un 127.0.0.1, si no que le pasamos un html que carga contenidos de esa web deseada.

En un principio me complique y empece a hacerlo con javascript, cosa que hubiera funcionado y es totalmente legitima… ¿lo es?
No, no lo era xd, por alguna extraña razon (ya que es mas complejo que la segunda solucion), habían deshabilitado javascript. Puede ser por seguridad. No lo vi.

Vamos a hacerlo mucho mas sencillo. Los pasos son los siguientes:

  • Crearemos una web con Flask que cargue una imagen desde 127.0.0.1
  • Bypassearemos los firewalls de nuestra casa con un proxy inverso del estilo ngrok o en mi caso el de cloudfare.
  • Finalmente, enviaremos a la web vulnerable la url de la nuestra.

Codigo del servidor:

app.py

from flask import Flask, send_file, request, jsonify, render_template
from werkzeug.utils import secure_filename

aplicacion = Flask

app = Flask(__name__)
@app.route('/upload', methods=['POST'])
def upload_reenviada():
 if 'archivo' in request.files:
  archivo = request.files['archivo']
  filename = archivo.filename
  archivo.save(os.path.join('upload', secure_filename(filename)))
  return "ok"
 return "error"

@app.route('/1', methods=['GET'])
def pagina_principal():
 return render_template('prueba.html')

if __name__ == "__main__":
 app.run('0.0.0.0', 80)
Enter fullscreen mode Exit fullscreen mode

La ruta upload es un extra para usar javascript y enviar el archivo desde el cliente.

prueba.html

<html>
<body>

<img src="http://localhost/flag">

</body>
</html>
Enter fullscreen mode Exit fullscreen mode

Comandos bash reverse proxy — Cloudfare y setup servidor

python3 app.py
./cloudflared-linux-amd64 -url http://localhost:80
Enter fullscreen mode Exit fullscreen mode

La url que devuelva cloudfare, se la pasamos a la web vulnerable con la ruta /1.

Flag

Top comments (0)