
Запускает набор намеренно уязвимых веб/API-приложений в изолированных Docker-стеках для локального тестирования на проникновение и проверки результатов сканеров с помощью эталонных каталогов уязвимостей.
Парк намеренно уязвимых приложений, на которые можно нацеливать инструменты безопасности (crossfyre, Burp, ZAP, nuclei и так далее). В этой папке нет исходного кода приложений — только каркасные определения и небольшой менеджер. Каждое приложение работает как собственный изолированный стек контейнеров, поэтому ничего не конфликтует.
Всё здесь намеренно уязвимо. Только для локального тестирования. Не открывайте доступ к этим приложениям в интернет или в недоверенную сеть. Все порты привязаны к
127.0.0.1.
docker compose up запускает один контейнер: vuln_apps_manager (управляющий компонент). Сам по себе он не запускает ни одного уязвимого приложения.apps/<name>/ (манифест app.yml + compose.yml) и запускается менеджером как отдельный проект docker compose.127.0.0.1. Базы данных и внутренние компоненты никогда не привязываются к хосту. Веб-сервис каждого приложения также подключается к общей сети vuln-net, поэтому сканер, работающий в контейнере, может обращаться к ним по имени (например, http://dvwa) вообще без хост-порта.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
Та единственная команда ./vam start --all также выполняет разовую настройку, необходимую каждому приложению (создание базы данных DVWA, установку bWAPP, наполнение VAmPI), так что каждое приложение можно использовать сразу, как только оно сообщит статус running — без ручного перехода по /setup.php или /install.php.
Хотите, чтобы менеджер оставался запущенным как живой монитор статуса? Сначала выполните docker compose up -d, затем используйте ./vam ..., как указано выше.
./vam <cmd> — это просто обёртка. То же самое без неё:
docker compose run --rm vuln_apps_manager start --all
docker compose run --rm vuln_apps_manager status
| Команда | Что делает |
|---|---|
./vam list | список всех приложений, их состояние и URL |
./vam start <app...> | --all [--heavy] | запустить приложение(я). --all пропускает тяжёлые приложения, если не указан --heavy |
./vam stop <app...> | --all | остановить приложение(я) |
./vam restart <app...> | --all | перезапустить приложение(я) |
./vam status | таблица состояния парка |
./vam logs <app> [-f] | вывод последних строк логов приложения |
./vam pull <app...> | --all | заранее загрузить образы |
./vam ports | карта хост-портов + проверка конфликтов |
./vam doctor | проверки окружения и портов |
Примеры: ./vam start juice-shop dvwa, ./vam start crapi --heavy, ./vam logs webgoat -f.
Все URL имеют вид http://127.0.0.1:<port> (только loopback).
| Приложение | Порт | Стек | Примечания |
|---|---|---|---|
| juice-shop | 7001 | Node / Angular | современный SPA + REST |
| dvwa | 7002 | PHP / MariaDB | БД создаётся автоматически при старте; вход admin/password |
| webgoat | 7003 | Java | + WebWolf на 7004 (ловушка OOB) |
| vampi | 7005 | Python / Flask | OWASP API Top 10 |
| dvga | 7006 | Python / GraphQL | /graphql |
| bwapp | 7007 | PHP | автоустановка при старте; вход bee/bug |
| log4shell | 7009 | Java / Spring | blind-RCE -> OAST |
| crapi | 7010 | Node/Java/Python | тяжёлое; mailhog на 7011 |
| faultline | 8088 | SvelteKit/Rust/PG/Redis | загружается с GitHub (см. ниже) |
Зарезервированный блок хост-портов: 7001-7099. ./vam ports показывает актуальную карту и помечает любые конфликты.
Поместите папку в 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)
Правила, которые поддерживают порядок в парке:
127.0.0.1:<free 70xx port>.[vuln-net]. Не добавляйте сеть на уровне проекта — это экономит пул адресов Docker (при слишком большом количестве сетей Docker падает с ошибкой "all predefined address pools have been fully subnetted").[default, vuln-net], а БД — только в [default] (частная, без привязки к хосту). Каждому приложению давайте собственный сервис БД и том (не используйте общие). Объявляйте vuln-net как external: true.apps/<name>/setup.sh. Менеджер запускает его после start изнутри контейнера менеджера (который находится в vuln-net и содержит curl), поэтому он может обратиться к приложению по имени сервиса, например curl http://<service>/install.php.На этом всё. Менеджер подхватывает приложение автоматически (./vam list).
Для приложения, исходный код которого живёт в git-репозитории (например faultline), пропустите compose.yml и вместо этого укажите в app.yml repo: (URL для клонирования) и compose: (путь к compose-файлу внутри этого репозитория). При первом запуске менеджер клонирует его в apps/<name>/src/ (исключено через .gitignore), так что исходный код сюда не включается.
В vulns/ хранится «ключ ответов» для каждого приложения (к каким уязвимостям должна быть восприимчива каждая цель), чтобы можно было сверять результаты сканера с эталоном. См. vulns/README.md. Подробные локальные каталоги есть для faultline и crapi; вышестоящие приложения указывают на собственные авторитетные ключи ответов.
crAPI запускает Postgres + Mongo + три уровня приложения (~2 ГБ), поэтому --all пропускает его. Запустите его явно: ./vam start crapi --heavy. Первая загрузка медленная; одноразовые коды (OTP) при регистрации и письма для сброса пароля попадают в mailhog на http://127.0.0.1:7011.
faultline — собственный full-stack целевой стенд Clickswave. Его исходный код не хранится здесь; при первом запуске менеджер клонирует его из github.com/clickswave/faultline:
./vam start faultline # clones the repo into apps/faultline/src/, then builds + runs it
Первый запуск собирает его (Rust; медленно). Позже обновите локальную копию с помощью ./vam pull faultline. Затем откройте http://127.0.0.1:8088. Демо-доступы: [email protected] / password, [email protected] / admin.
docker compose down останавливает только менеджер. Сначала остановите приложения командой ./vam stop --all (это отдельные проекты).