Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
vuln-scanner — 보고서 생성 기능을 갖춘 취약점 평가 스캐너 | Kitploit
도구/GitHubGitHub/zappaboy/vuln-scanner
Vulnerability ScannersContainer SecurityStatic Code Analysis (SAST)API Security TestingConfiguration AuditingWeb SecurityNetwork SecurityPenetration TestingCloud SecurityDevSecOpsSecret DetectionDNS Analysis
1141개월 전아직 검토되지 않음
GitHubzappaboy/vuln-scanner

vuln-scanner

보고서 생성 기능을 갖춘 취약점 평가 스캐너

저장소 보기

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

vuln-scanner

86개의 오픈소스 보안 도구를 오케스트레이션하고, 발견 사항을 집계 및 중복 제거하며, 분류·클러스터링·수정을 위한 선택적 OpenAI 호환 LLM 분석 레이어를 실행하고, 개념 증명(PoC) 스크립트를 생성하며, 단일 BlackArch Linux Docker 이미지에서 전문적인 Markdown, HTML 및 JSON 보고서를 생성하는 자동화된 취약점 평가 플랫폼입니다.


목차

  1. 아키텍처
  2. 도구
  3. 대상 유형 게이팅
  4. 스캔 모드
  5. 인증 스캔
  6. LLM 분석
  7. PoC 생성 및 실행
  8. 플러그인 시스템
  9. 보고서 형식
  10. 빠른 시작
  11. scanner.sh — Docker 래퍼
  12. 구성
  13. 환경 변수
  14. 프로젝트 구조
  15. 새 도구 추가
  16. 개발
  17. DefectDojo 통합

