
Docker-basiertes Labor zur Reproduktion von CVE-2023-4863 (Heap-Pufferüberlauf in libwebp) mit automatischer Crash-Demonstration, Vergleich von gepatchter und ungepatchter Version und GUI-basierter Browser-Ausnutzung in einem isolierten Netzwerk.
Reproduktion von CVE-2023-4863 (Heap-Buffer-Overflow in libwebp) in einer vollständig isolierten und automatisierten Docker-Umgebung. Basierend auf der Übung des Moduls „Hacking Ético“ von CEFIRE.
Es startet acht Container in einem privaten Netzwerk:
| Container | Rolle |
|---|---|
| attacker | Erzeugt exploit.webp mit craft.c und dient es per HTTP zusammen mit einer simulierten Phishing-Seite aus |
| victim-cli | Ubuntu 22.04 mit libwebp 1.2.2-2ubuntu0.22.04.1 (anfällig). Lädt das Exploit automatisch herunter und verarbeitet es → Crash |
| victim-patched | Ubuntu 22.04 mit libwebp aus dem Ubuntu-Sicherheits-Repository (gepatcht). Gleiches Exploit → kontrollierter Fehler, kein Crash |
| victim-gui | Ubuntu 22.04 mit XFCE, VNC und Firefox 110 (anfällig). Echter Browser-Crash mit exploit.webp |
| victim-gui-patched | Ubuntu 22.04 mit XFCE, VNC und Firefox 126 (gepatcht). Gleiches Exploit → Browser überlebt |
| postgres | PostgreSQL — Backend für Authentifizierung und Verbindungen von Guacamole |
| guacd | Daemon von Apache Guacamole (Protokoll-Proxy) |
| guacamole | Weboberfläche, über die du auf alle Container per SSH oder VNC zugreifst, ohne etwas installieren zu müssen |
Die automatische Demonstration (victim-cli vs victim-patched) erfolgt beim Start von selbst. Die visuelle GUI-Demonstration erfordert manuelle Interaktion über Guacamole.
make up
make up führt beim ersten Mal automatisch drei Dinge aus:
initdb.sh aus dem offiziellen Image aus)Der Build dauert beim ersten Mal einige Minuten (lädt Basis-Images herunter, klont das PoC-Repository, installiert Pakete). Bei späteren Ausführungen wird der Docker-Cache genutzt und es geht fast augenblicklich.
Wenn er fertig ist, siehst du die URL von Guacamole in der Ausgabe. Die Opfer-Container starten erst, wenn der Angreifer bereit ist und das Exploit ausliefert (Healthcheck).
| Zugang | Benutzer | Passwort |
|---|
In einem Terminal, während das Lab läuft:
# Crash im anfälligen Opfer ansehen
make logs-victim-cli
# Kontrollierte Antwort im gepatchten Opfer ansehen
make logs-victim-patched
Was du in victim-cli sehen wirst:
[*] Ejecutando: dwebp /tmp/exploit.webp -o /tmp/salida.png
Decoding of exploit.webp failed.
Status: 3(BITSTREAM_ERROR)
*** glibc detected *** double free or corruption (!prev) ***
Aborted (core dumped)
[!] EXIT CODE: 134 (SIGABRT)
[!] CVE-2023-4863 CONFIRMADO
Was du in victim-patched sehen wirst:
[*] Ejecutando: dwebp /tmp/exploit.webp -o /tmp/salida.png
Decoding of exploit.webp failed.
Status: 3(BITSTREAM_ERROR)
[+] EXIT CODE: 1 — Error controlado
[+] CVE-2023-4863 MITIGADO
Die anschaulichste Demonstration erfolgt durch den Vergleich von victim-gui (anfällig) mit victim-gui-patched (gepatcht) mittels dwebp in einem Terminal der XFCE-Desktopumgebung.
guacadmin / guacadminfirefox --no-sandbox http://attacker/index.html
exploit.webp zu rendern → Crash (SIGABRT, Prozess stirbt)Mozilla betreibt ein dauerhaft öffentliches Archiv aller Versionen unter releases.mozilla.org. Google hat die URLs alter Chrome-Versionen von seinem CDN entfernt, sodass ein zuverlässiger Download von Chrome 116 unmöglich ist. Firefox 110 ist gleichermaßen anfällig (beide binden libwebp intern ein) und sein Download aus dem Mozilla-Archiv ist stabil und reproduzierbar.
ssh root@localhost -p 2220 # attacker
ssh root@localhost -p 2221 # victim-cli
ssh root@localhost -p 2223 # victim-patched
ssh root@localhost -p 2222 # victim-gui
ssh root@localhost -p 2224 # victim-gui-patched
Direktes VNC: localhost:5900 (victim-gui) und localhost:5901 (victim-gui-patched).
make logs # alle Logs in Echtzeit
make status # Status der Container
make shell-attacker # Shell im Angreifer
make shell-victim-cli
make shell-victim-gui
make shell-victim-gui-patched
make down # Lab stoppen
make clean # stoppen + Images und Netzwerke löschen
Chrome und libwebp: Chrome bündelt eine eigene Kopie von libwebp (verwendet nicht die Systemversion). Versionen ≥ 116.0.5845.187 enthalten den Patch. Da Google die URLs alter Versionen entfernt hat, fällt das Dockerfile auf den Fallback mit der aktuellen stabilen Version (gepatcht) zurück. Die Crash-Demonstration mit dwebp ist gleichermaßen gültig und zuverlässiger.
Isoliertes Netzwerk: Kein Container hat während der Ausführung Internetzugriff. Der gesamte Verkehr bleibt innerhalb des privaten Docker-Netzwerks cve4863-lab-net.
| Guacamole (Web) | guacadmin | guacadmin |
| SSH alle Container | root | toor |
| VNC victim-gui und victim-gui-patched | — | secret |