hacktricks/network-services-pentesting/pentesting-web/flask.md

13 KiB

Flask

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Utilisez Trickest pour construire et automatiser des flux de travail alimentés par les outils communautaires les plus avancés au monde.
Obtenez un accès aujourd'hui :

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

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

Cookies

Le nom de session par défaut du cookie 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-le 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 la méthode brute et créer des cookies de session d'une application Flask en devinant les clés secrètes.

{% embed url="https://pypi.org/project/flask-unsign/" %}

pip3 install flask-unsign

Le décodage d'un cookie peut être utile lors d'un test d'intrusion pour analyser les informations stockées dans le cookie. Cela peut révéler des données sensibles telles que des identifiants de session, des informations d'authentification ou d'autres informations confidentielles.

Pour décoder un cookie, vous pouvez utiliser des outils en ligne tels que "base64decode.net" ou des bibliothèques de programmation telles que "base64" en Python. Ces outils vous permettent de décoder le contenu du cookie à partir de son encodage en base64.

Voici un exemple de code Python pour décoder un cookie en utilisant la bibliothèque "base64" :

import base64

def decode_cookie(cookie):
    decoded_cookie = base64.b64decode(cookie)
    return decoded_cookie

cookie = "SGVsbG8gV29ybGQh"
decoded_cookie = decode_cookie(cookie)
print(decoded_cookie)

Dans cet exemple, nous utilisons la fonction b64decode de la bibliothèque base64 pour décoder le cookie. Le résultat est ensuite affiché à l'écran.

Il est important de noter que le décodage d'un cookie ne garantit pas que vous pourrez accéder à toutes les informations sensibles. Certains cookies peuvent être chiffrés ou avoir d'autres mécanismes de protection qui empêchent leur décodage. Cependant, le décodage du cookie peut être une étape importante dans l'analyse des informations stockées dans celui-ci.

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

Brute Force

La technique de Brute Force est une méthode d'attaque utilisée pour essayer toutes les combinaisons possibles de mots de passe jusqu'à ce que le bon soit trouvé. C'est une approche simple mais efficace pour accéder à un système en exploitant les faiblesses des mots de passe faibles. Les attaquants utilisent généralement des outils automatisés pour effectuer cette tâche, ce qui leur permet de tester rapidement un grand nombre de combinaisons. Pour se protéger contre les attaques de force brute, il est important d'utiliser des mots de passe forts et de mettre en place des mesures de sécurité supplémentaires, telles que des verrouillages de compte après un certain nombre de tentatives infructueuses.

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

Signature

La signature est un mécanisme utilisé pour vérifier l'intégrité et l'authenticité des données. Elle est généralement utilisée pour garantir que les données n'ont pas été modifiées pendant le transit et qu'elles proviennent d'une source fiable.

Dans le contexte du développement web, la signature est souvent utilisée pour protéger les cookies de session et les tokens d'authentification. Lorsqu'un cookie ou un token est signé, il est associé à une clé secrète connue uniquement par le serveur. Lorsque le serveur reçoit le cookie ou le token, il peut vérifier la signature en recalculant celle-ci à l'aide de la clé secrète. Si la signature correspond, cela signifie que les données n'ont pas été modifiées et qu'elles proviennent du serveur.

La bibliothèque Flask, utilisée pour le développement d'applications web en Python, fournit un mécanisme de signature intégré appelé "Flask-Signing". Cette extension permet de signer et de vérifier les données de manière sécurisée.

Pour signer des données avec Flask-Signing, vous pouvez utiliser la fonction signer fournie par l'extension. Par exemple :

from flask import Flask
from itsdangerous import URLSafeTimedSerializer

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key'

s = URLSafeTimedSerializer(app.config['SECRET_KEY'])

@app.route('/')
def index():
    data = {'username': 'Alice'}
    signed_data = s.dumps(data)
    return signed_data

Dans cet exemple, nous importons la classe URLSafeTimedSerializer de la bibliothèque itsdangerous, qui est utilisée par Flask-Signing pour la signature des données. Nous créons ensuite une instance de URLSafeTimedSerializer en utilisant la clé secrète de l'application Flask. Ensuite, nous signons les données en utilisant la méthode dumps de l'instance s. Les données signées sont renvoyées en tant que réponse HTTP.

Pour vérifier la signature des données, vous pouvez utiliser la fonction loads de l'instance s. Par exemple :

@app.route('/verify/<signed_data>')
def verify(signed_data):
    try:
        data = s.loads(signed_data)
        return f"Data: {data}"
    except:
        return "Invalid signature"

Dans cet exemple, nous définissons une route /verify/<signed_data> qui prend les données signées en tant que paramètre d'URL. Nous utilisons la méthode loads de l'instance s pour vérifier la signature des données. Si la signature est valide, les données sont renvoyées en tant que réponse HTTP. Sinon, un message d'erreur est renvoyé.

La signature est un mécanisme puissant pour garantir l'intégrité et l'authenticité des données. En utilisant Flask-Signing, vous pouvez facilement implémenter la signature dans vos applications web Flask.

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

Signature en utilisant des versions obsolètes (anciennes versions)

Lors de l'évaluation de la sécurité d'une application Flask, il est important de vérifier si elle utilise des versions obsolètes qui pourraient présenter des vulnérabilités connues. Les versions obsolètes de Flask peuvent être sujettes à des attaques de contournement de sécurité ou à des failles connues qui pourraient être exploitées par des attaquants.

Pour identifier si une application Flask utilise une version obsolète, vous pouvez effectuer les étapes suivantes :

  1. Recherchez la version de Flask utilisée par l'application. Cela peut être trouvé dans le fichier requirements.txt ou dans le fichier setup.py de l'application.

  2. Comparez la version de Flask avec la dernière version disponible sur le site officiel de Flask. Si la version utilisée par l'application est inférieure à la dernière version disponible, cela indique qu'elle utilise une version obsolète.

  3. Consultez la documentation de Flask pour identifier les vulnérabilités connues dans les versions obsolètes. Recherchez les correctifs et les mises à jour recommandées pour résoudre ces vulnérabilités.

Si vous identifiez que l'application Flask utilise une version obsolète, il est recommandé de mettre à jour vers la dernière version stable de Flask pour bénéficier des correctifs de sécurité et des améliorations de performance. Assurez-vous de tester soigneusement l'application après la mise à jour pour vous assurer qu'elle fonctionne correctement.

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

RIPsession

Outil en ligne de commande pour effectuer une attaque par force brute sur des sites web en utilisant des cookies créés avec flask-unsign.

{% embed url="https://github.com/Tagvi/ripsession" %}

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 automatiquement signer les charges utiles sqlmap pour Flask en utilisant un secret connu.

Proxy Flask vers SSRF

Dans cette explication, 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)

Il est possible d'introduire quelque chose comme "@attacker.com" afin de provoquer une SSRF.

Utilisez Trickest pour créer et automatiser facilement des flux de travail alimentés par les outils communautaires les plus avancés au monde.
Obtenez un accès dès aujourd'hui :

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