아키텍처```

config.toml / env vars / CLI args ↓ AppConfig (pydantic, 3-layer merge: TOML < env < CLI) ↓ Plugin loader — auto-discovers ./plugins/ + ~/.vuln-scanner/plugins/ ↓ ScanOrchestrator • classify_target() → TargetType • tool.applies_to(target) — skips mismatched pairs • asyncio + ThreadPoolExecutor — parallel (tool × target) tasks • AuthConfig forwarded to every applicable tool ↓ ScanResult[] → Assessment ↓ LLMAnalyzer (optional) • Pass 1: triage + PoC design (threaded, per result) • Pass 2: PoC generation (PocGenerator, host-safe) • Pass 3: mitigation (evidence-informed) • Pass 4: clustering + exec summary ↓ PocRunner (container-only, VS_IN_CONTAINER=1 guard) ↓ ┌────────┬────────┬────────┐ │ .md │ .html │ .json │ (all formats written in parallel) └────────┴────────┴────────┘ ↓ DefectDojo (optional)

root@kitploit:~
모든 스캐닝 도구와 PoC 실행은 **BlackArch Linux** Docker 컨테이너 내부에서 실행됩니다. 호스트에는 아무것도 설치되지 않습니다.

---

## 도구

86개의 도구가 카테고리별로 구성되어 있습니다. 각 도구는 지원하는 대상 유형을 명시하며, 오케스트레이터는 호환되지 않는 조합을 자동으로 건너뜁니다.

### 네트워크 및 포트 스캐닝
| 도구 | 설명 |
|------|-------|
| `nmap` | 서비스/버전 탐지를 포함한 전체 포트 스캔 |
| `rustscan` | 빠른 포트 스캐너, nmap에 결과 전달 |
| `masscan` | 고속 TCP/UDP 스캐너 |
| `naabu` | 서비스 탐지가 포함된 포트 스캐너 |
| `netdiscover` | ARP 기반 호스트 탐색 |

### 웹 애플리케이션
| 도구 | 설명 |
|------|-------|
| `nuclei` | 템플릿 기반 취약점 스캐너 |
| `nikto` | 웹 서버 오설정 스캐너 |
| `wapiti` | 블랙박스 웹 취약점 스캐너 |
| `ffuf` | 빠른 웹 퍼저 (디렉토리, 파라미터, 헤더) |
| `feroxbuster` | 재귀적 콘텐츠 검색 |
| `gobuster` | URI/DNS/vhost 무차별 대입 도구 |
| `wfuzz` | 웹 애플리케이션 퍼저 |
| `dalfox` | 파라미터 분석 기능이 포함된 XSS 스캐너 |
| `xsstrike` | 고급 XSS 탐지 엔진 |
| `commix` | 커맨드 인젝션 공격 도구 |
| `sqlmap` | 자동화된 SQL 인젝션 및 탈취 |
| `nosqlmap` | NoSQL 인젝션 스캐너 |
| `httpx` | HTTP 프로빙 및 핑거프린팅 |
| `whatweb` | 웹 기술 핑거프린터 |
| `wafw00f` | WAF 탐지 및 핑거프린팅 |
| `wpscan` | WordPress 취약점 스캐너 |
| `acunetix` | 웹 취약점 스캐너 (API 기반) |
| `arachni` | 웹 애플리케이션 보안 스캐너 |
| `zap` | OWASP ZAP DAST 스캐너 |
| `wapiti` | 블랙박스 취약점 스캐너 |
| `drheader` | HTTP 보안 헤더 분석기 |
| `humble` | HTTP 헤더 보안 점검기 |
| `hakrawler` | URL 및 엔드포인트를 위한 빠른 웹 크롤러 |
| `katana` | 차세대 웹 크롤링 프레임워크 |
| `gau` | 알려진 URL 수집기 (AlienVault, WaybackMachine) |
| `jsluice` | JavaScript 시크릿 및 URL 추출기 |
| `corscanner` | CORS 오설정 스캐너 |
| `crlfuzz` | CRLF 인젝션 스캐너 |
| `smuggler` | HTTP 요청 스머글링 탐지기 |
| `linkfinder` | JavaScript/HTML 소스에서 엔드포인트 탐색 |
| `cariddi` | 시크릿 및 엔드포인트 탐지 기능이 있는 웹 크롤러 |

### API 및 GraphQL
| 도구 | 설명 |
|------|-------|
| `kiterunner` | kite 파일을 사용한 API 라우트 탐색 |
| `graphql_cop` | GraphQL 보안 감사 도구 |
| `restler` | 상태 기반 REST API 퍼저 |
| `apifuzzer` | OpenAPI/Swagger 기반 퍼저 |
| `cherrybomb` | OpenAPI 스펙 보안 린터 |
| `arjun` | HTTP 파라미터 탐색 |
| `paramspider` | wayback/소스에서 파라미터 발굴 |

### DNS 및 정보 수집
| 도구 | 설명 |
|------|-------|
| `amass` | 서브도메인 열거 (패시브 + 액티브) |
| `subfinder` | 빠른 패시브 서브도메인 열거 |
| `dnsx` | DNS 리졸버 및 프로브 도구 모음 |
| `dnsrecon` | DNS 열거 및 존 전송 |
| `fierce` | DNS 정찰 및 호스트 탐색 |
| `theharvester` | OSINT: 이메일, 이름, 호스트, 서브도메인 |
| `puredns` | 와일드카드 필터링이 지원되는 빠른 서브도메인 무차별 대입 도구 |
| `alterx` | 서브도메인 순열 엔진 |
| `waybackurls` | Wayback Machine에서 과거 URL 수집 |
| `httprobe` | 활성 HTTP/HTTPS 호스트 프로버 |

### TLS / SSL
| 도구 | 설명 |
|------|-------|
| `testssl` | TLS 구성 및 암호 스위트 감사 |
| `sslyze` | TLS 스캐너 (암호 스위트, Heartbleed, ROBOT) |
| `sslscan` | SSL/TLS 서비스 스캐너 |
| `tlsx` | 빠른 TLS 프로빙 |
| `tls_attacker` | TLS 프로토콜 공격 도구 |
| `ssh_audit` | SSH 구성 및 알고리즘 감사 도구 |

### SMB 및 네트워크 서비스
| 도구 | 설명 |
|------|-------|
| `smbmap` | SMB 공유 열거 및 권한 확인 |
| `enum4linux` | SMB/NetBIOS 열거 |
| `crackmapexec` | Active Directory 및 SMB 평가 |
| `openvas` | OpenVAS 취약점 스캐너 |

### SAST 및 코드 분석
| 도구 | 설명 |
|------|-------|
| `bandit` | Python SAST — 일반적인 보안 안티패턴 |
| `semgrep` | 커뮤니티 규칙이 포함된 다중 언어 SAST |
| `gosec` | Go 보안 점검기 |
| `bearer` | 개인정보 및 보안 규칙이 포함된 데이터 흐름 SAST |
| `horusec` | 다중 언어 SAST 엔진 |
| `brakeman` | Ruby on Rails SAST 스캐너 |
| `flawfinder` | 일반적인 결함 탐지를 위한 C/C++ 정적 분석 |
| `dependency_check` | OWASP 의존성 취약점 스캐너 |
| `pip_audit` | Python 패키지 취약점 점검기 |

### 소프트웨어 구성 분석(SCA)
| 도구 | 설명 |
|------|-------|
| `osv-scanner` | 오픈소스 취약점 데이터베이스 스캐너 |
| `npm-audit` | Node.js 패키지 취약점 감사 |
| `govulncheck` | Go 모듈 취약점 점검기 |

### 시크릿 탐지
| 도구 | 설명 |
|------|-------|
| `gitleaks` | Git 히스토리 시크릿 스캐너 |
| `trufflehog` | 엔트로피 기반 심층 시크릿 탐지기 |
| `secretfinder` | JS 파일 및 엔드포인트의 시크릿 |
| `detect-secrets` | 베이스라인 기반 시크릿 스캐너 |
| `noseyparker` | 패턴 규칙이 포함된 고속 시크릿 스캐너 |

### IaC 및 구성
| 도구 | 설명 |
|------|-------|
| `checkov` | Terraform/K8s/Dockerfile IaC 스캐너 |
| `tfsec` | Terraform 정적 분석 |
| `terrascan` | 멀티클라우드 IaC 보안 스캐너 |
| `hadolint` | Dockerfile 모범 사례 린터 |

### 클라우드 인프라
| 도구 | 설명 |
|------|-------|
| `prowler` | AWS/GCP/Azure 보안 태세 평가 |
| `kube-bench` | CIS Kubernetes Benchmark 점검기 |

### 컨테이너 및 공급망
| 도구 | 설명 |
|------|-------|
| `trivy` | 컨테이너 이미지 + 파일시스템 취약점 스캐너 |
| `grype` | 컨테이너 및 패키지 취약점 매처 |

---

## 대상 유형 게이팅

오케스트레이터는 각 대상을 하나 이상의 유형으로 분류하고 해당 유형을 지원한다고 선언한 도구만 실행합니다. 이를 통해 예를 들어 웹 URL에 대해 SMB 도구가 실행되는 것 같은 노이즈를 제거합니다.

| 유형 | 예시 | 일치하는 도구 |
|------|---------|-----------------|
| `HOST` | `example.com` | DNS, SSL, 웹, SMB 도구 |
| `IP` | `10.0.0.1` | 네트워크, 포트, SMB 도구 |
| `CIDR` | `10.0.0.0/24` | 네트워크 스캐너 |
| `URL` | `https://app.example.com` | 웹, API, SSL 도구 |
| `PATH` | `/src/myapp` | SAST, SCA, 시크릿, IaC 도구 |
| `REPO` | `https://github.com/org/repo` | 시크릿, SAST, SCA 도구 |
| `IMAGE` | `myapp:latest` | 컨테이너 스캐너 |
| `CLOUD` | `aws:profile=prod`, `arn:aws:…` | 클라우드 보안 태세 도구 (prowler, kube-bench, terrascan) |

