
Executa um conjunto de aplicações web/API intencionalmente vulneráveis em pilhas Docker isoladas para testes de penetração locais e validação de resultados de scanners com catálogos de vulnerabilidades de referência (ground-truth).
Um conjunto de aplicações intencionalmente vulneráveis para apontar ferramentas de segurança (crossfyre, Burp, ZAP, nuclei, e assim por diante). Esta pasta não contém código-fonte de aplicações, apenas definições de esqueleto e um pequeno gerenciador. Cada aplicação roda como sua própria pilha de contêineres isolada, para que nada entre em conflito.
Tudo aqui é deliberadamente vulnerável. Apenas para testes locais. Não exponha isso à internet ou a uma rede não confiável. Todas as portas estão vinculadas a
127.0.0.1.
docker compose up inicia um contêiner: vuln_apps_manager (o plano de controle). Ele não inicia nenhuma aplicação vulnerável por conta própria.apps/<name>/ (um manifesto app.yml + um compose.yml) e é executada pelo gerenciador como um projeto separado e próprio.docker compose127.0.0.1. Bancos de dados e camadas internas nunca são vinculados ao host. O serviço web de cada aplicação também entra em uma rede compartilhada vuln-net, para que um scanner em execução em um contêiner possa alcançá-las pelo nome (por exemplo, http://dvwa) sem nenhuma porta do host.cd vuln_apps
./vam start --all # ONE command: builds the manager, starts every light app,
# and runs each app's first-time setup automatically
./vam status # what's running + URLs
./vam stop --all # stop everything
Esse único ./vam start --all também executa a configuração única de que cada aplicação precisa (criação do banco de dados do DVWA, instalação do bWAPP, seed do VAmPI), para que toda aplicação seja utilizável no momento em que reportar running — sem cliques manuais em /setup.php ou /install.php.
Quer deixar o gerenciador no ar como um monitor de status ao vivo? Execute docker compose up -d primeiro e depois use ./vam ... como acima.
./vam <cmd> é apenas um wrapper. Exatamente a mesma coisa sem ele:
docker compose run --rm vuln_apps_manager start --all
docker compose run --rm vuln_apps_manager status
| Comando | O que faz |
|---|---|
./vam list | lista todas as aplicações, o estado e a URL delas |
./vam start <app...> | --all [--heavy] | inicia aplicação(ões). --all ignora aplicações pesadas, exceto com --heavy |
./vam stop <app...> | --all | para aplicação(ões) |
./vam restart <app...> | --all | reinicia aplicação(ões) |
./vam status | tabela de status da frota |
./vam logs <app> [-f] | acompanha os logs de uma aplicação |
./vam pull <app...> | --all | pré-baixa as imagens |
./vam ports | mapa de portas do host + verificação de conflitos |
./vam doctor | verificações de sanidade do ambiente e das portas |
Exemplos: ./vam start juice-shop dvwa, ./vam start crapi --heavy, ./vam logs webgoat -f.
Todas as URLs são http://127.0.0.1:<port> (somente loopback).
| Aplicação | Porta | Stack | Notas |
|---|---|---|---|
| juice-shop | 7001 | Node / Angular | SPA moderno + REST |
| dvwa | 7002 | PHP / MariaDB | banco de dados criado automaticamente na inicialização; login admin/password |
| webgoat | 7003 | Java | + WebWolf na 7004 (capturador OOB) |
| vampi | 7005 | Python / Flask | OWASP API Top 10 |
| dvga | 7006 | Python / GraphQL | /graphql |
| bwapp | 7007 | PHP | instalado automaticamente na inicialização; login bee/bug |
| log4shell | 7009 | Java / Spring | RCE cego -> OAST |
| crapi | 7010 | Node/Java/Python | pesado; mailhog na 7011 |
| faultline | 8088 | SvelteKit/Rust/PG/Redis | obtido do GitHub (veja abaixo) |
Bloco de portas do host reservado: 7001-7099. ./vam ports mostra o mapa em tempo real e sinaliza qualquer conflito.
Coloque uma pasta em apps/:
apps/<name>/
app.yml # name, description, category, stack, url
compose.yml # the container(s): image, ports (127.0.0.1 only), any DB
setup.sh # optional: one-time init run after start (see below)
Regras que mantêm a frota organizada:
127.0.0.1:<free 70xx port>.[vuln-net]. NÃO adicione uma rede por projeto — isso preserva o pool de endereços do Docker (redes demais e o Docker falha com "all predefined address pools have been fully subnetted").[default, vuln-net] e o banco de dados apenas em [default] (privado, sem vínculo com o host). Dê a cada aplicação seu próprio serviço e volume de banco de dados (não compartilhe). Declare vuln-net como external: true.apps/<name>/setup.sh. O gerenciador o executa após start, de dentro do contêiner do gerenciador (que está em vuln-net e tem curl), para que ele possa acessar a aplicação pelo nome do serviço, por exemplo, curl http://<service>/install.php.Só isso. O gerenciador o detecta automaticamente (./vam list).
Para uma aplicação cujo código-fonte vive em um repositório git (como faultline), pule o compose.yml e, em vez disso, coloque repo: (a URL de clonagem) e compose: (o caminho do compose dentro desse repositório) em app.yml. O gerenciador o clona para apps/<name>/src/ (ignorado pelo git) na primeira inicialização, portanto nenhum código-fonte é incluído aqui.
vulns/ contém um "gabarito" por aplicação (ao que cada alvo deve ser vulnerável), para que você possa verificar os achados de um scanner contra a referência. Veja vulns/README.md. Catálogos locais detalhados existem para faultline e crapi; as aplicações upstream apontam para seus próprios gabaritos de referência.
O crAPI executa Postgres + Mongo + três camadas de aplicação (~2 GB), então --all o ignora. Inicie-o explicitamente: ./vam start crapi --heavy. A primeira inicialização é lenta; o OTP de cadastro e os e-mails de redefinição chegam ao mailhog em http://127.0.0.1:7011.
faultline é o alvo full-stack da própria Clickswave. Seu código-fonte não está incluído aqui; o gerenciador o clona de github.com/clickswave/faultline na primeira inicialização:
./vam start faultline # clones the repo into apps/faultline/src/, then builds + runs it
A primeira inicialização o compila (Rust; lento). Atualize o checkout depois com ./vam pull faultline. Então abra http://127.0.0.1:8088. Logins de demonstração: [email protected] / password, [email protected] / admin.
docker compose down interrompe apenas o gerenciador. Pare as aplicações primeiro com ./vam stop --all (elas são projetos separados).