Cada aplicación se ejecuta como 4 contenedores Docker con balanceo de carga detrás de grupos upstream de nginx, accesibles a través del proxy inverso nginx en la VM. Las sesiones adhesivas garantizan que las aplicaciones con estado (Juice Shop, DVWA, VAmPI, CSD Demo) enruten de manera consistente. Todas las aplicaciones son intencionalmente vulnerables y están diseñadas para pruebas de seguridad.
Reemplace <ORIGIN> con http://<PUBLIC_IP> en todos los ejemplos a continuación. Después de desplegar mediante Terraform, obtenga la IP con terraform output -raw public_ip.
Ruta Aplicación Método HTTP Respuesta esperada /Página de inicio GET 200 HTML con enlaces a todas las aplicaciones /healthVerificación de salud GET 200 JSON {"status":"healthy","component":"origin-server",...} /juice-shop/Juice Shop GET 200 HTML (Angular SPA, ~75 KB) /juice-shop/rest/products/search?q=Juice Shop API GET 200 JSON {"status":"success","data":[...]} (36 productos) /dvwa/DVWA GET 302 redirección a /dvwa/login.php /dvwa/login.phpInicio de sesión DVWA GET 200 HTML formulario de inicio de sesión /dvwa/setup.phpConfiguración DVWA GET 200 HTML (inicialización de base de datos en primer uso) /vampi/VAmPI GET 200 HTML (documentación de API) /vampi/users/v1VAmPI API GET 200 JSON {"users":[...]} /vampi/users/v1/registerVAmPI API POST 200 JSON {"status":"success",...} /vampi/users/v1/loginVAmPI API POST 200 JSON {"auth_token":"...","status":"success"} /httpbin/gethttpbin GET 200 JSON con detalles de la solicitud /httpbin/posthttpbin POST 200 JSON con los datos enviados /httpbin/headershttpbin GET 200 JSON {"headers":{...}} /httpbin/status/:codehttpbin GET Devuelve el código de estado HTTP especificado /whoami/whoami GET 200 texto plano con hostname, IP y todas las cabeceras /csd-demo/CSD Demo GET 200 HTML formulario de pago con panel de ataque /csd-demo/dashboardVista del atacante CSD GET 200 HTML mostrando datos exfiltrados /csd-demo/healthSalud de CSD GET 200 JSON {"status":"healthy","component":"csd-demo",...} /csd-demo/exfil/logRegistro de exfiltración CSD GET 200 JSON array de datos capturados /dvga/DVGA GraphiQL GET 200 HTML (GraphiQL IDE) /dvga/graphqlDVGA GraphQL API POST 200 JSON respuesta GraphQL /restaurant/RESTaurant GET 200 (redirige a la documentación) /restaurant/docsRESTaurant Swagger GET 200 HTML (FastAPI Swagger UI) /restaurant/openapi.jsonRESTaurant OpenAPI GET 200 JSON especificación OpenAPI http://<PUBLIC_IP>:8888crAPI GET 200 HTML (SPA) http://<PUBLIC_IP>:8888/identity/api/auth/signupRegistro crAPI POST 200 JSON http://<PUBLIC_IP>:8888/identity/api/auth/loginInicio de sesión crAPI POST 200 JSON {"token":"..."}
Ruta /juice-shop/Imagen bkimminich/juice-shop:latestInstancias 4 (puertos 3001-3004), adhesiva mediante hash $cookie_token, caché de proxy (TTL de 60 s) Recursos 2 CPU / 1 GiB RAM por instancia Framework Node.js / Angular Proyecto owasp.org/www-project-juice-shop
OWASP Juice Shop es la aplicación web vulnerable más moderna y con mantenimiento activo. Cubre el OWASP Top 10 completo con más de 100 desafíos en una aplicación de comercio electrónico realista.
Escenario Categoría Vector de ataque Bypass de inicio de sesión por inyección SQL Firewall de aplicaciones web (WAF) ' OR 1=1-- en el campo de correo del inicio de sesiónXSS reflejado Firewall de aplicaciones web (WAF), Defensa del lado del cliente Inyección de script mediante parámetro de búsqueda XSS basado en DOM Defensa del lado del cliente Payload en el fragmento de URL Autenticación deficiente Firewall de aplicaciones web (WAF) Fuerza bruta en inicio de sesión, manipulación de JWT Abuso de API Seguridad de API Acceso no autorizado a endpoints /api/ Exposición de datos sensibles Seguridad de API Acceso a datos de usuario sin autorización CSRF Firewall de aplicaciones web (WAF) Falsificación de solicitudes entre sitios en cambios de perfil
curl -s " http://<PUBLIC_IP>/juice-shop/ " -o /dev/null -w " %{http_code} "
Ruta /dvwa/Imagen Personalizada dvwa-fpm:latest (php-fpm + nginx, construida desde ghcr.io/digininja/dvwa:latest) Instancias 4 (puertos 8101-8104), adhesiva mediante hash $cookie_PHPSESSID Recursos 0.5 CPU / 256 MiB RAM por instancia Base de datos MariaDB 10.11 compartida (contenedor dvwa-db, 1 CPU / 768 MiB) Framework PHP 8 / php-fpm / MariaDB Credenciales admin / password
DVWA es el estándar de la industria para pruebas de WAF. Tiene niveles de seguridad ajustables (Bajo, Medio, Alto, Imposible) que añaden progresivamente validación de entrada y codificación de salida.
Escenario Categoría Nivel de seguridad Inyección SQL Firewall de aplicaciones web (WAF) Bajo: ' OR 1=1# trivial, Alto: SQLi ciego Inyección de comandos Firewall de aplicaciones web (WAF) Bajo: ; ls, Alto: caracteres filtrados Inclusión de archivos Firewall de aplicaciones web (WAF) Bajo: traversal de ruta directo, Alto: saneado XSS (Reflejado) Firewall de aplicaciones web (WAF), Defensa del lado del cliente Bajo: <script> básico, Alto: bypass codificado XSS (Almacenado) Firewall de aplicaciones web (WAF), Defensa del lado del cliente Bajo: script persistente en libro de visitas Carga de archivos Firewall de aplicaciones web (WAF) Bajo: carga de shell PHP, Alto: filtrado de extensiones Fuerza bruta Defensa Bot estándar Intentos de inicio de sesión automatizados
Configure el nivel de seguridad en /dvwa/security.php después de iniciar sesión:
Bajo — Sin validación de entrada. Todos los ataques funcionan. Ideal para demostraciones de firmas de WAF.
Medio — Filtrado básico. Algunos ataques requieren codificación o técnicas de bypass.
Alto — Filtrado robusto. Solo técnicas avanzadas tienen éxito. Útil para mostrar las limitaciones del WAF.
Imposible — Implementación completamente segura. Demuestra una codificación defensiva adecuada.
DVWA requiere una configuración de base de datos única después del primer despliegue:
Navegue a http://<PUBLIC_IP>/dvwa/setup.php
Haga clic en Create / Reset Database
Inicie sesión con admin / password
Ruta /vampi/Imagen erev0s/vampi:latest con punto de entrada gunicorn (4 workers)Instancias 4 (puertos 5101-5104), adhesiva mediante ip_hash (SQLite por instancia) Recursos 0.5 CPU / 512 MiB RAM por instancia Framework Python / Flask / gunicorn Proyecto github.com/erev0s/VAmPI
VAmPI está diseñado específicamente para probar el OWASP API Security Top 10. Proporciona una API REST realista con vulnerabilidades deliberadas. Cada instancia ejecuta gunicorn con 4 workers y su propia base de datos SQLite. La sesión adhesiva ip_hash garantiza que el registro e inicio de sesión desde la misma IP del cliente siempre lleguen a la misma instancia.
Escenario OWASP API Top 10 Método Autorización de nivel de objeto deficiente (BOLA) API1 Acceder a datos de otros usuarios manipulando IDs Autenticación deficiente API2 Manejo débil de tokens, sin límite de tasa Exposición excesiva de datos API3 La API devuelve más datos de los que el cliente necesita Asignación masiva API6 Modificar campos de administrador mediante parámetros inesperados Inyección SQL API8 Inyección a través de parámetros de API Gestión inadecuada de activos API9 Endpoints de API no documentados
# Registrar un nuevo usuario
curl -X POST " http://<PUBLIC_IP>/vampi/users/v1/register " \
-H " Content-Type: application/json " \
-d ' {"username":"test","password":"test123","email":"test@test.com"} '
curl -X POST " http://<PUBLIC_IP>/vampi/users/v1/login " \
-H " Content-Type: application/json " \
-d ' {"username":"test","password":"test123"} '
# Listar usuarios (exposición excesiva de datos)
curl " http://<PUBLIC_IP>/vampi/users/v1 "
Ruta /httpbin/Imagen kennethreitz/httpbin:latest con anulación de CMD de gunicorn (-w 4 -k gevent --timeout 30)Instancias 4 (puertos 8201-8204), round-robin (sin estado) Recursos 0.5 CPU / 256 MiB RAM por instancia Framework Python / Flask / gunicorn + gevent Proyecto httpbin.org
httpbin es un servicio simple de solicitud/respuesta HTTP útil para demostraciones básicas de API, pruebas de cabeceras de solicitud y verificación del comportamiento del proxy.
Endpoint Propósito /httpbin/getDevuelve datos de la solicitud GET (cabeceras, argumentos, origen) /httpbin/postDevuelve datos de la solicitud POST (cuerpo, formulario, JSON) /httpbin/headersDevuelve las cabeceras de la solicitud /httpbin/ipDevuelve la IP de origen /httpbin/user-agentDevuelve la cabecera User-Agent /httpbin/status/:codeDevuelve el código de estado HTTP especificado /httpbin/delay/:secondsRetrasa la respuesta N segundos /httpbin/anythingDevuelve todo lo que se pase en la solicitud
# Verificar qué cabeceras ve el origen (útil para verificar la inyección de cabeceras de F5 XC)
curl -s " http://<PUBLIC_IP>/httpbin/headers " | jq .
# Probar un código de estado HTTP específico
curl -s -o /dev/null -w " %{http_code} " " http://<PUBLIC_IP>/httpbin/status/403 "
Ruta /whoami/Imagen traefik/whoami:latestInstancias 4 (puertos 8082-8085), round-robin (sin estado) Recursos 0.25 CPU / 64 MiB RAM por instancia Framework Go Proyecto github.com/traefik/whoami
whoami es el servidor de eco de solicitudes ligero de Traefik. Muestra cada detalle de la solicitud HTTP entrante tal como la ve el origen: hostname, direcciones IP, todas las cabeceras, método y URL. Esta es la herramienta de diagnóstico más importante al verificar que F5 XC está inyectando las cabeceras correctas.
Caso de uso Qué buscar Verificar la inyección de cabeceras de F5 XC Cabeceras X-Forwarded-For, True-Client-IP, X-Volterra-* Confirmar la visibilidad de la IP del cliente X-Real-IP vs RemoteAddrDepurar falsos positivos del WAF Comparar cabeceras de solicitud antes/después de F5 XC Validar el etiquetado de defensa bot Cabeceras X-Volterra-Bot-Type, X-Volterra-Bot-Verified Verificar la terminación TLS X-Forwarded-Proto muestra https cuando TLS termina en F5 XC
# Solicitud básica -- ver lo que recibe el origen
curl " http://<PUBLIC_IP>/whoami/ "
# Simular solicitud a través de F5 XC (con cabeceras inyectadas)
curl " http://<PUBLIC_IP>/whoami/ " \
-H " X-Forwarded-For: 203.0.113.50 " \
-H " True-Client-IP: 203.0.113.50 " \
-H " X-Forwarded-Proto: https "
Ejemplo de salida:
RemoteAddr: 172.17.0.1:55118
True-Client-Ip: 203.0.113.50
X-Forwarded-For: 203.0.113.50, 10.0.0.1
X-Real-Ip: 104.219.105.84
DVGA está diseñado específicamente para probar vulnerabilidades propias de GraphQL. Proporciona un IDE GraphiQL en /dvga/ para la exploración interactiva de consultas y un endpoint de API GraphQL en /dvga/graphql. Cada instancia usa su propia base de datos SQLite, por lo que las sesiones adhesivas ip_hash garantizan un estado consistente.
Escenario Categoría Vector de ataque Inyección GraphQL Seguridad de API Consultas maliciosas mediante interpolación de cadenas Denegación de servicio Seguridad de API Consultas profundamente anidadas, consultas en lote, agotamiento de recursos Bypass de autorización Seguridad de API Acceso a datos no autorizados a través de GraphQL Divulgación de información Seguridad de API Consultas de introspección que revelan detalles del esquema Ataque de agrupación Seguridad de API Múltiples operaciones en una sola solicitud
# Interfaz GraphiQL (IDE interactivo)
curl -sf " http://<PUBLIC_IP>/dvga/ " -o /dev/null -w " %{http_code} "
# Consulta de introspección -- enumerar el esquema completo
curl -s " http://<PUBLIC_IP>/dvga/graphql " \
-H " Content-Type: application/json " \
-d ' {"query":"{ __schema { types { name fields { name } } } }"} '
# Listar pastes (consulta de ejemplo)
curl -s " http://<PUBLIC_IP>/dvga/graphql " \
-H " Content-Type: application/json " \
-d ' {"query":"{ pastes { title content } }"} '
# Crear un paste (mutación)
curl -s " http://<PUBLIC_IP>/dvga/graphql " \
-H " Content-Type: application/json " \
-d ' {"query":"mutation { createPaste(title:\"test\", content:\"hello\", public:true) { paste { title } } }"} '
Ruta /restaurant/Imagen Compilación personalizada desde theowni/Damn-Vulnerable-RESTaurant-API-Game Instancias 4 (puertos 8301-8304), round-robin (PostgreSQL compartido) Recursos 0.5 CPU / 256 MiB RAM por instancia Base de datos PostgreSQL 15.4 compartido (contenedor restaurant-db, 0.5 CPU / 512 MiB) Framework Python / FastAPI / PostgreSQL Credenciales admin / password (PostgreSQL)Proyecto github.com/theowni/Damn-Vulnerable-RESTaurant-API-Game
RESTaurant es una API REST vulnerable gamificada que cubre el OWASP API Security Top 10 2023. Utiliza FastAPI con documentación automática de Swagger UI en /restaurant/docs. Las 4 instancias comparten una única base de datos PostgreSQL, por lo que el balanceo de carga round-robin funciona sin sesiones adhesivas.
Escenario OWASP API Top 10 2023 Método Autorización de nivel de objeto deficiente (BOLA) API1 Acceder a los pedidos de otros usuarios manipulando IDs Autenticación deficiente API2 Manejo débil de tokens, relleno de credenciales Autorización deficiente a nivel de propiedad de objeto API3 Asignación masiva en campos del perfil de usuario Consumo de recursos sin restricción API4 Sin límite de tasa en los endpoints Autorización de nivel de función deficiente (BFLA) API5 Acceder a endpoints de administrador como usuario regular Falsificación de solicitudes del lado del servidor (SSRF) API7 Manipular solicitudes de URL del lado del servidor Configuración incorrecta de seguridad API8 Mensajes de error detallados, credenciales predeterminadas
curl -sf " http://<PUBLIC_IP>/restaurant/docs " -o /dev/null -w " %{http_code} "
curl -s " http://<PUBLIC_IP>/restaurant/openapi.json " | jq .info
# BOLA -- acceder al pedido de otro usuario (después de autenticación)
curl -s " http://<PUBLIC_IP>/restaurant/orders/1 " \
-H " Authorization: Bearer <token> "
# BFLA -- intentar acción de administrador como usuario regular
curl -s -X POST " http://<PUBLIC_IP>/restaurant/admin/users " \
-H " Authorization: Bearer <user_token> " \
-H " Content-Type: application/json "
Puerto 8888 (dedicado — sin prefijo de ruta)Imágenes crapi/crapi-web, crapi/crapi-identity, crapi/crapi-community, crapi/crapi-workshop, PostgreSQL, MongoDB, MailHogInstancias 7 microservicios (una instancia cada uno) Recursos ~3.0 CPU / ~2.0 GiB RAM en total Framework React SPA + microservicios Java/Go/Python Proyecto github.com/OWASP/crAPI
crAPI es el proyecto insignia de OWASP para pruebas de seguridad de API. Se ejecuta como 7 microservicios en un puerto dedicado (8888) porque el React SPA codifica de forma fija sus rutas de API y no puede servirse detrás de un prefijo de ruta. El NSG permite el tráfico entrante en el puerto 8888.
MailHog captura todos los correos electrónicos enviados por crAPI (verificación de cuenta, restablecimiento de contraseña). Acceda a MailHog mediante túnel SSH en el puerto 18025.
Categoría Vulnerabilidades BOLA (Autorización de nivel de objeto deficiente) Acceder a vehículos, pedidos e informes de otros usuarios BFLA (Autorización de nivel de función deficiente) Escalar a administrador, acceder a endpoints restringidos Asignación masiva Modificar campos protegidos (rol, saldo) mediante API SSRF (Falsificación de solicitudes del lado del servidor) Manipular la obtención de URL del lado del servidor Manipulación de JWT Falsificar o modificar tokens JWT para escalada de privilegios Inyección NoSQL Inyectar consultas en endpoints respaldados por MongoDB Exposición excesiva de datos La API devuelve datos sensibles del usuario
# Verificar que crAPI está en funcionamiento
curl -sf " http://<PUBLIC_IP>:8888 " -o /dev/null -w " %{http_code} "
# Registrar un nuevo usuario
curl -s -X POST " http://<PUBLIC_IP>:8888/identity/api/auth/signup " \
-H " Content-Type: application/json " \
-d ' {"name":"Test User","email":"test@example.com","number":"1234567890","password":"Test1234!"} '
curl -s -X POST " http://<PUBLIC_IP>:8888/identity/api/auth/login " \
-H " Content-Type: application/json " \
-d ' {"email":"test@example.com","password":"Test1234!"} '
# Acceder a MailHog (mediante túnel SSH para verificación de correo)
# ssh -L 18025:localhost:18025 azureuser@<PUBLIC_IP>
# Luego abra http://localhost:18025 en su navegador
Port 8888 -> crapi-web (React SPA + nginx)
-> crapi-identity (Java, user auth, JWT)
-> crapi-community (Go, forums, posts)
-> crapi-workshop (Python, vehicle service)
-> crapi-postgres (PostgreSQL)
-> crapi-mailhog (email capture, port 18025)
Caso de uso de demostración Aplicación principal Aplicación secundaria WAF — Inyección SQL DVWA Juice Shop WAF — XSS DVWA Juice Shop WAF — Inyección de comandos DVWA — Seguridad de API — BOLA VAmPI — Seguridad de API — Bypass de autenticación VAmPI Juice Shop Seguridad de API — Exposición de datos VAmPI httpbin Defensa Bot — Fuerza bruta DVWA Juice Shop Defensa Bot — Scraping Juice Shop — Defensa del lado del cliente — XSS basado en DOM Juice Shop — Defensa del lado del cliente — XSS almacenado DVWA Juice Shop Defensa del lado del cliente — Skimmer de tarjetas CSD Demo — Defensa del lado del cliente — Formjacker CSD Demo — Defensa del lado del cliente — Keylogger CSD Demo — Defensa del lado del cliente — Criptominero CSD Demo — Defensa del lado del cliente — Secuestro de DOM CSD Demo — Seguridad de API — Inyección GraphQL DVGA — Seguridad de API — DoS en GraphQL DVGA — Seguridad de API — OWASP API Top 10 2023 RESTaurant crAPI Seguridad de API — BFLA RESTaurant crAPI Seguridad de API — Asignación masiva crAPI RESTaurant Seguridad de API — SSRF crAPI RESTaurant Seguridad de API — Manipulación de JWT crAPI — Seguridad de API — Inyección NoSQL crAPI — Pruebas básicas de conectividad httpbin — Diagnóstico de solicitudes whoami httpbin Verificación de inyección de cabeceras whoami —