분류는 자동입니다 — 대상 문자열만 전달하면 스캐너가 유형을 식별합니다.

인식되는 클라우드 대상 형식:
- AWS ARN: `arn:aws:iam::123456789012:root`
- 명명된 프로필 축약 표기: `aws:profile=production`
- GCP 프로젝트: `projects/my-project-id`
- Azure 구독 UUID: `00000000-0000-0000-0000-000000000000`

---

## 스캔 모드

| 모드 | 설명 |
|------|-------------|
| `paranoid` | 최대 은밀성 — 패시브 프로빙, 최소 발자국 |
| `passive` | 활성 공격 없음 — 열거 및 배너 그랩만 수행 **(기본값)** |
| `active` | 표준 취약점 점검 활성화 |
| `aggressive` | 전체 스캔: 모든 템플릿, 무차별 대입, 빠른 타이밍 |

---

## 인증 스캔

자격 증명은 적용 가능한 모든 웹 도구(nuclei, ffuf, feroxbuster, gobuster, nikto, sqlmap, dalfox, wpscan, wapiti, katana, hakrawler, arjun, wfuzz, corscanner, kiterunner, httpx)에 전달됩니다.

### 전역 자격 증명

대상별 재정의가 없는 한 모든 대상에 적용됩니다.

**config를 통해:**```toml
[scan.auth]
bearer_token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
username     = "admin"
password     = "secret"

[scan.auth.cookies]
session = "abc123"

[scan.auth.headers]
X-API-Key = "my-api-key"

환경 변수를 통한 (전역만):```bash VS_AUTH_BEARER_TOKEN=eyJ... VS_AUTH_USERNAME=admin VS_AUTH_PASSWORD=secret

root@kitploit:~
**CLI를 통해** (전역 전용):```bash
vuln-scanner --targets https://app.example.com \
  --auth-bearer eyJ... \
  --auth-cookie session=abc123 \
  --auth-header X-API-Key=secret

대상별 자격 증명

서로 다른 자격 증명이 필요한 여러 대상을 스캔할 때는 [scan.auth.targets."<target>"] 아래에 대상별 재정의를 정의하십시오. 일치하는 항목은 해당 대상에 대한 전역 구성을 완전히 대체합니다 — 병합은 이루어지지 않습니다. 대상별 인증은 구성 파일에서만 설정할 수 있습니다(환경 변수와 CLI 플래그는 전역 기본값만 설정합니다).```toml [scan.auth]

Global fallback — used for any target without a specific entry

bearer_token = "default-token"

JWT for the main app

[scan.auth.targets."https://app.example.com"] bearer_token = "app-specific-jwt"

Cookie session for the admin panel

[scan.auth.targets."https://admin.example.com"] [scan.auth.targets."https://admin.example.com".cookies] session = "s%3Aabc123" csrftoken = "xyz789"

HTTP Basic for an internal API

[scan.auth.targets."10.0.0.50"] username = "apiuser" password = "s3cret"

Form login for a legacy app

[scan.auth.targets."https://legacy.example.com"] login_url = "https://legacy.example.com/login" username = "admin" password = "password123" [scan.auth.targets."https://legacy.example.com".login_data] _token = "csrf-value-here"

root@kitploit:~
**해석:** `per-target config > global config`

---

## LLM 분석

API 키가 있으면 LLM 계층이 자동으로 활성화됩니다. 검사 결과에 대해 네 번의 패스를 수행합니다:

| 패스 | 이름 | 수행 작업 |
|------|------|-------------|
| 1 | **트리아지** | 각 발견 항목에 CWE, 신뢰도, 오탐 플래그, 악용 가능성 요약을 할당하고 PoC를 설계합니다 |
| 2 | **PoC 생성** | 컨테이너에 이미 있는 도구를 사용하여 발견 항목을 확인하는 독립형 Python/Bash 스크립트를 작성합니다 |
| 3 | **완화** | PoC 증거를 선택적으로 반영하여 구체적인 단기 완화 조치와 영구 수정 방안을 생성합니다 |
| 4 | **클러스터링** | 근본 원인별로 발견 항목을 그룹화하고 공통 수정 방안을 작성하며 경영진 요약을 생성합니다 |

### 프로바이더 구성

