Share
## https://sploitus.com/exploit?id=2276F890-1F86-5857-8A69-43FEB0BB9E76
# CineVault

Plataforma de streaming web tipo Netflix construida como **laboratorio de ciberseguridad** para demostrar las vulnerabilidades del **OWASP Top 10** y su mitigación.

El proyecto tiene **dos versiones** de la misma aplicación con la misma arquitectura y base de datos equivalente:

| Versión | Característica | Objetivo |
|---------|---------------|----------|
| `cinevault/v1-vulnerable` | **VULNERABLE** - OWASP Top 10 intencional | Ser explotada con herramientas reales (sqlmap, Burp Suite, nmap, Nikto, OWASP ZAP) |
| `cinevault/v2-secure` | **SEGURA** - controles de seguridad | Mismos ataques fallan tras aplicar las mitigaciones |

> ⚠️ **AVISO LEGAL**: Este proyecto es **exclusivamente educativo** y debe ejecutarse únicamente en un entorno de laboratorio aislado. No utilices este código en producción ni contra sistemas que no te pertenezcan.

---

## Stack Tecnológico

- **Backend**: Node.js + Express.js
- **Frontend**: EJS (Server Side Rendering)
- **Base de datos**: MySQL 8
- **Infraestructura**: Docker Compose / Docker
- **Reverse Proxy (v2)**: Nginx
- **HTTPS (v2)**: OpenSSL (certificado TLS autofirmado)
- **Controles en v2**: `bcryptjs`, `helmet`, `express-rate-limit`, `express-validator`, `execFile()` (sin shell), prepared statements
- **Pentesting**: Kali Linux, sqlmap, Burp Suite, Nmap, Nikto, OWASP ZAP

---

## Funcionalidades

- Registro y login de usuarios
- Catálogo de películas desde **TMDB API**
- Búsqueda y detalle de películas
- Agregar favoritos
- Crear y reportar comentarios
- Panel de administración (usuarios, comentarios, reportes, actividad)

---

## Estructura del Proyecto

```
.
├── README.md                       # Este documento
├── docker-compose.yml              # 🐳 Orquestación del laboratorio Docker (BD + app v1)
├── docs/                           # 📄 Arquitectura de despliegue y guía de laboratorio
│   ├── arquitectura-despliegue.md  #   Topología, tecnologías y flujo de petición
│   └── guia-laboratorio-docker.md  #   Cómo levantar el laboratorio (Docker Compose)
├── database/                       # Schemas SQL de ambas versiones
│   ├── cinevault_v1.sql            #   BD vulnerable (usuarios con MD5)
│   └── cinevault_v2.sql            #   BD segura (bcrypt)
│
└── cinevault/
    ├── v1-vulnerable/              # Versión vulnerable (OWASP Top 10)
    │   ├── Dockerfile              #   Imagen de la app para el laboratorio Docker
    │   ├── server.js               #   Backend vulnerable (SQLi, XSS, RCE, SSRF...)
    │   ├── tmdb.service.js         #   Integración con TMDB API
    │   ├── docs/                   #   📄 Documentación de vulnerabilidades (+ .docx)
    │   ├── tests/                  #   Pruebas funcionales automatizadas (7 suites)
    │   ├── public/uploads/         #   Archivos subidos vía SSRF (evidencia real)
    │   └── views/                  #   Plantillas EJS (incluye el XSS en comentarios)
    │
    ├── v2-secure/                  # Versión segura (vulnerabilidades corregidas)
    │   └── server.js               #   bcrypt, helmet, rate-limit, execFile, prepared statements
    │
    └── tests/                      # 📄 Guía de pentest + scripts y evidencias
        ├── guia-penetracion-v1.md  #   Guía de pruebas de penetración (+ .docx)
        └── pentest-v1/             #   Scripts reproducibles y evidencias reales
```

---

## Vulnerabilidades Implementadas (v1)

| # | Vulnerabilidad | OWASP | Ubicación |
|---|---------------|-------|-----------|
| 1 | SQL Injection | A03 | 10 endpoints (`POST /login`, `POST /registro`, `GET /perfil/:id`, comentarios, favoritos, admin...) |
| 2 | Stored XSS | A03 | Comentarios de películas (`views/movie-detail.ejs`) |
| 3 | Broken Access Control (IDOR) | A01 | `GET /perfil/:id` |
| 4 | Authentication Failure | A07 | Login sin rate-limit, cookies inseguras |
| 5 | Cryptographic Failure | A02 | Contraseñas con MD5 sin salt |
| 6 | RCE (Command Injection) | A03 | `POST /thumbnail` (ffmpeg con `exec()`) |
| 7 | SSRF | A10 | `POST /import-image` (fetch sin validar) |
| 8 | Security Misconfiguration | A05 | Stack traces visibles, headers inseguros |

