
로컬 호스팅, 에어갭(air-gapped) 환경의 VAPT 플랫폼으로, 8개의 병렬 스캐닝 모듈을 실행하고, 발견 항목을 CVSS v3.1로 결정론적으로 점수화하며, 로컬 LLM을 통한 선택적 AI 생성 해결 방안과 함께 PDF 보고서를 생성합니다.
maverickaayush가 제작했습니다.
로컬 호스팅, 에어갭(air-gapped) 방식의 VAPT 도구: 승인된 대상 도메인을 지정하면 8개의 스캐닝 모듈을 병렬로 실행하고, 모든 발견 항목을 결정론적으로(CVSS v3.1) 점수화하며, 로컬 LLM을 통해 선택적으로 AI 생성 평이한 영어 설명을 추가하고, PDF 보고서와 실시간 웹 대시보드를 생성합니다. 외부 API 호출 없음 - 모든 것이 자체 네트워크에서 실행됩니다.
ONUS 실행 방법은 두 가지입니다:
- 자체 호스팅(이 저장소):
docker compose up→ 도메인 입력 → 인증 확인란 체크 → 스캔. 계정, 로그인, 이메일 인증 불필요 - 설계상 단일 운영자용이며, 아래의 모든 내용은 이 경로를 기준으로 합니다.- 호스팅: 관리형 인스턴스가 **tryonus.tech**에서 운영 중입니다. 계정/OAuth 로그인, 스캔 큐, 사용자별 기록과 같은 프로덕션 전용 기능을 추가로 제공하며, 이러한 기능은 이 저장소에서 기본적으로 꺼져 있어 자체 호스팅이 단순하게 유지됩니다. 자체 호스팅 vs 호스팅을 참조하세요.
자체 호스팅 기본 경로는 의도적으로 단순하게 설계되었습니다: 가입 없음, 이메일 인증 없음, OAuth 없음. 호스팅 전용 기능(인증, 스캔 큐)은 기본적으로 꺼진 구성 플래그(REQUIRE_AUTH=false, HOSTED_QUEUE_ENABLED=false; 구성 참조) 뒤에 있으며 docker-compose.yml에는 설정되어 있지 않으므로 ONUS를 로컬에서 실행할 때 로그인을 요구하지 않습니다. 설정이 전혀 필요 없으신가요? **tryonus.tech**의 호스팅 사이트를 사용하세요.
| 새 스캔 | 실시간 스캔 상태 |
|---|---|
![]() | ![]() |
| 보고서 대시보드 | 스캔 탐색 |
|---|---|
![]() | ![]() |
domain → [recon | webscan | ssl_tls | headers | owasp | tech_fingerprint | nuclei | enumeration] (parallel, Celery)
→ any module failed/timed out? → pause for operator retry/continue/cancel
→ aggregator (dedup + OWASP-map + sort)
→ confidence verification (passive re-observation)
→ deterministic CVSS scoring
→ Ollama (Qwen 2.5 7B) AI analysis
→ WeasyPrint PDF + PostgreSQL
→ dashboard / PDF download
6개 계층: Next.js 프론트엔드 → FastAPI → Celery/Redis → 8개의 병렬 스캐닝 모듈 → Ollama (Qwen 2.5 7B) → WeasyPrint PDF + 대시보드. 전체 세부 사항은 ARCHITECTURE.md(스키마, 계약, 가드레일)와 docs/QUICK_REF.md(일반적인 변경 사항 빠른 조회)에서 확인할 수 있습니다.
mem_limit: 4g), Postgres, Redis, API, 워커, 프론트엔드가 그와 함께 실행됩니다.위의 사전 요구 사항을 확인하세요: 약 8GB 디스크와 약 6GB RAM이 필요하며, 첫 빌드는 10-15분이 소요됩니다.
cp .env.example .env
cp backend/subfinder-config/provider-config.yaml.example backend/subfinder-config/provider-config.yaml
docker compose up -d
docker compose ps # wait for zap to report healthy (~2 min)
**http://localhost:3000**을 열고 도메인을 입력한 뒤 인증 확인란을 체크하고 스캔을 시작하세요.
로그인, 가입, 이메일 인증이 없습니다. 자체 호스팅 ONUS는 기본적으로 단일 운영자용입니다 - 대시보드를 열고 스캔하는 사이에 계정 단계가 없습니다.
Ollama 설치 없이도 작동합니다. CVSS/심각도/우선순위 점수화는 항상 결정론적입니다(analysis/cvss_scorer.py) - Ollama가 실행되지 않으면 발견 항목은 AI 생성 문구 대신 규칙 기반 설명 템플릿이 적용됩니다. 활성화하려면 아래의 "선택 사항: AI 생성 설명 활성화"를 참조하세요.
이 도구를 실행하는 데 API 키가 전혀 필요 없습니다. 이 도구가 감싸는 모든 스캐닝 도구(nmap, ZAP, Nikto, testssl.sh, Nuclei, Amass, Naabu, httpx, WhatWeb, WAFW00F, FFUF)와 Ollama 자체는 키 없이도 완전히 작동합니다. 위의 subfinder 구성 복사 단계가 유일한 선택적 예외입니다 - 빈 템플릿으로 두어도 괜찮으며, subfinder는 무료/공개 소스만 사용하여 실행됩니다. 서브도메인 열거를 강화하려면 시작 전에 해당 파일에 최대 2개의 무료 티어 키를 추가할 수 있습니다: GitHub 개인 액세스 토큰과 ProjectDiscovery Chaos API 키 - provider-config.yaml.example 내부의 주석을 참조하세요.
Ollama는 호스트에서 네이티브로 실행되므로(Docker가 아님) 호스트의 GPU를 직접 사용할 수 있습니다; 컨테이너는 host.docker.internal을 통해 접근합니다.
ollama pull qwen2.5:7b127.0.0.1 전용으로,
Docker의 브리지 네트워크는 접근할 수 없음):
sudo systemctl edit ollama
[Service] 아래에 추가:
[Service]
Environment="OLLAMA_HOST=0.0.0.0:11434"
sudo systemctl daemon-reload && sudo systemctl restart ollama
curl http://localhost:11434/api/tagsdocker compose restart backend workercompose 파일은 또한 자체 승인 대상 없이 스캐너를 시험해 볼 수 있도록 12개의 의도적으로 취약한 연습용 앱(Juice Shop, DVWA, bWAPP, Mutillidae, NodeGoat, ModSecurity WAF 뒤의 DVWP/WordPress, Metasploitable2, WebGoat)을 정의합니다. 이들은 Compose 프로필 뒤에 게이트되어 있어 기본적으로 빌드/시작되지 않습니다:
docker compose --profile targets up -d
경고: 이들은 의도적으로 취약하며 일부는 실제 백도어가 포함된 서비스입니다 (Metasploitable2는 활성 vsftpd 백도어를 탑재합니다). targets 프로필은 인터넷이나 공유 네트워크에서 접근할 수 없는 머신에서만 실행하세요 - 공개 클라우드 인스턴스나 노출된 호스트에서는 절대 실행하지 마세요.
대부분은 사전 빌드된 이미지로 실행되며 추가로 필요한 것이 없습니다. 두 개(nodegoat와 dvwp-wordpress)는 이 저장소에 포함되지 않은 소스에서 빌드되므로 먼저 클론해야 합니다:
git clone https://github.com/OWASP/NodeGoat nodegoat-src
git clone https://github.com/vavkamil/dvwp dvwp-src
실행 시 게시되는 포트: Juice Shop :3001, DVWA :8081, bWAPP :8083, Mutillidae :8084, NodeGoat :8085, DVWP(WAF, TLS 경유) :8444, WebGoat :8082. Metasploitable2는 실제 백도어/인증 없는 네트워크 서비스를 노출하므로 호스트 포트를 게시하지 않습니다(Docker 내부 네트워크를 통해 backend/worker에서만 접근 가능).
.env(.env.example에서 복사)를 통해 설정하는 환경 변수:
위의 POSTGRES_PASSWORD/SECRET_KEY 기본값은 데모 전용입니다 - 로컬/개인 인스턴스에서는 괜찮지만, 다른 사람이 접근할 수 있는 환경에 배포하기 전에 둘 다 변경하세요. 이제 이것은 권고 사항이 아니라 강제 사항입니다: ONUS_ENV=production을 설정하면(또는 호스팅 인증을 켜면) 둘 중 하나라도 기본값/플레이스홀더인 동안 백엔드가 시작을 거부합니다. 강력한 키는 python -c "import secrets; print(secrets.token_urlsafe(48))"로 생성하세요.
호스팅 전용 기능은 기본적으로 꺼져 있습니다. REQUIRE_AUTH(계정 / OAuth 로그인)와 HOSTED_QUEUE_ENABLED(스캔 큐)는 모두 기본값이 false이며 docker-compose.yml에 설정되어 있지 않으므로 자체 호스팅 ONUS는 로그인이나 큐 뒤에 가둬지지 않습니다. 의도적으로 다중 사용자 호스팅 배포를 구축하지 않는 한 꺼진 상태로 두세요 - 관리형 tryonus.tech 인스턴스가 바로 이 기능들을 켜는 곳입니다.
ONUS는 기본적으로 분석 기능이 없습니다 - 아무것도 로드되지 않으며 브라우저 밖으로 나가는 데이터가 없습니다. 자체 배포에서 익명 제품 사용 지표를 수집하려면 단일 Google Analytics 4 측정 ID를 설정하세요:
NEXT_PUBLIC_GA_ID=G-XXXXXXXXXX
이는 프론트엔드 빌드 타임 변수이므로 프론트엔드 빌드 환경에서 설정하세요(Vercel/호스트 환경 변수, 또는 로컬 npm run build의 경우 frontend/.env.local). 설정하면 GA는 프로덕션 빌드에서만 로드되며 페이지 뷰와 몇 가지 제품 이벤트(예: scan_started, scan_completed, report_downloaded)를 추적합니다. 커스텀 이벤트는 frontend/lib/analytics.ts의 타입화된 헬퍼를 통해 전달됩니다 - trackEvent('scan_started').
개인정보 보호: 익명의 낮은 카디널리티 사용 이벤트만 전송됩니다 - 스캔된 도메인, 스캔 결과, 발견 항목, 보고서 내용, 인증 상태 또는 개인 데이터는 절대 전송되지 않습니다. NEXT_PUBLIC_GA_ID를 설정하지 않으면 ONUS는 이전과 정확히 동일하게 동작합니다; 분석은 전적으로 옵트인 방식입니다.
FastAPI는 대화형 Swagger 문서를 자동으로 생성합니다 - 백엔드가 실행 중이면 **http://localhost:8000/docs**를 여세요.
docker compose down
docker compose logs -f backend worker
pip install -r backend/requirements-dev.txt
pytest backend/tests
이 글을 작성하는 시점 기준 655개의 자동화된 백엔드 테스트가 있습니다. 단위/통합 테스트 스위트 외에도 이 도구는 개발 중에 엔드투엔드로 검증되었습니다: 9개의 의도적으로 취약한 연습용 애플리케이션(DVWA, Juice Shop, Mutillidae, NodeGoat, bWAPP, WebGoat, Metasploitable2, WAF 뒤의 DVWP/WordPress)과 1개의 승인된 공개 대상(testphp.vulnweb.com)에 대해 79회의 실제 스캔이 실행되고 124개의 PDF 보고서가 생성되었습니다 - 가상의 수치가 아닙니다. 명시적으로 테스트 승인을 받은 대상만 스캔하세요 - 개발 중 사용된 연습용 대상은 docs/test_findings.md를 참조하세요.
ARCHITECTURE.md - 전체 아키텍처, 스키마, 그리고 변경 시 절대 깨지면 안 되는 계약. 중요한 변경 전에 이 문서를 읽으세요.docs/QUICK_REF.md - 실행 명령, 폴더 역할, "이 변경은 어디서 해야 하나요."docs/scanners.md - 각 스캐닝 모듈의 타이밍/플래그 설계 배경.docs/ai.md - Ollama 타임아웃/컨텍스트 튜닝, 점수화가 LLM에서 완전히 분리된 이유.docs/docker.md - Docker 차이점 메모 및 빌드 시 주의사항.docs/troubleshooting.md - 모든 모듈/단계를 개별적으로 수동 테스트하는 방법.docs/roadmap.md - 과거 빌드 순서(빌드 완료).CONTRIBUTING.md - 개발 환경 설정, 테스트, PR 기대 사항.MIT - LICENSE 참조.
명시적인 서면 승인 없이 대상을 스캔하는 것은 IT Act 2000(인도) 및 이에 상응하는 국제 법령에 따라 불법입니다. 이 도구는 모든 스캔에서 인증 확인을 요구하며 책임 추적을 위해 운영자와 타임스탬프를 기록합니다.
| 자체 호스팅(이 저장소) | 호스팅(tryonus.tech) |
|---|
| 설정 | docker compose up | 없음 - 사이트만 열면 됨 |
| 로그인 | 없음 - 단일 운영자 | 계정 / Google / GitHub OAuth |
| 스캔 흐름 | 도메인 → 인증 확인란 → 스캔 | 로그인 후 동일 |
| 추가 기능 | - | 스캔 큐, 사용자별 기록, 호스팅 이메일 |
| 실행 환경 | 자체 네트워크, 에어갭 | 관리형 클라우드 |
| 변수 | 기본값 | 용도 |
|---|
POSTGRES_PASSWORD | vapt_secure_2025 | 데이터베이스 비밀번호 |
SECRET_KEY | change_me_to_a_long_random_string | 백엔드 비밀 키 |
ALLOWED_HOSTS | localhost,127.0.0.1 | FastAPI 허용 호스트 |
OLLAMA_URL | http://host.docker.internal:11434 | 백엔드/워커가 Ollama에 접근하는 주소 |
SCAN_TIMEOUT_MULTIPLIER | 1.5 | 모든 모듈의 도구/Celery 타임아웃을 확장 - 실제 환경의 대상은 실험실 대상보다 느리므로, 실험실 튜닝 타이밍에는 1.0으로 낮추세요 |
MAX_CONCURRENT_SCANS | 3 | 동시 스캔 상한(리소스 고갈 방지/대상 부하 완화 가드, DB 연결 풀 크기도 결정) |
ONUS_ENV | development | development(자체 호스팅 localhost - 약한 비밀 키는 경고만) 또는 production(약한 SECRET_KEY/Postgres 비밀번호는 치명적인 시작 실패를 유발) |