LLM 클라이언트는 OpenAI-API와 호환됩니다 — OpenAI, Azure OpenAI, Ollama, vLLM, LM Studio, OpenRouter 및 기타 호환 엔드포인트와 함께 작동합니다.```toml
[llm]
enabled   = "auto"          # "auto" | true | false  (auto = on when api_key present)
api_key   = ""              # or set OPENAI_API_KEY env var
base_url  = ""              # leave empty for OpenAI; set for Ollama/vLLM/etc.
model     = "gpt-4o"        # REQUIRED when LLM is active — no default

# Sampling parameters (all OpenAI-compatible)
temperature = 0.2
top_p       = 0.95
max_tokens  = 4096
# top_k and other non-standard params go in extra_body:
# [llm.extra_body]
# top_k = 40

Ollama 예제:```toml [llm] base_url = "http://localhost:11434/v1" api_key = "ollama" model = "llama3.2"

root@kitploit:~
**vLLM 예제:**```toml
[llm]
base_url = "http://localhost:8000/v1"
api_key  = "token-abc123"
model    = "meta-llama/Meta-Llama-3-8B-Instruct"

기능 매트릭스

각 LLM 기능은 명명된 기능(feature)으로, 전역적으로 토글할 수 있으며 도구 또는 카테고리별로 재정의할 수 있습니다.

기능기본값설명
logs_analysison도구의 원시 출력을 LLM에 전달
enrichonCWE / 신뢰도 / 오탐 / 악용 가능성 분류
classifyon발견 유형과 위험도 분류
clusteron근본 원인별로 발견 항목 그룹화
mitigationon완화 및 수정 가이드 생성
generate_pocon보고서 자산으로 PoC 스크립트 작성
execute_pocoff컨테이너 내에서 PoC 실행 (VS_IN_CONTAINER=1 필요)
false_positive_filteron보고서에서 오탐 가능성이 높은 항목 억제

전역 기능 구성:```toml [llm.features] generate_poc = true execute_poc = false # enable only inside Docker

Per-tool override — disable PoC for bandit (SAST, no runtime target)

[llm.features.tool.bandit] generate_poc = false

Per-category override — disable log analysis for noisy crawlers

[llm.features.category.web] logs_analysis = false

root@kitploit:~
**기능 우선순위:** `tool override > category override > global`

### 커스텀 프롬프트

모든 LLM 프롬프트는 재정의할 수 있습니다:```toml
[llm.prompts]
enrich_system    = "You are a senior penetration tester..."
mitigation_user  = "Write remediation steps for: {title}..."
# Available placeholders: {title} {severity} {description} {cwe}
#   {exploitability} {tool} {target} {cves} {raw_output}

범위 필터```toml

[llm] include_tools = [] # empty = all tools exclude_tools = ["hakrawler", "gau"] include_categories = [] exclude_categories = ["dns"]

root@kitploit:~
---

## PoC 생성 및 실행

### 생성 (항상 호스트 안전)

LLM은 각 발견 항목에 대해 자체 포함된 Python 및/또는 Bash 스크립트를 작성합니다. 스크립트는 BlackArch 이미지에 이미 포함된 도구(`curl`, `sqlmap`, `nuclei`, `dalfox` 등)를 사용하며 `<report>_assets/poc/`에 저장됩니다. 생성 단계는 코드를 실행하지 않으며 파일만 작성합니다.```toml
[llm.poc]
languages        = ["python", "bash"]
only_severities  = ["critical", "high", "medium"]
max_pocs         = 20
allow_git_clone  = false   # permit cloning official exploit PoCs from GitHub

실행 (컨테이너 전용)

PoC 실행은 두 개의 독립적인 가드로 제어됩니다:

  1. [llm.features]의 execute_poc = true
  2. VS_IN_CONTAINER=1 환경 변수 (Docker 이미지에 내장되어 있음)

실행기는 가드 중 하나라도 없으면 조용히 거부하므로 호스트에서는 실행할 수 없습니다. 정적 차단 목록은 실행 전에 파괴적인 패턴(rm -rf /, mkfs., 포크 폭탄 등)을 포함하는 스크립트를 거부합니다.```bash

Enable PoC execution inside the container

VS_LLM_FEATURE_EXECUTE_POC=true docker compose ... run --rm scanner ...

root@kitploit:~
---

## 플러그인 시스템

하나 이상의 `AbstractTool` 하위 클래스를 정의하는 `.py` 파일을 `./plugins/`(또는 `~/.vuln-scanner/plugins/`)에 넣으면 시작 시 자동으로 발견됩니다 — 코드 변경이 필요 없습니다.

**탐지 순서** (이름 충돌 시 나중 항목이 우선합니다):
1. `./plugins/` (CWD 기준)
2. `~/.vuln-scanner/plugins/`
3. `[plugins] dirs` 또는 `--plugin-dir`로 구성된 추가 디렉터리

**예제 플러그인** (`plugins/my_scanner.py`):```python
from vuln_scanner.tools.abstract import AbstractTool
from vuln_scanner.tools.enums import Severity, ScanStatus, TargetType
from vuln_scanner.tools.models import Finding, ScanInput, ScanResult

class MyScannerTool(AbstractTool):
    name: str = "my-scanner"
    category: str = "web"
    # Only runs against URL targets — skipped automatically for IPs, paths, etc.
    applicable_targets: frozenset[TargetType] = frozenset({TargetType.URL})

    def build_command(self, target: str, scan_input: ScanInput) -> list[str]:
        return ["my-scanner", "--target", target, "--json"]

    def parse_output(self, raw: str, target: str) -> list[Finding]:
        ...

설정:```toml [plugins] enabled = true dirs = ["/opt/company-scanners"]