Hallazgos adicionales confirmados: **JWT forjable** (secret por defecto → escalada a admin), **CSRF**, **escritura arbitraria de archivos**, **divulgación de información/secrets**.

---

## 📚 Documentación

Toda la documentación clave tiene **versión Markdown (.md)** y **versión Word (.docx)** en el mismo directorio.

### Documentos principales

| Documento | Ubicación | Contenido |
|-----------|-----------|-----------|
| **Documentación de Vulnerabilidades** | [`cinevault/v1-vulnerable/docs/Documentacion-vulnerabilidades.md`](cinevault/v1-vulnerable/docs/Documentacion-vulnerabilidades.md) · [`.docx`](cinevault/v1-vulnerable/docs/Documentacion-vulnerabilidades.docx) | Detalle técnico de cada vulnerabilidad de v1 |
| **Guía de Pruebas de Penetración** | [`cinevault/tests/guia-penetracion-v1.md`](cinevault/tests/guia-penetracion-v1.md) · [`.docx`](cinevault/tests/guia-penetracion-v1.docx) | Campaña de pentest ejecutada sobre v1 con resultados reales |
| **Arquitectura de Despliegue** | [`docs/arquitectura-despliegue.md`](docs/arquitectura-despliegue.md) | Topología del laboratorio, tecnologías por capa, puertos y flujo de petición |
| **Guía de Laboratorio (Docker Compose)** | [`docs/guia-laboratorio-docker.md`](docs/guia-laboratorio-docker.md) | Cómo levantar v1 en un escenario local realista con Docker |

#### 📄 Arquitectura de Despliegue (`docs/arquitectura-despliegue.md`)

- **Topología del laboratorio**: diagrama ASCII atacante → `app-v1` → `db` en red bridge de Docker.
- **Tecnologías por capa**: Node.js 22/Express 4, EJS, axios, MySQL 8, Docker Compose y herramientas de ataque (Kali, sqlmap, nmap, nikto, Burp).
- **Componentes**: `db` (MySQL 8 con seed `database/cinevault_v1.sql` y healthcheck) y `app-v1` (Node con variables de entorno inyectadas por Compose).
- **Flujo de petición y puertos**: HTTP `:3000` público, MySQL `:3306`, red interna privada.
- **Similitud con un escenario real**: red aislada, credenciales MD5 reales, API externa TMDB, volúmenes persistentes.
- Estado actual: **v1 en HTTP directo** (escenario del pentest); **v2 con Nginx/HTTPS pendiente** (fase siguiente).

#### 📄 Guía de Laboratorio (`docs/guia-laboratorio-docker.md`)

- Requisitos (Docker Desktop + herramientas de ataque).
- `docker compose up --build -d` y verificación (`curl /health`, tablas del seed).
- Restauración de la BD a seed limpio (recrear volúmenes o recargar SQL).
- Uso del laboratorio para el pentest (nmap, nikto, sqlmap contra `localhost:3000`).
- Logs, solución de problemas, teardown y alternativa sin Docker.


#### 📄 Documentación de Vulnerabilidades (`Documentacion-vulnerabilidades.md`)

Detalla cada vulnerabilidad con **ubicación exacta en el código** (líneas de `server.js`), código vulnerable, payloads de explotación, **resultado real obtenido** y su **mitigación en v2**:

