
Laboratorio basado en Docker para reproducir CVE-2023-4863 (desbordamiento de búfer en el montón en libwebp) con demostración automatizada de fallos, comparación entre versión parcheada y vulnerable, y explotación de navegador basada en GUI en una red aislada.
Reproducción de CVE-2023-4863 (heap buffer overflow en libwebp) en un entorno Docker completamente aislado y automatizado. Basado en la práctica del módulo de Hacking Ético de CEFIRE.
Levanta ocho containers en red privada:
| Container | Rol |
|---|---|
| attacker | Genera exploit.webp con craft.c y lo sirve por HTTP junto a una página de phishing simulada |
| victim-cli | Ubuntu 22.04 con libwebp 1.2.2-2ubuntu0.22.04.1 (vulnerable). Descarga y procesa el exploit automáticamente → crash |
| victim-patched | Ubuntu 22.04 con libwebp del repo de seguridad de Ubuntu (parcheado). Mismo exploit → error controlado, sin crash |
| victim-gui | Ubuntu 22.04 con XFCE, VNC y Firefox 110 (vulnerable). Crash real del navegador con exploit.webp |
| victim-gui-patched | Ubuntu 22.04 con XFCE, VNC y Firefox 126 (parcheado). Mismo exploit → navegador sobrevive |
| postgres | PostgreSQL — backend de autenticación y conexiones de Guacamole |
| guacd | Daemon de Apache Guacamole (proxy de protocolos) |
| guacamole | Interfaz web desde la que accedes a todos los containers por SSH o VNC, sin instalar nada más |
La demostración automática (victim-cli vs victim-patched) ocurre sola al arrancar. La demostración visual en GUI requiere interacción manual desde Guacamole.
make up
make up hace tres cosas automáticamente si es la primera vez:
initdb.sh desde la imagen oficial)El build tarda unos minutos la primera vez (descarga imágenes base, clona el repo del PoC, instala paquetes). Las siguientes ejecuciones usan la caché de Docker y son casi instantáneas.
Cuando termina, verás la URL de Guacamole en el output. Los containers de víctimas no arrancan hasta que el atacante está listo y sirviendo el exploit (healthcheck).
| Acceso | Usuario | Contraseña |
|---|
En una terminal, mientras el lab está corriendo:
# Ver el crash en la víctima vulnerable
make logs-victim-cli
# Ver la respuesta controlada en la víctima parcheada
make logs-victim-patched
Lo que verás en victim-cli:
[*] 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
Lo que verás en victim-patched:
[*] 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
La demostración más visual se hace comparando victim-gui (vulnerable) con victim-gui-patched (parcheada) usando dwebp desde una terminal del escritorio XFCE.
guacadmin / guacadminfirefox --no-sandbox http://attacker/index.html
exploit.webp → crash (SIGABRT, proceso muerto)Mozilla mantiene un archivo público permanente de todas sus versiones en releases.mozilla.org. Google retiró las URLs de versiones antiguas de Chrome de su CDN, haciendo imposible descargar Chrome 116 de forma fiable. Firefox 110 es igualmente vulnerable (ambos embeben libwebp internamente) y su descarga desde el archivo de Mozilla es estable y reproducible.
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
VNC directo: localhost:5900 (victim-gui) y localhost:5901 (victim-gui-patched).
make logs # todos los logs en tiempo real
make status # estado de los containers
make shell-attacker # shell en el atacante
make shell-victim-cli
make shell-victim-gui
make shell-victim-gui-patched
make down # parar el lab
make clean # parar + borrar imágenes y redes
Chrome y libwebp: Chrome bundlea su propia copia de libwebp (no usa la del sistema). Las versiones ≥ 116.0.5845.187 incluyen el parche. Como Google retiró las URLs de versiones antiguas, el Dockerfile cae al fallback con la versión estable actual (parcheada). La demostración del crash con dwebp es igualmente válida y más fiable.
Red aislada: ningún container tiene acceso a Internet durante la ejecución. Todo el tráfico queda dentro de la red Docker privada cve4863-lab-net.
| Guacamole (web) | guacadmin | guacadmin |
| SSH todos los containers | root | toor |
| VNC victim-gui y victim-gui-patched | — | secret |