PDFy
2 minutos de lectura
Tenemos una aplicación web que nos permite ingresar una URL y generar un archivo PDF del sitio web indicado:
Enumeración
Esta vez no tenemos el código fuente de la aplicación, por lo que debemos enumerar el sitio web. Por ejemplo, creemos un PDF:
Si echamos un vistazo a las propiedades del archivo PDF, veremos que se genera con wkhtmltopdf
versión 0.12.5:
Si buscamos vulnerabilidades de esta versión, encontraremos CVE-2022-35583. Una descripción más detallada de la vulnerabilidad se puede encontrar aquí.
Server-Side Request Forgery
La herramienta de generación PDF es vulnerable a Server-Side Request Forgery (SSRF), lo que significa que podemos acceder a cualquier endpoint. Por ejemplo, podemos generar un PDF del mismo sitio web de reto (http://127.0.0.1:1337
):
Solución
Nuestro objetivo es filtrar el archivo /etc/passwd
. Como wkhtmltopdf
está cargando el HTML de un sitio web, podríamos intentar inyectar código JavaScript o usar etiquetas HTML especiales para cargar un archivo local en la página web.
Después de probar algunos payloads de HackTricks, y ver que no funcionan, podemos asumir que no es la manera de resolver el reto.
Entonces, podemos usar otro enfoque de SSRF, que es usar una redirección (como se indica en este issue de GitHub). Por ejemplo, podemos usar el siguiente servidor en Flask:
#!/usr/bin/python3
from flask import Flask, redirect
app = Flask(__name__)
@app.route('/')
def index():
return redirect('file:///etc/passwd')
app.run(host='0.0.0.0')
Podemos usar un VPS o ngrok
para exponer el servidor en Internet, y luego decirle a la aplicación web que genere un PDF de esa URL. El resultado es que wkhtmltopdf
será redirigido a file:///etc/passwd
y generará un PDF de este archivo.
Flag
Entonces, filtramos el archivo /etc/passwd
y conseguimos la flag:
HTB{pdF_g3n3r4t1on_g03s_brrr!}