- **Resumen ejecutivo**: tabla con las 8 vulnerabilidades OWASP + 4 hallazgos adicionales (severidad y ubicación).
- **§2 Alcance**: aplicación, objetivo, metodología, herramientas, BD (`database/cinevault_v1.sql`) y referencias a guía/evidencias/tests.
- **§3 Hallazgos principales** (cada uno con resultado real confirmado):
  - **SQLi (A03, crítica)**: 10 endpoints inyectables; bypass de login; sqlmap detecta técnicas boolean-based + error-based `EXTRACTVALUE`, enumera 5 BDs y hace dump de la tabla `usuarios`.
  - **Stored XSS (A03)**: comentarios almacenados y renderizados sin escapar (evidencia del payload ejecutándose).
  - **IDOR (A01)**: acceso a perfil de cualquier usuario (`/perfil/1` expone `admin@cinevault.com`).
  - **Authentication Failure (A07)**: cookie `connect.sid` sin `HttpOnly`/`SameSite`/`Secure`, sin rate-limit.
  - **Cryptographic Failure (A02)**: tabla con los hashes MD5 del seed y los descifrados por sqlmap (`admin/admin`, `password`, `test`).
  - **RCE (A03)**: inyección de comandos en `/thumbnail`; `whoami` confirmado en `stdout`.
  - **SSRF (A10)**: `/import-image` accede a `127.0.0.1/health` y guarda la respuesta interna.
  - **Security Misconfiguration (A05)**: stack traces visibles, headers inseguros, hallazgos de nmap/nikto.
- **§4 Hallazgos adicionales**: JWT forjable (confirmado, HTTP 200 en admin), CSRF, escritura arbitraria de archivos, divulgación de información.
- **§5 Matriz de explotación** por herramienta (nmap, nikto, sqlmap, curl/Burp, forja JWT) con scripts de referencia y evidencia de cada una + **kill chain** completa.
- **§6 Evidencias confirmadas**: tabla resultado vs archivo de evidencia.
- **§7 Pruebas funcionales automatizadas**: suite `tests/` de v1.
- **§8 Referencias**.

#### 📄 Guía de Pruebas de Penetración (`guia-penetracion-v1.md`)

Campaña de pentest real documentada paso a paso (resultados obtenidos Jul–Ago 2026):

- **§1 Alcance y autorización**: objetivo `http://localhost:3000`, BD MySQL 8.4.11, herramientas y usuarios del seed inicial (con hashes MD5).
- **§2 Preparación del entorno**: requisitos (Docker, Node 22, Python 3.13 + sqlmap, nmap) y cómo levantar la app vulnerable.
- **§3 Fase 1 — Reconocimiento**: `nmap` (puertos 3000/3306, `X-Powered-By: Express`, cookies sin flags) y `nikto` vía Docker (headers ausentes, ETag leak, `/login/` expuesto).
- **§4 Fase 2 — Explotación manual**: payloads y resultados reales de SQLi bypass, Stored XSS, IDOR, SSRF y RCE.
- **§5 Fase 3 — SQLi con sqlmap**: detección (boolean-based + error-based), `--dbs` (5 BDs) y dump de credenciales descifradas.
- **§6 Fase 4 — Forja de JWT**: acceso al panel admin sin credenciales.
- **§7 Resumen de vulnerabilidades**: las 9 confirmadas con impacto.
- **§8 Restauración del entorno**: pasos para dejar el laboratorio reproducible.

### Scripts de pentest reproducibles — `cinevault/tests/pentest-v1/`

| Script | Función |
|--------|---------|
| [`01-reconocimiento-nmap.ps1`](cinevault/tests/pentest-v1/01-reconocimiento-nmap.ps1) | Escaneo de puertos/servicios y scripts de seguridad |
| [`02-escaneo-nikto.ps1`](cinevault/tests/pentest-v1/02-escaneo-nikto.ps1) | Escaneo web con Nikto (vía Docker) |
| [`03-explotacion-manual.ps1`](cinevault/tests/pentest-v1/03-explotacion-manual.ps1) | SQLi bypass, XSS, IDOR, SSRF y RCE |
| [`04-sqlmap-automatizado.ps1`](cinevault/tests/pentest-v1/04-sqlmap-automatizado.ps1) | SQLi automatizada: `--dbs` + dump de `usuarios` |
| [`05-forja-jwt.ps1`](cinevault/tests/pentest-v1/05-forja-jwt.ps1) | Forja de token JWT admin con el secret por defecto |
| [`login-request.txt`](cinevault/tests/pentest-v1/login-request.txt) | Request capturada del `POST /login` usada por sqlmap |

### Evidencias reales — `cinevault/tests/pentest-v1/evidencias/`