root@kitploit:~
**CLI:**```bash
vuln-scanner --plugin-dir /opt/company-scanners --targets https://app.example.com

대상별 동작

플러그인 도구는 전역적으로 등록되지만, 오케스트레이터의 유형 게이팅(type-gating)이 각 플러그인이 실제로 실행될 대상을 제어합니다. applicable_targets = frozenset({TargetType.URL})를 선언하는 플러그인은 IP나 파일 시스템 경로에는 절대 실행되지 않습니다.

유형 게이팅을 넘어 플러그인을 특정 대상 문자열로 제한하려면(예: 알려진 스테이징 호스트에만 실행), run() 내부에서 ScanStatus.SKIPPED를 반환하십시오:```python def run(self, target: str, scan_input: ScanInput) -> ScanResult: if "staging" not in target: return ScanResult(tool=self.name, target=target, status=ScanStatus.SKIPPED) return super().run(target, scan_input)

root@kitploit:~
구성 수준의 대상별 플러그인 필터는 없습니다 — 해당 논리는 플러그인 자체에 있습니다.

---

## 보고서 형식

세 가지 형식이 병렬로 생성됩니다. 원하는 조합을 선택하세요:```toml
[report]
formats    = ["markdown", "html", "json"]
output_dir = "./reports"

또는 CLI를 통해: --formats markdown html json

Markdown (.md)

업계 펜테스트 관례를 따르는 전문 구조화 보고서:

  1. 임원 요약 — 경영진을 위한 산문
  2. 범위 및 방법론 — 대상 목록, 사용된 도구, 스캔 구성
  3. 심각도 등급 가이드 — CVSS 범위
  4. 발견 사항 개요 — 위험 분포 매트릭스 + 대상별 분석
  5. 취약점 클러스터 — 근본 원인 그룹화(LLM 생성)
  6. 상세 발견 사항 — 각 발견 항목: ID, 심각도, 영향받은 시스템, 설명, 비즈니스 영향, 분석가 메모, 완화 조치, 영구적 수정, PoC 참조
  7. 부록 A — 스캔 오류
  8. 부록 B — PoC 자산 인덱스

동일한 대상에서 동일한 문제를 보고한 여러 도구의 발견 사항은 기여한 모든 도구를 표시하는 단일 항목으로 중복 제거됩니다.

HTML (.html)

외부 종속성이 없는 단일 파일 보고서로 다음을 포함합니다:

  • 라이트/다크 테마 토글
  • 심각도 색상으로 구분된 발견 항목 카드
  • 접을 수 있는 클러스터 섹션
  • 통계 그리드 및 임원 요약 히어로

JSON (.json)

Assessment 모델의 전체 구조적 덤프 — 발견 사항, LLM 강화, 클러스터, 통계, PoC 레코드. CI/CD 파이프라인 수집 및 다운스트림 도구에 적합합니다.


빠른 시작

poc.sh 스크립트는 DefectDojo, 세 개의 취약한 대상 및 스캐너를 하나의 명령으로 시작합니다.

전제 조건: docker, docker compose 플러그인, curl, `python3````bash ./poc.sh

root@kitploit:~
| 단계 | 작업 |
|------|--------|
| 1 | 사전 요구 사항 확인 |
| 2 | `.env` 로드 (없으면 `.env.example`에서 복사) |
| 3 | DefectDojo 스택 시작 |
| 4 | DefectDojo API가 준비될 때까지 대기 |
| 5 | 관리자 자격 증명을 통해 API 토큰 획득 |
| 6 | 취약한 대상 컨테이너 시작 |
| 7 | 각 대상에 연결할 수 있을 때까지 대기 |
| 8 | 스캐너 Docker 이미지 빌드 |
| 9 | 스캐너 실행, 보고서 생성, DefectDojo로 푸시 |
| 10 | URL 및 정리 지침이 포함된 요약 출력 |

**LLM 분석 포함:**```bash
# Copy the example env and add your key
cp .env.example .env
# Edit .env: set OPENAI_API_KEY and VS_LLM_MODEL
./poc.sh

스캔 모드 재정의:```bash SCAN_MODE=active ./poc.sh

root@kitploit:~
**분해:**```bash
docker compose down -v
docker compose -f docker-compose.target.yaml down -v

취약한 대상

로컬 (Docker — poc.sh로 시작)

앱URL설명
OWASP Juice Shophttp://localhost:3000OWASP Top 10을 다루는 최신 Node.js 앱
WebGoathttp://localhost:8888/WebGoat의도적으로 취약하게 만든 Java/Spring 앱

원격 실습 환경 — pentest-ground.com

공개적으로 이용 가능하며 pentest-ground.com이 유지 관리하는 의도적 취약 시스템입니다. 별도 설정이 필요 없습니다 — 도구와 PoC 생성을 검증하려면 직접 스캔하세요.

시스템URL유형취약점 종류
DVWAhttps://pentest-ground.com:4280클래식 웹 앱CSRF, XSS, SQLi
DVGQLhttps://pentest-ground.com:5013GraphQL APICMDi, XSS, SQLi
RestFlawhttps://pentest-ground.com:9000REST APISQLi, Code Injection, XXE
GuardianLeakshttps://pentest-ground.com:81웹 앱XSS, SSRF, Code Injection
vuln-scanner --targets \
https://pentest-ground.com:4280 \
https://pentest-ground.com:5013 \
https://pentest-ground.com:9000 \
https://pentest-ground.com:81 \
--mode active
root@kitploit:~
---

## scanner.sh — Docker 래퍼

`scanner.sh`는 스캐너 실행을 위한 권장 일상 인터페이스입니다. `docker compose run`을 감싸므로 compose 호출을 수동으로 입력할 필요 없이 대상과 플래그를 직접 전달하기만 하면 됩니다.```bash
./scanner.sh [OPTIONS] [-- SCANNER_ARGS...]

