Pular para o conteúdo

Aplicações

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.

CaminhoAplicaçãoMétodo HTTPResposta Esperada
/Página inicialGET200 HTML com links para todas as apps
/healthVerificação de saúdeGET200 JSON {"status":"healthy","component":"origin-server",...}
/juice-shop/Juice ShopGET200 HTML (Angular SPA, ~75 KB)
/juice-shop/rest/products/search?q=API Juice ShopGET200 JSON {"status":"success","data":[...]} (36 produtos)
/dvwa/DVWAGET302 redirecionamento para /dvwa/login.php
/dvwa/login.phpLogin DVWAGET200 HTML formulário de login
/dvwa/setup.phpConfiguração DVWAGET200 HTML (inicialização do banco de dados na primeira execução)
/vampi/VAmPIGET200 HTML (documentação da API)
/vampi/users/v1API VAmPIGET200 JSON {"users":[...]}
/vampi/users/v1/registerAPI VAmPIPOST200 JSON {"status":"success",...}
/vampi/users/v1/loginAPI VAmPIPOST200 JSON {"auth_token":"...","status":"success"}
/httpbin/gethttpbinGET200 JSON com detalhes da requisição
/httpbin/posthttpbinPOST200 JSON com dados enviados
/httpbin/headershttpbinGET200 JSON {"headers":{...}}
/httpbin/status/:codehttpbinGETRetorna o código de status HTTP especificado
/whoami/whoamiGET200 texto simples com hostname, IP e todos os cabeçalhos
/csd-demo/CSD DemoGET200 HTML formulário de checkout com painel de ataque
/csd-demo/dashboardVisão do atacante CSDGET200 HTML exibindo dados exfiltrados
/csd-demo/healthSaúde do CSDGET200 JSON {"status":"healthy","component":"csd-demo",...}
/csd-demo/exfil/logLog de exfiltração CSDGET200 array JSON de dados capturados
/dvga/DVGA GraphiQLGET200 HTML (GraphiQL IDE)
/dvga/graphqlAPI GraphQL DVGAPOST200 JSON resposta GraphQL
/restaurant/RESTaurantGET200 (redireciona para docs)
/restaurant/docsSwagger RESTaurantGET200 HTML (FastAPI Swagger UI)
/restaurant/openapi.jsonOpenAPI RESTaurantGET200 JSON especificação OpenAPI
http://<PUBLIC_IP>:8888crAPIGET200 HTML (SPA)
http://<PUBLIC_IP>:8888/identity/api/auth/signupCadastro crAPIPOST200 JSON
http://<PUBLIC_IP>:8888/identity/api/auth/loginLogin crAPIPOST200 JSON {"token":"..."}
Caminho/juice-shop/
Imagembkimminich/juice-shop:latest
Instâncias4 (portas 3001-3004), sticky via hash $cookie_token, cache de proxy (TTL de 60 s)
Recursos2 CPU / 1 GiB RAM por instância
FrameworkNode.js / Angular
Projetoowasp.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árioCategoriaVetor de Ataque
Bypass de login com injeção SQLWAF' OR 1=1-- no campo de e-mail do login
XSS RefletidoWAF, CSDInjeção de script via parâmetro de busca
XSS baseado em DOMCSDPayload no fragmento da URL
Autenticação quebradaWAFForça bruta no login, manipulação de JWT
Abuso de APISegurança de APIAcesso não autorizado aos endpoints /api/
Exposição de dados sensíveisSegurança de APIAcesso a dados de usuário sem autorização
CSRFWAFCross-site request forgery em alterações de perfil
Terminal window
curl -s "http://<PUBLIC_IP>/juice-shop/" -o /dev/null -w "%{http_code}"
Caminho/dvwa/
ImagemPersonalizada dvwa-fpm:latest (php-fpm + nginx, construída a partir de ghcr.io/digininja/dvwa:latest)
Instâncias4 (portas 8101-8104), sticky via hash $cookie_PHPSESSID
Recursos0,5 CPU / 256 MiB RAM por instância
Banco de DadosMariaDB 10.11 compartilhado (contêiner dvwa-db, 1 CPU / 768 MiB)
FrameworkPHP 8 / php-fpm / MariaDB
Credenciaisadmin / 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árioCategoriaNível de Segurança
Injeção SQLWAFBaixo: trivial ' OR 1=1#, Alto: SQLi cego
Injeção de ComandoWAFBaixo: ; ls, Alto: caracteres filtrados
Inclusão de ArquivoWAFBaixo: path traversal direto, Alto: sanitizado
XSS (Refletido)WAF, CSDBaixo: básico <script>, Alto: bypass codificado
XSS (Armazenado)WAF, CSDBaixo: script persistente no livro de visitas
Upload de ArquivoWAFBaixo: upload de shell PHP, Alto: filtragem de extensão
Força BrutaDefesa contra BotsTentativas 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:

  1. Acesse http://<PUBLIC_IP>/dvwa/setup.php
  2. Clique em Create / Reset Database
  3. Faça login com admin / password
