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