| Evidencia | Contenido |
|-----------|-----------|
| [`01-nmap.txt`](cinevault/tests/pentest-v1/evidencias/01-nmap.txt) | Salida de nmap (puertos, cabeceras, métodos HTTP) |
| [`02-nikto.txt`](cinevault/tests/pentest-v1/evidencias/02-nikto.txt) | Hallazgos de Nikto (cookies, headers, ETag, `/login/`) |
| [`03-explotacion-manual.txt`](cinevault/tests/pentest-v1/evidencias/03-explotacion-manual.txt) | Respuestas reales de los 5 ataques manuales |
| [`03-xss-render.txt`](cinevault/tests/pentest-v1/evidencias/03-xss-render.txt) | Confirmación del renderizado del payload XSS |
| [`04-sqlmap.txt`](cinevault/tests/pentest-v1/evidencias/04-sqlmap.txt) | Salida cruda de sqlmap |
| [`04-sqlmap-resumen.txt`](cinevault/tests/pentest-v1/evidencias/04-sqlmap-resumen.txt) | Resumen: inyección detectada, BDs y credenciales |
| [`05-forja-jwt.txt`](cinevault/tests/pentest-v1/evidencias/05-forja-jwt.txt) | Token forjado y acceso HTTP 200 al panel admin |
| [`sqlmap-out/`](cinevault/tests/pentest-v1/evidencias/sqlmap-out/localhost/dump/cinevault/usuarios.csv) | CSV con las credenciales extraídas (hashes + descifrados) |
| `cookies-sqli.txt`, `cookies-usuario2.txt`, `server.log`, `server-error.log` | Soporte (cookies de sesión y logs del servidor) |

### Pruebas funcionales automatizadas — `cinevault/v1-vulnerable/tests/`

Suite con `node --test` (7 archivos + `helpers/`) que levanta el servidor real y valida el funcionamiento de la app:

| Suite | Archivo | Cobertura |
|-------|---------|-----------|
| Catálogo | `test-01-catalogo.test.js` | `/`, `/search`, `/pelicula/550` (TMDB) |
| Autenticación | `test-02-auth.test.js` | `/login`, `/registro`, `/logout` |
| Perfil | `test-03-perfil.test.js` | redirección sin sesión, perfil propio |
| Comentarios | `test-04-comentarios.test.js` | crear/reportar, 401 sin sesión |
| Favoritos | `test-05-favoritos.test.js` | agregar/quitar, 401 sin sesión |
| Administración | `test-06-admin.test.js` | 403 para usuarios, bloqueo, borrado, resolución |
| Misceláneo | `test-07-misc.test.js` | `/health` y página 404 |

Ejecución:
```bash
cd cinevault/v1-vulnerable
npm test   # node --test --test-concurrency=1 "tests/*.test.js"
```

### Base de datos — `database/`

| Archivo | Contenido |
|---------|-----------|
| [`database/cinevault_v1.sql`](database/cinevault_v1.sql) | Schema completo + seed vulnerable: 4 usuarios con contraseñas MD5, películas, favoritos, comentarios (incluye un payload XSS de ejemplo) |
| [`database/cinevault_v2.sql`](database/cinevault_v2.sql) | Schema equivalente para la versión segura (contraseñas bcrypt) |

---

## Inicio Rápido (v1 vulnerable) — Docker Compose

```bash
# 1. Desde la raíz del proyecto: construir y arrancar BD + app
docker compose up --build -d

# 2. Verificar que la BD esté "healthy" y la app corriendo
docker compose ps

# 3. Comprobar el health check (debe responder 200)
curl http://localhost:3000/health
```

La aplicación estará disponible en **http://localhost:3000**.

> Usuarios del seed: `admin@cinevault.com` / `admin` (admin) · `usuario1@cinevault.com` · `usuario2@cinevault.com` / `password` · `test@cinevault.com` / `test`

### Detener / re-seedear

```bash
docker compose down          # detener sin borrar datos
docker compose down -v       # detener y borrar volúmenes (re-seed al arrancar)
docker exec -i cinevault-mysql mysql -uroot -proot cinevault < database/cinevault_v1.sql   # re-seed sin recrear
```

### Sin Docker (alternativa)

```bash
docker run -d --name cinevault-mysql \
  -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=cinevault \
  -p 3306:3306 mysql:8
docker exec -i cinevault-mysql mysql -uroot -proot cinevault < database/cinevault_v1.sql

cd cinevault/v1-vulnerable
npm install
npm start
```

---

## Créditos

- Contenido cinematográfico: [TMDB API](https://www.themoviedb.org/)
- Proyecto académico de ciberseguridad basado en OWASP Top 10