
격리된 Docker 스택에서 의도적으로 취약하게 구성된 웹/API 애플리케이션 플릿을 실행하여 로컬 침투 테스트를 수행하고, 실제 취약점 카탈로그를 기준으로 스캐너 결과를 검증합니다.
의도적으로 취약하게 만들어진 앱 모음으로, 보안 도구(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-nethttp://dvwacd 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의 create-database, bWAPP의 install, VAmPI의 seed)도 실행되므로 모든 앱이 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가 아니면 heavy 앱을 건너뜀 |
./vam stop <app...> | --all | 앱 중지 |
./vam restart <app...> | --all | 앱 재시작 |
./vam status | 앱 모음 상태 테이블 |
./vam logs <app> [-f] | 앱 로그 tail |
./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>입니다(루프백 전용).
| 앱 | 포트 | 스택 | 참고 |
|---|---|---|---|
| juice-shop | 7001 | Node / Angular | 모던 SPA + REST |
| dvwa | 7002 | PHP / MariaDB | 시작 시 DB 자동 생성; 로그인 admin/password |
| webgoat | 7003 | Java | + 7004의 WebWolf(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 | heavy; 7011에 mailhog |
| 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:<사용 가능한 70xx 포트>에 바인딩하세요.[vuln-net]에만 배치하세요. 프로젝트별 네트워크를 추가하지 마십시오. 그러면 Docker의 주소 풀이 절약됩니다(네트워크가 너무 많으면 Docker가 "all predefined address pools have been fully subnetted" 오류로 실패합니다).[default, vuln-net]에, DB는 [default]에만 배치하세요(비공개, 호스트 바인딩 없음). 각 앱에 고유한 DB 서비스와 볼륨을 제공하세요(공유하지 마십시오). 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 + 3개 앱 계층(~2 GB)을 실행하므로 --all에서 제외됩니다. 명시적으로 시작하세요: ./vam start crapi --heavy. 첫 부팅은 느립니다. 가입 OTP 및 재설정 메일은 http://127.0.0.1:7011의 mailhog에 도착합니다.
faultline은 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로 앱을 중지하세요(앱은 별도의 프로젝트입니다).