## https://sploitus.com/exploit?id=906C4E74-5E26-5998-9DF4-44017858ABEC
# CVE-2023-4863 — Laboratorio de explotación de libwebp
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.
## Qué hace este lab
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.
## Requisitos
- Docker Engine 24+
- Docker Compose v2
- ~5 GB de RAM disponibles
- ~10 GB de disco (imágenes + capas)
## Arrancar el lab
```bash
make up
```
`make up` hace tres cosas automáticamente si es la primera vez:
1. Genera el schema SQL de Guacamole (ejecuta `initdb.sh` desde la imagen oficial)
2. Construye las imágenes de los containers
3. Levanta todo
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).
## Credenciales
| Acceso | Usuario | Contraseña |
|---|---|---|
| Guacamole (web) | `guacadmin` | `guacadmin` |
| SSH todos los containers | `root` | `toor` |
| VNC victim-gui y victim-gui-patched | — | `secret` |
## Ver la demostración automática (CLI)
En una terminal, mientras el lab está corriendo:
```bash
# 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
```
## Demostración visual en el escritorio (GUI)
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.
### Pasos
1. Abre **http://localhost:8888/guacamole** en tu browser
2. Login: `guacadmin` / `guacadmin`
3. En la víctima vulnerable (**Firefox 110**):
- Selecciona **[VÍCTIMA GUI] VNC — Escritorio Chrome**
- Abre una terminal en el escritorio XFCE
- Ejecuta:
```bash
firefox --no-sandbox http://attacker/index.html
```
- Firefox 110 intenta renderizar `exploit.webp` → **crash** (SIGABRT, proceso muerto)
4. En la víctima parcheada (**Firefox 126**):
- Selecciona **[VÍCTIMA GUI PATCH] VNC — Escritorio Chrome patch**
- Mismo comando → Firefox 126 maneja el error sin crashear
### Por qué Firefox en vez de Chrome
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.
## Acceso directo por SSH (sin Guacamole)
```bash
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).
## Comandos útiles
```bash
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
```
## Notas
**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`.