Caminho/vampi/
Imagemerev0s/vampi:latest com entrypoint gunicorn (4 workers)
Instâncias4 (portas 5101-5104), sticky via ip_hash (SQLite por instância)
Recursos0,5 CPU / 512 MiB RAM por instância
FrameworkPython / Flask / gunicorn
Projetogithub.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árioOWASP API Top 10Método
Autorização Quebrada em Nível de Objeto (BOLA)API1Acessar dados de outros usuários manipulando IDs
Autenticação QuebradaAPI2Tratamento fraco de tokens, sem limitação de taxa
Exposição Excessiva de DadosAPI3A API retorna mais dados do que o cliente necessita
Atribuição em MassaAPI6Modificar campos de admin via parâmetros inesperados
Injeção SQLAPI8Injeção por meio de parâmetros da API
Gerenciamento Inadequado de AtivosAPI9Endpoints de API não documentados
Terminal window
# 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"}'
# Login
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/
Imagemkennethreitz/httpbin:latest com sobrescrita do CMD do gunicorn (-w 4 -k gevent --timeout 30)
Instâncias4 (portas 8201-8204), round-robin (sem estado)
Recursos0,5 CPU / 256 MiB RAM por instância
FrameworkPython / Flask / gunicorn + gevent
Projetohttpbin.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.

EndpointFinalidade
/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
Terminal window
# 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/
Imagemtraefik/whoami:latest
Instâncias4 (portas 8082-8085), round-robin (sem estado)
Recursos0,25 CPU / 64 MiB RAM por instância
FrameworkGo
Projetogithub.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 UsoO Que Observar
Verificar injeção de cabeçalhos F5 XCCabeçalhos X-Forwarded-For, True-Client-IP, X-Volterra-*
Confirmar visibilidade do IP do clienteX-Real-IP vs RemoteAddr
Depurar falsos positivos do WAFComparar cabeçalhos da requisição antes/depois do F5 XC
Validar marcação de defesa contra botsCabeçalhos X-Volterra-Bot-Type, X-Volterra-Bot-Verified
Verificar terminação TLSX-Forwarded-Proto exibe https quando o TLS é encerrado no F5 XC
Terminal window
# 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:

Hostname: 534c5084e169
IP: 127.0.0.1
RemoteAddr: 172.17.0.1:55118
GET / HTTP/1.1
Host: 20.12.78.159
User-Agent: curl/8.5.0
Accept: */*
True-Client-Ip: 203.0.113.50
X-Forwarded-For: 203.0.113.50, 10.0.0.1
X-Forwarded-Proto: https
X-Real-Ip: 104.219.105.84
Caminho/dvga/
Imagemdolevf/dvga:latest
Instâncias4 (portas 5201-5204), sticky via ip_hash (SQLite por instância)
Recursos0,5 CPU / 256 MiB RAM por instância
FrameworkPython / Flask / GraphQL
Projetogithub.com/dolevf/Damn-Vulnerable-GraphQL-Application

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árioCategoriaVetor de Ataque
Injeção GraphQLSegurança de APIConsultas maliciosas via interpolação de strings
Negação de ServiçoSegurança de APIConsultas profundamente aninhadas, consultas em lote, esgotamento de recursos
Bypass de AutorizaçãoSegurança de APIAcesso a dados não autorizados via GraphQL
Divulgação de InformaçõesSegurança de APIConsultas de introspecção revelando detalhes do schema
Ataque de BatchingSegurança de APIMúltiplas operações em uma única requisição
Terminal window
# 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/
ImagemBuild personalizado de theowni/Damn-Vulnerable-RESTaurant-API-Game
Instâncias4 (portas 8301-8304), round-robin (PostgreSQL compartilhado)
Recursos0,5 CPU / 256 MiB RAM por instância
Banco de DadosPostgreSQL 15.4 compartilhado (contêiner restaurant-db, 0,5 CPU / 512 MiB)
FrameworkPython / FastAPI / PostgreSQL
Credenciaisadmin / password (PostgreSQL)
Projetogithub.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árioOWASP API Top 10 2023Método
Autorização Quebrada em Nível de Objeto (BOLA)API1Acessar pedidos de outros usuários manipulando IDs
Autenticação QuebradaAPI2Tratamento fraco de tokens, credential stuffing
Autorização Quebrada em Nível de Propriedade de ObjetoAPI3Atribuição em massa nos campos do perfil de usuário
Consumo Irrestrito de RecursosAPI4Sem limitação de taxa nos endpoints
Autorização Quebrada em Nível de Função (BFLA)API5Acessar endpoints de admin como usuário comum
Server Side Request Forgery (SSRF)API7Manipular requisições de URL no lado do servidor
Configuração Incorreta de SegurançaAPI8Mensagens de erro detalhadas, credenciais padrão
Terminal window
# Swagger UI
curl -sf "http://<PUBLIC_IP>/restaurant/docs" -o /dev/null -w "%{http_code}"
# Especificação OpenAPI
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"
Porta8888 (dedicada — sem prefixo de caminho)
Imagenscrapi/crapi-web, crapi/crapi-identity, crapi/crapi-community, crapi/crapi-workshop, PostgreSQL, MongoDB, MailHog
Instâncias7 microsserviços (instância única cada)
Recursos~3,0 CPU / ~2,0 GiB RAM total
FrameworkReact SPA + microsserviços Java/Go/Python
Projetogithub.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.

CategoriaVulnerabilidades
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 MassaModificar campos protegidos (função, saldo) via API
SSRF (Server Side Request Forgery)Manipular busca de URL no lado do servidor
Manipulação de JWTForjar ou modificar tokens JWT para escalada de privilégios
Injeção NoSQLInjetar consultas em endpoints com suporte MongoDB
Exposição Excessiva de DadosA API retorna dados sensíveis do usuário
Terminal window
# 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!"}'
# Fazer login
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-mongo (MongoDB)
-> crapi-mailhog (captura de e-mail, porta 18025)
Caso de Uso para DemonstraçãoAplicação PrincipalAplicação Secundária
WAF — Injeção SQLDVWAJuice Shop
WAF — XSSDVWAJuice Shop
WAF — Injeção de ComandoDVWA
Segurança de API — BOLAVAmPI
Segurança de API — Bypass de autenticaçãoVAmPIJuice Shop
Segurança de API — Exposição de dadosVAmPIhttpbin
Defesa contra Bots — Força brutaDVWAJuice Shop
Defesa contra Bots — ScrapingJuice Shop
Defesa do Lado do Cliente — DOM XSSJuice Shop
Defesa do Lado do Cliente — XSS ArmazenadoDVWAJuice Shop
Defesa do Lado do Cliente — Card SkimmerCSD Demo
Defesa do Lado do Cliente — FormjackerCSD Demo
Defesa do Lado do Cliente — KeyloggerCSD Demo
Defesa do Lado do Cliente — CryptominerCSD Demo
Defesa do Lado do Cliente — DOM HijackCSD Demo
Segurança de API — Injeção GraphQLDVGA
Segurança de API — DoS GraphQLDVGA
Segurança de API — OWASP API Top 10 2023RESTaurantcrAPI
Segurança de API — BFLARESTaurantcrAPI
Segurança de API — Atribuição em massacrAPIRESTaurant
Segurança de API — SSRFcrAPIRESTaurant
Segurança de API — Manipulação de JWTcrAPI
Segurança de API — Injeção NoSQLcrAPI
Teste básico de conectividadehttpbin
Diagnóstico de requisiçõeswhoamihttpbin
Verificação de injeção de cabeçalhoswhoami