Options

Flag설명
-t, --targets HOST...하나 이상의 스캔 대상 (URL, IP, CIDR, 경로, 이미지)
-m, --mode MODE스캔 모드: passive | active | aggressive | paranoid
-c, --config FILE마운트할 구성 파일 (기본값: ./config.toml)
-f, --formats FMT보고서 형식, 쉼표로 구분: markdown,html,json; 반복 가능
--no-llmLLM 보강 비활성화
--llm-model MODELLLM 모델 재정의 (예: gpt-4o, claude-sonnet-4-5)
--llm-min-severity SEVLLM에 대한 최소 심각도: info|low|medium|high|critical
--include-tools TOOLS실행할 도구 목록(쉼표로 구분)
--exclude-tools TOOLS건너뛸 도구 목록(쉼표로 구분)
-e, --env KEY=VALUE컨테이너에 추가 환경 변수 전달
-b, --build실행 전에 Docker 이미지 다시 빌드
-n, --no-defectdojoDefectDojo 통합 건너뛰기
--shell스캔 대신 컨테이너 내부에서 대화형 셸 열기
-h, --help도움말 표시

-- 뒤의 모든 것은 래퍼 로직을 우회하여 스캐너 엔트리포인트에 그대로 전달됩니다.

Examples```bash

Scan using ./config.toml (targets and mode come from the config)

./scanner.sh

Quick scan with explicit targets and mode

./scanner.sh -t https://app.example.com 192.168.1.0/24 -m active

Use a custom config file

./scanner.sh -c /path/to/prod.toml

Enable LLM enrichment with a specific model

./scanner.sh -t https://app.example.com --llm-model gpt-4o

Run only specific tools

./scanner.sh -t https://app.example.com --include-tools nuclei,dalfox,ffuf

Rebuild the image first, then scan

./scanner.sh --build -t https://app.example.com -m active

Full manual passthrough to the scanner entrypoint

./scanner.sh -- --targets https://t.example.com --mode aggressive --formats markdown html json

Open an interactive shell (all tools, volumes, and env available)

./scanner.sh --shell ./scanner.sh --build --shell

root@kitploit:~
### What it does automatically

- `.env` 로드 (없으면 `.env.example`에서 복사)
- 기존 config가 없으면 `config.example.toml` → `config.toml` 복사
- `vuln_scanner_network` Docker 네트워크가 없으면 생성
- 사용자 지정 `--config` 파일을 컨테이너의 `/app/config.toml`에 마운트
- `--build` 전달 시 이미지 재빌드

---

## 설정

주석이 달린 템플릿을 복사하세요:```bash
cp config.example.toml config.toml

