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

11 KiB

Flask

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

Use Trickest para construir e automatizar fluxos de trabalho com as ferramentas comunitárias mais avançadas do mundo.
Obtenha acesso hoje:

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

Provavelmente, se você estiver jogando um CTF, uma aplicação Flask estará relacionada a SSTI.

Cookies

O nome padrão da sessão do cookie é session.

Decodificador

Decodificador de cookies Flask online: https://www.kirsle.net/wizards/flask-session.cgi

Manual

Obtenha a primeira parte do cookie até o primeiro ponto e decodifique em Base64>

echo "ImhlbGxvIg" | base64 -d

O cookie também é assinado usando uma senha

Flask-Unsign

Ferramenta de linha de comando para buscar, decodificar, forçar bruta e criar cookies de sessão de uma aplicação Flask ao adivinhar chaves secretas.

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

pip3 install flask-unsign

A cookie is a small piece of data that is stored on the client-side and is used to store information about the user. Cookies are often used in web applications to maintain user sessions and personalize the user experience.

When performing a web application penetration test, it is important to understand how cookies are being used and if they are properly secured. One way to do this is by decoding the cookie to see its contents.

To decode a cookie, you can use various tools and techniques. One common method is to use a browser extension or developer tools to view the cookie's value in plain text. Another option is to use a programming language like Python to decode the cookie programmatically.

Here is an example of how you can decode a cookie using Python:

import base64

def decode_cookie(cookie):
    decoded_cookie = base64.b64decode(cookie)
    return decoded_cookie.decode('utf-8')

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

In this example, the base64 module is used to decode the cookie. The decode_cookie function takes a cookie as input, decodes it using base64.b64decode, and returns the decoded cookie as a string.

By decoding the cookie, you can see its contents and understand what information is being stored. This can be useful for identifying potential security vulnerabilities, such as sensitive data being stored in cookies without proper encryption or protection.

It is important to note that decoding a cookie does not modify its value or affect the web application in any way. It is simply a way to view the contents of the cookie for analysis purposes.

Remember to always obtain proper authorization before performing any penetration testing activities.

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

Força Bruta

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

Assinatura

A assinatura é um mecanismo de autenticação usado para verificar a integridade e a autenticidade dos dados transmitidos. No contexto da segurança da web, a assinatura é frequentemente usada para proteger as sessões de usuário e evitar a falsificação de solicitações entre sites (CSRF).

A assinatura é geralmente realizada usando uma chave secreta compartilhada entre o servidor e o cliente. O servidor gera uma assinatura para os dados usando a chave secreta e envia a assinatura junto com os dados para o cliente. O cliente, em seguida, verifica a assinatura usando a mesma chave secreta e compara-a com a assinatura recebida. Se as assinaturas coincidirem, isso indica que os dados não foram alterados e que a fonte é autêntica.

O Flask, um popular framework da web em Python, fornece suporte embutido para assinaturas. Ele usa a biblioteca Werkzeug para gerar e verificar assinaturas. O Flask usa uma chave secreta configurada no aplicativo para realizar a assinatura.

Para gerar uma assinatura em Flask, você pode usar a função make_signed_token() do objeto itsdangerous.URLSafeTimedSerializer. Esta função recebe uma carga útil (payload) e retorna uma string que contém a carga útil assinada.

from itsdangerous import URLSafeTimedSerializer
from flask import Flask

app = Flask(__name__)
app.config['SECRET_KEY'] = 'sua_chave_secreta_aqui'

@app.route('/')
def index():
    s = URLSafeTimedSerializer(app.config['SECRET_KEY'])
    payload = {'user_id': 123}
    signed_token = s.dumps(payload)
    return signed_token

Para verificar uma assinatura em Flask, você pode usar a função loads() do objeto URLSafeTimedSerializer. Esta função recebe a string assinada e retorna a carga útil original se a assinatura for válida.

from itsdangerous import URLSafeTimedSerializer
from flask import Flask

app = Flask(__name__)
app.config['SECRET_KEY'] = 'sua_chave_secreta_aqui'

@app.route('/verify/<signed_token>')
def verify(signed_token):
    s = URLSafeTimedSerializer(app.config['SECRET_KEY'])
    payload = s.loads(signed_token)
    return f"Payload: {payload}"

Ao usar assinaturas em Flask, é importante manter a chave secreta segura e não compartilhá-la com terceiros. A chave secreta é usada para gerar e verificar assinaturas, e qualquer pessoa que tenha acesso a ela pode falsificar assinaturas e comprometer a segurança do aplicativo.

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

Assinando usando versões antigas (legado)

When using Flask, it is important to be aware of the potential security risks associated with using legacy (old) versions of the framework. Older versions of Flask may have vulnerabilities that can be exploited by attackers. Therefore, it is recommended to always use the latest stable version of Flask to ensure the best security practices.

To sign data using legacy versions of Flask, you can follow these steps:

  1. Import the necessary modules:
from flask import Flask
from itsdangerous import Signer
  1. Create an instance of the Flask application:
app = Flask(__name__)
  1. Generate a secret key for signing the data:
app.secret_key = 'your_secret_key'
  1. Create a signer object using the secret key:
signer = Signer(app.secret_key)
  1. Sign the data using the signer object:
signed_data = signer.sign('your_data')
  1. Verify the signature:
is_valid = signer.verify(signed_data)

By following these steps, you can sign data using legacy versions of Flask. However, it is strongly recommended to upgrade to the latest version of Flask to ensure the best security practices and protect against potential vulnerabilities.

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

RIPsession

Ferramenta de linha de comando para realizar brute-force em sites usando cookies criados com 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

Este exemplo usa a opção eval do sqlmap para automaticamente assinar payloads do sqlmap para o Flask usando um segredo conhecido.

Use Trickest para construir e automatizar fluxos de trabalho facilmente, utilizando as ferramentas comunitárias mais avançadas do mundo.
Acesse hoje mesmo:

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

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