Cada aplicação é executada como 4 contêineres Docker com balanceamento de carga atrás de pools upstream do nginx, acessíveis pelo proxy reverso nginx na VM. Sessões persistentes (sticky sessions) garantem que aplicações com estado (Juice Shop, DVWA, VAmPI, CSD Demo) sejam roteadas de forma consistente. Todas as aplicações são intencionalmente vulneráveis e projetadas para testes de segurança.
Substitua <ORIGIN> por http://<PUBLIC_IP> em todos os exemplos abaixo. Após o deploy via Terraform, obtenha o IP com terraform output -raw public_ip.
Caminho Aplicação Método HTTP Resposta Esperada /Página inicial GET 200 HTML com links para todas as apps /healthVerificação de saúde 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=API Juice Shop GET 200 JSON {"status":"success","data":[...]} (36 produtos) /dvwa/DVWA GET 302 redirecionamento para /dvwa/login.php /dvwa/login.phpLogin DVWA GET 200 HTML formulário de login /dvwa/setup.phpConfiguração DVWA GET 200 HTML (inicialização do banco de dados na primeira execução) /vampi/VAmPI GET 200 HTML (documentação da API) /vampi/users/v1API VAmPI GET 200 JSON {"users":[...]} /vampi/users/v1/registerAPI VAmPI POST 200 JSON {"status":"success",...} /vampi/users/v1/loginAPI VAmPI POST 200 JSON {"auth_token":"...","status":"success"} /httpbin/gethttpbin GET 200 JSON com detalhes da requisição /httpbin/posthttpbin POST 200 JSON com dados enviados /httpbin/headershttpbin GET 200 JSON {"headers":{...}} /httpbin/status/:codehttpbin GET Retorna o código de status HTTP especificado /whoami/whoami GET 200 texto simples com hostname, IP e todos os cabeçalhos /csd-demo/CSD Demo GET 200 HTML formulário de checkout com painel de ataque /csd-demo/dashboardVisão do atacante CSD GET 200 HTML exibindo dados exfiltrados /csd-demo/healthSaúde do CSD GET 200 JSON {"status":"healthy","component":"csd-demo",...} /csd-demo/exfil/logLog de exfiltração CSD GET 200 array JSON de dados capturados /dvga/DVGA GraphiQL GET 200 HTML (GraphiQL IDE) /dvga/graphqlAPI GraphQL DVGA POST 200 JSON resposta GraphQL /restaurant/RESTaurant GET 200 (redireciona para docs) /restaurant/docsSwagger RESTaurant GET 200 HTML (FastAPI Swagger UI) /restaurant/openapi.jsonOpenAPI RESTaurant GET 200 JSON especificação OpenAPI http://<PUBLIC_IP>:8888crAPI GET 200 HTML (SPA) http://<PUBLIC_IP>:8888/identity/api/auth/signupCadastro crAPI POST 200 JSON http://<PUBLIC_IP>:8888/identity/api/auth/loginLogin crAPI POST 200 JSON {"token":"..."}
Caminho /juice-shop/Imagem bkimminich/juice-shop:latestInstâncias 4 (portas 3001-3004), sticky via hash $cookie_token, cache de proxy (TTL de 60 s) Recursos 2 CPU / 1 GiB RAM por instância Framework Node.js / Angular Projeto owasp.org/www-project-juice-shop
O OWASP Juice Shop é a aplicação web vulnerável mais moderna e ativamente mantida. Abrange todo o OWASP Top 10 com mais de 100 desafios em uma aplicação de e-commerce realista.
Cenário Categoria Vetor de Ataque Bypass de login com injeção SQL WAF ' OR 1=1-- no campo de e-mail do loginXSS Refletido WAF, CSD Injeção de script via parâmetro de busca XSS baseado em DOM CSD Payload no fragmento da URL Autenticação quebrada WAF Força bruta no login, manipulação de JWT Abuso de API Segurança de API Acesso não autorizado aos endpoints /api/ Exposição de dados sensíveis Segurança de API Acesso a dados de usuário sem autorização CSRF WAF Cross-site request forgery em alterações de perfil
curl -s " http://<PUBLIC_IP>/juice-shop/ " -o /dev/null -w " %{http_code} "
Caminho /dvwa/Imagem Personalizada dvwa-fpm:latest (php-fpm + nginx, construída a partir de ghcr.io/digininja/dvwa:latest) Instâncias 4 (portas 8101-8104), sticky via hash $cookie_PHPSESSID Recursos 0,5 CPU / 256 MiB RAM por instância Banco de Dados MariaDB 10.11 compartilhado (contêiner dvwa-db, 1 CPU / 768 MiB) Framework PHP 8 / php-fpm / MariaDB Credenciais admin / password
O DVWA é o padrão da indústria para testes de WAF. Possui níveis de segurança ajustáveis (Baixo, Médio, Alto, Impossível) que progressivamente adicionam validação de entrada e codificação de saída.
Cenário Categoria Nível de Segurança Injeção SQL WAF Baixo: trivial ' OR 1=1#, Alto: SQLi cego Injeção de Comando WAF Baixo: ; ls, Alto: caracteres filtrados Inclusão de Arquivo WAF Baixo: path traversal direto, Alto: sanitizado XSS (Refletido) WAF, CSD Baixo: básico <script>, Alto: bypass codificado XSS (Armazenado) WAF, CSD Baixo: script persistente no livro de visitas Upload de Arquivo WAF Baixo: upload de shell PHP, Alto: filtragem de extensão Força Bruta Defesa contra Bots Tentativas automatizadas de login
Defina o nível de segurança em /dvwa/security.php após fazer login:
Baixo — Sem validação de entrada. Todos os ataques funcionam. Ideal para demonstrações de assinaturas WAF.
Médio — Filtragem básica. Alguns ataques requerem codificação ou técnicas de bypass.
Alto — Filtragem robusta. Apenas técnicas avançadas têm sucesso. Ideal para demonstrar as limitações do WAF.
Impossível — Implementação totalmente segura. Demonstra codificação defensiva adequada.
O DVWA requer uma configuração única do banco de dados após o primeiro deploy:
Acesse http://<PUBLIC_IP>/dvwa/setup.php
Clique em Create / Reset Database
Faça login com admin / password
Caminho /vampi/Imagem erev0s/vampi:latest com entrypoint gunicorn (4 workers)Instâncias 4 (portas 5101-5104), sticky via ip_hash (SQLite por instância) Recursos 0,5 CPU / 512 MiB RAM por instância Framework Python / Flask / gunicorn Projeto github.com/erev0s/VAmPI
O VAmPI foi desenvolvido especificamente para testar o OWASP API Security Top 10. Fornece uma API REST realista com vulnerabilidades deliberadas. Cada instância executa o gunicorn com 4 workers e seu próprio banco de dados SQLite. A sessão sticky ip_hash garante que o registro e o login do mesmo IP de cliente sempre atinjam a mesma instância.
Cenário OWASP API Top 10 Método Autorização Quebrada em Nível de Objeto (BOLA) API1 Acessar dados de outros usuários manipulando IDs Autenticação Quebrada API2 Tratamento fraco de tokens, sem limitação de taxa Exposição Excessiva de Dados API3 A API retorna mais dados do que o cliente necessita Atribuição em Massa API6 Modificar campos de admin via parâmetros inesperados Injeção SQL API8 Injeção por meio de parâmetros da API Gerenciamento Inadequado de Ativos API9 Endpoints de API não documentados
# Registrar um novo usuário
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 usuários (exposição excessiva de dados)
curl " http://<PUBLIC_IP>/vampi/users/v1 "
Caminho /httpbin/Imagem kennethreitz/httpbin:latest com sobrescrita do CMD do gunicorn (-w 4 -k gevent --timeout 30)Instâncias 4 (portas 8201-8204), round-robin (sem estado) Recursos 0,5 CPU / 256 MiB RAM por instância Framework Python / Flask / gunicorn + gevent Projeto httpbin.org
O httpbin é um serviço simples de requisição/resposta HTTP útil para demonstrações básicas de API, teste de cabeçalhos de requisição e verificação do comportamento do proxy.
Endpoint Finalidade /httpbin/getRetorna dados da requisição GET (cabeçalhos, args, origin) /httpbin/postRetorna dados da requisição POST (body, form, JSON) /httpbin/headersRetorna os cabeçalhos da requisição /httpbin/ipRetorna o IP de origem /httpbin/user-agentRetorna o cabeçalho User-Agent /httpbin/status/:codeRetorna o código de status HTTP especificado /httpbin/delay/:secondsAtrasa a resposta por N segundos /httpbin/anythingRetorna qualquer coisa passada na requisição
# Verificar quais cabeçalhos a origem recebe (útil para verificar injeção de cabeçalhos F5 XC)
curl -s " http://<PUBLIC_IP>/httpbin/headers " | jq .
# Testar um código de status HTTP específico
curl -s -o /dev/null -w " %{http_code} " " http://<PUBLIC_IP>/httpbin/status/403 "
Caminho /whoami/Imagem traefik/whoami:latestInstâncias 4 (portas 8082-8085), round-robin (sem estado) Recursos 0,25 CPU / 64 MiB RAM por instância Framework Go Projeto github.com/traefik/whoami
O whoami é o servidor de eco de requisições leve do Traefik. Ele exibe cada detalhe da requisição HTTP recebida conforme a origem a vê — hostname, endereços IP, todos os cabeçalhos, método e URL. Esta é a ferramenta de diagnóstico mais importante ao verificar se o F5 XC está injetando os cabeçalhos corretos.
Caso de Uso O Que Observar Verificar injeção de cabeçalhos F5 XC Cabeçalhos X-Forwarded-For, True-Client-IP, X-Volterra-* Confirmar visibilidade do IP do cliente X-Real-IP vs RemoteAddrDepurar falsos positivos do WAF Comparar cabeçalhos da requisição antes/depois do F5 XC Validar marcação de defesa contra bots Cabeçalhos X-Volterra-Bot-Type, X-Volterra-Bot-Verified Verificar terminação TLS X-Forwarded-Proto exibe https quando o TLS é encerrado no F5 XC
# Requisição básica -- ver o que a origem recebe
curl " http://<PUBLIC_IP>/whoami/ "
# Simular requisição através do F5 XC (com cabeçalhos injetados)
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 "
Exemplo de saída:
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
O DVGA foi desenvolvido especificamente para testar vulnerabilidades específicas do GraphQL. Fornece um GraphiQL IDE em /dvga/ para exploração interativa de consultas e um endpoint de API GraphQL em /dvga/graphql. Cada instância usa seu próprio banco de dados SQLite, portanto as sessões sticky ip_hash garantem estado consistente.
Cenário Categoria Vetor de Ataque Injeção GraphQL Segurança de API Consultas maliciosas via interpolação de strings Negação de Serviço Segurança de API Consultas profundamente aninhadas, consultas em lote, esgotamento de recursos Bypass de Autorização Segurança de API Acesso a dados não autorizados via GraphQL Divulgação de Informações Segurança de API Consultas de introspecção revelando detalhes do schema Ataque de Batching Segurança de API Múltiplas operações em uma única requisição
# Interface GraphiQL (IDE interativa)
curl -sf " http://<PUBLIC_IP>/dvga/ " -o /dev/null -w " %{http_code} "
# Consulta de introspecção -- enumerar o schema completo
curl -s " http://<PUBLIC_IP>/dvga/graphql " \
-H " Content-Type: application/json " \
-d ' {"query":"{ __schema { types { name fields { name } } } }"} '
# Listar pastes (consulta de exemplo)
curl -s " http://<PUBLIC_IP>/dvga/graphql " \
-H " Content-Type: application/json " \
-d ' {"query":"{ pastes { title content } }"} '
# Criar um paste (mutation)
curl -s " http://<PUBLIC_IP>/dvga/graphql " \
-H " Content-Type: application/json " \
-d ' {"query":"mutation { createPaste(title:\"test\", content:\"hello\", public:true) { paste { title } } }"} '
Caminho /restaurant/Imagem Build personalizado de theowni/Damn-Vulnerable-RESTaurant-API-Game Instâncias 4 (portas 8301-8304), round-robin (PostgreSQL compartilhado) Recursos 0,5 CPU / 256 MiB RAM por instância Banco de Dados PostgreSQL 15.4 compartilhado (contêiner restaurant-db, 0,5 CPU / 512 MiB) Framework Python / FastAPI / PostgreSQL Credenciais admin / password (PostgreSQL)Projeto github.com/theowni/Damn-Vulnerable-RESTaurant-API-Game
O RESTaurant é uma API REST vulnerável gamificada que abrange o OWASP API Security Top 10 2023. Utiliza FastAPI com documentação automática via Swagger UI em /restaurant/docs. Todas as 4 instâncias compartilham um único banco de dados PostgreSQL, portanto o balanceamento de carga round-robin funciona sem sessões sticky.
Cenário OWASP API Top 10 2023 Método Autorização Quebrada em Nível de Objeto (BOLA) API1 Acessar pedidos de outros usuários manipulando IDs Autenticação Quebrada API2 Tratamento fraco de tokens, credential stuffing Autorização Quebrada em Nível de Propriedade de Objeto API3 Atribuição em massa nos campos do perfil de usuário Consumo Irrestrito de Recursos API4 Sem limitação de taxa nos endpoints Autorização Quebrada em Nível de Função (BFLA) API5 Acessar endpoints de admin como usuário comum Server Side Request Forgery (SSRF) API7 Manipular requisições de URL no lado do servidor Configuração Incorreta de Segurança API8 Mensagens de erro detalhadas, credenciais padrão
curl -sf " http://<PUBLIC_IP>/restaurant/docs " -o /dev/null -w " %{http_code} "
curl -s " http://<PUBLIC_IP>/restaurant/openapi.json " | jq .info
# BOLA -- acessar o pedido de outro usuário (após autenticação)
curl -s " http://<PUBLIC_IP>/restaurant/orders/1 " \
-H " Authorization: Bearer <token> "
# BFLA -- tentar ação de admin como usuário comum
curl -s -X POST " http://<PUBLIC_IP>/restaurant/admin/users " \
-H " Authorization: Bearer <user_token> " \
-H " Content-Type: application/json "
Porta 8888 (dedicada — sem prefixo de caminho)Imagens crapi/crapi-web, crapi/crapi-identity, crapi/crapi-community, crapi/crapi-workshop, PostgreSQL, MongoDB, MailHogInstâncias 7 microsserviços (instância única cada) Recursos ~3,0 CPU / ~2,0 GiB RAM total Framework React SPA + microsserviços Java/Go/Python Projeto github.com/OWASP/crAPI
O crAPI é o projeto principal da OWASP para testes de segurança de API. Executa 7 microsserviços em uma porta dedicada (8888) porque o React SPA codifica seus caminhos de API e não pode ser servido atrás de um prefixo de caminho. O NSG permite tráfego de entrada na porta 8888.
O MailHog captura todos os e-mails enviados pelo crAPI (verificação de conta, redefinição de senha). Acesse o MailHog via túnel SSH na porta 18025.
Categoria Vulnerabilidades BOLA (Autorização Quebrada em Nível de Objeto) Acessar veículos, pedidos e relatórios de outros usuários BFLA (Autorização Quebrada em Nível de Função) Escalar para admin, acessar endpoints restritos Atribuição em Massa Modificar campos protegidos (função, saldo) via API SSRF (Server Side Request Forgery) Manipular busca de URL no lado do servidor Manipulação de JWT Forjar ou modificar tokens JWT para escalada de privilégios Injeção NoSQL Injetar consultas em endpoints com suporte MongoDB Exposição Excessiva de Dados A API retorna dados sensíveis do usuário
# Verificar se o crAPI está em execução
curl -sf " http://<PUBLIC_IP>:8888 " -o /dev/null -w " %{http_code} "
# Cadastrar um novo usuário
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!"} '
# Acessar o MailHog (via túnel SSH para verificação de e-mail)
# ssh -L 18025:localhost:18025 azureuser@<PUBLIC_IP>
# Em seguida, abra http://localhost:18025 no seu navegador
Porta 8888 -> crapi-web (React SPA + nginx)
-> crapi-identity (Java, autenticação de usuário, JWT)
-> crapi-community (Go, fóruns, posts)
-> crapi-workshop (Python, serviço de veículos)
-> crapi-postgres (PostgreSQL)
-> crapi-mailhog (captura de e-mail, porta 18025)
Caso de Uso para Demonstração Aplicação Principal Aplicação Secundária WAF — Injeção SQL DVWA Juice Shop WAF — XSS DVWA Juice Shop WAF — Injeção de Comando DVWA — Segurança de API — BOLA VAmPI — Segurança de API — Bypass de autenticação VAmPI Juice Shop Segurança de API — Exposição de dados VAmPI httpbin Defesa contra Bots — Força bruta DVWA Juice Shop Defesa contra Bots — Scraping Juice Shop — Defesa do Lado do Cliente — DOM XSS Juice Shop — Defesa do Lado do Cliente — XSS Armazenado DVWA Juice Shop Defesa do Lado do Cliente — Card Skimmer CSD Demo — Defesa do Lado do Cliente — Formjacker CSD Demo — Defesa do Lado do Cliente — Keylogger CSD Demo — Defesa do Lado do Cliente — Cryptominer CSD Demo — Defesa do Lado do Cliente — DOM Hijack CSD Demo — Segurança de API — Injeção GraphQL DVGA — Segurança de API — DoS GraphQL DVGA — Segurança de API — OWASP API Top 10 2023 RESTaurant crAPI Segurança de API — BFLA RESTaurant crAPI Segurança de API — Atribuição em massa crAPI RESTaurant Segurança de API — SSRF crAPI RESTaurant Segurança de API — Manipulação de JWT crAPI — Segurança de API — Injeção NoSQL crAPI — Teste básico de conectividade httpbin — Diagnóstico de requisições whoami httpbin Verificação de injeção de cabeçalhos whoami —