전체 참조:```toml [scan] targets = ["192.168.1.1", "https://app.example.com", "/src/myapp"] mode = "passive" # paranoid | passive | active | aggressive timeout = 300 # per-tool timeout in seconds rate_limit = null # requests/sec; null = no limit

Authenticated scanning — forwarded to all applicable web tools

[scan.auth] bearer_token = "" # Authorization: Bearer username = "" # HTTP Basic username password = "" # HTTP Basic password login_url = "" # Form-based login URL

[scan.auth.cookies]

session = "abc123"

[scan.auth.headers]

X-API-Key = "secret"

[tools] exclude = ["nikto"] # skip specific tools by name

[categories] include = ["web", "ssl"] # limit to these categories; empty = all

[plugins] enabled = true

dirs = ["/opt/company-scanners"]

[report] formats = ["markdown", "html", "json"] output_dir = "./reports"

[defectdojo] url = "http://localhost:8080" api_key = "" product_name = "My Product" engagement_name = "Automated Scan"

── LLM Analysis ─────────────────────────────────────────────────────────────

[llm] enabled = "auto" # "auto" | true | false api_key = "" # or OPENAI_API_KEY env var base_url = "" # leave empty for OpenAI model = "" # required when active, e.g. "gpt-4o" or "llama3.2" temperature = 0.2 top_p = 0.95 max_tokens = 4096

extra_body = { top_k = 40 } # for Ollama/vLLM top_k support

exclude_tools = [] exclude_categories = []

[llm.features] logs_analysis = true enrich = true classify = true cluster = true mitigation = true generate_poc = true execute_poc = false # container-only; set VS_LLM_FEATURE_EXECUTE_POC=true false_positive_filter = true

Per-tool feature overrides (tool > category > global precedence)

[llm.features.tool.bandit] generate_poc = false

[llm.features.category.dns] logs_analysis = false

[llm.poc] languages = ["python", "bash"] only_severities = ["critical", "high", "medium"] max_pocs = 20 allow_git_clone = false

root@kitploit:~
**구성 병합 우선순위:** `CLI > env vars > config.toml > defaults`

---

## 환경 변수

### 핵심

| 변수 | CLI 플래그 | 설명 |
|----------|----------|-------------|
| `VS_TARGETS` | `--targets` | 공백으로 구분된 대상 목록 |
| `VS_MODE` | `--mode` | 스캔 모드 |
| `VS_TIMEOUT` | `--timeout` | 도구별 제한 시간(초) |
| `VS_RATE_LIMIT` | `--rate-limit` | 속도 제한(req/s) |
| `VS_MAX_CONCURRENT` | `--max-concurrent` | 병렬 도구 슬롯 |
| `VS_INCLUDE_TOOLS` | `--include-tools` | 이름으로 도구 허용 목록 |
| `VS_EXCLUDE_TOOLS` | `--exclude-tools` | 이름으로 도구 차단 목록 |
| `VS_INCLUDE_CATEGORIES` | `--include-categories` | 허용할 카테고리 |
| `VS_EXCLUDE_CATEGORIES` | `--exclude-categories` | 차단할 카테고리 |
| `VS_OUTPUT_DIR` | `--output-dir` | 보고서 출력 디렉터리 |

### 보고서

| 변수 | CLI 플래그 | 설명 |
|----------|----------|-------------|
| `VS_FORMATS` | `--formats` | 보고서 형식: `markdown html json` |

### LLM

| 변수 | CLI 플래그 | 설명 |
|----------|----------|-------------|
| `OPENAI_API_KEY` | — | API 키(표준 환경 변수, 폴백으로 사용됨) |
| `OPENAI_BASE_URL` | — | 기본 URL 폴백(비 OpenAI 엔드포인트용) |
| `VS_LLM_ENABLED` | `--no-llm` | `auto` \| `true` \| `false` |
| `VS_LLM_MODEL` | `--llm-model` | 모델 이름(활성화 시 필수) |
| `VS_LLM_TEMPERATURE` | — | 샘플링 온도 |
| `VS_LLM_MAX_TOKENS` | — | 최대 출력 토큰 수 |
| `VS_LLM_FEATURE_<NAME>` | `--llm-feature NAME=on` | 전역 기능 토글(예: `VS_LLM_FEATURE_GENERATE_POC=false`) |
| `VS_LLM_FEATURE_EXECUTE_POC` | `--llm-poc-execute` | PoC 실행 활성화(컨테이너 전용) |

### 인증 스캔

| 변수 | CLI 플래그 | 설명 |
|----------|----------|-------------|
| `VS_AUTH_BEARER_TOKEN` | `--auth-bearer` | Bearer 토큰(`Authorization: Bearer …`) |
| `VS_AUTH_USERNAME` | `--auth-user` | HTTP Basic 사용자 이름 |
| `VS_AUTH_PASSWORD` | `--auth-pass` | HTTP Basic 비밀번호 |
| `VS_AUTH_LOGIN_URL` | `--auth-login-url` | 폼 기반 로그인 URL |

쿠키와 추가 헤더는 구성 파일 또는 `--auth-cookie` / `--auth-header` CLI 플래그로 설정해야 합니다.

### 플러그인

| 변수 | CLI 플래그 | 설명 |
|----------|----------|-------------|
| `VS_PLUGINS_ENABLED` | `--no-plugins` | 플러그인 자동 검색 활성화/비활성화 |
| `VS_PLUGINS_DIRS` | `--plugin-dir` | 추가 플러그인 디렉터리(공백으로 구분) |

### DefectDojo

| 변수 | CLI 플래그 | 설명 |
|----------|----------|-------------|
| `VS_DEFECTDOJO_URL` | `--defectdojo-url` | DefectDojo 기본 URL |
| `VS_DEFECTDOJO_API_KEY` | `--defectdojo-api-key` | API 토큰 |
| `VS_DEFECTDOJO_PRODUCT` | — | 제품 이름 |
| `VS_DEFECTDOJO_ENGAGEMENT` | — | Engagement 이름 |

---

## 프로젝트 구조```
vuln_scanner/
├── config/
│   ├── models.py        # AppConfig, AppLLMConfig, PluginsConfig (pydantic)
│   └── loader.py        # 3-layer merge: TOML + env (VS_*) + CLI
│
├── tools/
│   ├── enums.py         # Severity, Confidence, ScanStatus, ScanMode, TargetType
│   ├── models.py        # Finding, ScanInput, ScanResult, AuthConfig (pydantic)
│   ├── target.py        # classify_target() — maps target string to TargetType set
│   ├── abstract.py      # AbstractTool ABC + subprocess execution helpers
│   ├── __init__.py      # TOOL_REGISTRY (86 tools)
│   └── <tool>.py        # One file per tool (86 total)
│
├── llm/
│   ├── models.py        # LLMConfig, LLMFeatures, PocConfig (pydantic)
│   ├── features.py      # resolve_features() — tool > category > global merge
│   ├── client.py        # LLMClient — thin openai SDK wrapper
│   ├── analyzer.py      # LLMAnalyzer — 4-pass analysis pipeline
│   └── prompts.py       # Default prompt templates (all overridable)
│
├── poc/
│   ├── models.py        # Poc, PocVerdict
│   ├── generator.py     # PocGenerator — writes scripts, never executes (host-safe)
│   └── runner.py        # PocRunner — executes scripts (VS_IN_CONTAINER guard)
│
├── reports/
│   ├── base.py          # AbstractReporter
│   ├── markdown.py      # Professional structured Markdown report
│   ├── html.py          # Self-contained HTML with light/dark theme
│   └── json_reporter.py # Full Assessment JSON dump
│
├── defectdojo/
│   └── client.py        # DefectDojoClient — push findings via REST API
│
├── plugins.py           # Plugin auto-discovery (./plugins/, ~/.vuln-scanner/plugins/)
├── model.py             # Assessment, Cluster, AssessmentStats
└── orchestrator.py      # ScanOrchestrator — type-gated, async concurrent execution

plugins/                 # Drop .py plugin files here (auto-discovered at startup)
main.py                  # Entry point
config.example.toml      # Fully documented configuration template
.env.example             # Environment variable reference
Dockerfile               # BlackArch-based image; bakes VS_IN_CONTAINER=1
docker-compose.yaml                # DefectDojo stack
docker-compose.scanner.yaml        # Scanner service
docker-compose.target.yaml        # Vulnerable test targets (Juice Shop, WebGoat)
scanner.sh                        # Convenience wrapper — runs the scanner via docker compose
poc.sh                            # End-to-end quick-start script (DefectDojo + targets + scanner)

새 도구 추가

일회성 또는 비공개 도구의 경우, 플러그인 시스템을 사용하세요 — 코드 변경 없이 .py 파일을 ./plugins/에 넣으면 됩니다. 프로젝트와 함께 제공되어야 하는 도구의 경우:

  1. vuln_scanner/tools/mytool.py를 생성하세요:```python from vuln_scanner.tools.abstract import AbstractTool from vuln_scanner.tools.enums import Severity, TargetType from vuln_scanner.tools.models import Finding, ScanInput

class MyTool(AbstractTool): name: str = "mytool" category: str = "web" # Declare which target types this tool supports. # The orchestrator skips mismatched (tool, target) pairs automatically. applicable_targets: frozenset[TargetType] = frozenset({TargetType.URL, TargetType.HOST})

root@kitploit:~
def build_command(self, target: str, scan_input: ScanInput) -> list[str]:
    return ["mytool", "--target", target]

def parse_output(self, raw: str, target: str) -> list[Finding]:
    findings = []
    for line in raw.splitlines():
        if "VULN" in line:
            findings.append(Finding(
                title="Example finding",
                severity=Severity.HIGH,
                description=line,
                tool=self.name,
                target=target,
            ))
    return findings
root@kitploit:~
2. `vuln_scanner/tools/__init__.py`에 등록하세요:```python
from vuln_scanner.tools.mytool import MyTool

TOOL_REGISTRY: dict[str, type[AbstractTool]] = {
    ...
    "mytool": MyTool,
}
  1. Dockerfile에 바이너리를 추가하세요:```dockerfile RUN pacman -Sy --noconfirm mytool
root@kitploit:~
**팁:**
- stdout 대신 파일에 쓰는 도구의 경우 `build_command()`에서 `OUTPUT_FILE_SENTINEL`을 사용하고 `self._run_with_tempfile()`을 호출하도록 `run()`을 재정의하세요.
- `applicable_targets = frozenset(TargetType)` (기본값)이 있는 도구는 모든 대상 유형에 대해 실행됩니다. — 진정으로 범용적인 도구에만 사용하세요.
- 바이너리를 찾을 수 없음 → `ScanStatus.SKIPPED` (보고서에서 숨김). 도구 오류 → `ScanStatus.FAILED` (부록 A에 표시).

---

## 개발```bash
# Install with dev dependencies
uv sync

# Run tests (host-safe only — no real tool execution)
uv run pytest tests/ -v

# Lint
uv run ruff check .
uv run ruff format .

테스트 카테고리:

  • tests/test_config.py — 구성 병합 및 검증
  • tests/test_target_typing.py — classify_target() 및 applies_to()
  • tests/test_orchestrator_gating.py — mock 도구를 사용한 타입 게이팅
  • tests/test_llm.py — LLM 기능, mock 클라이언트, PoC 러너 컨테이너 가드
  • tests/test_reports.py — 세 가지 리포트 (Markdown, HTML, JSON)
  • tests/test_nmap.py — nmap 출력 파서

안전 규칙: 호스트에서 실제 스캐닝 도구를 실행하지 마십시오. 모든 도구 실행은 격리된 대상 컨테이너에 대해 Docker 컨테이너 내부에서 이루어집니다. PocRunner는 이를 강제합니다 — PoC 스크립트를 실행하기 전에 VS_IN_CONTAINER=1을 확인하며, Docker 이미지에는 이 변수가 내장되어 있습니다.


DefectDojo 통합

api_key 및 product_name이 구성되면 발견 항목이 자동으로 푸시됩니다.

API 키 얻기:

  1. http://localhost:8080에서 DefectDojo를 엽니다.
  2. 로그인합니다 (기본값: admin / admin)
  3. Profile → API v2 Key로 이동합니다.

수동 푸시:```bash VS_DEFECTDOJO_API_KEY=your-key
VS_DEFECTDOJO_PRODUCT="My App"
uv run vuln-scanner --targets 192.168.1.1

root@kitploit:~
도구 다운로드