Skip to content
KitploitKITPLOIT
ToolsBlog
Submit
ToolsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

··Feeds·Contact·Privacy·© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
Tools/GitHubGitHub/zappaboy/vuln-scanner
Vulnerability ScannersContainer SecurityStatic Code Analysis (SAST)API Security TestingConfiguration AuditingWeb SecurityNetwork SecurityPenetration TestingCloud SecurityDevSecOpsSecret DetectionDNS Analysis
1141 month agoNot yet reviewed
GitHubzappaboy/vuln-scanner

vuln-scanner

Vulnerability Assessment Scanner with Report Generation

View Repository

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share

vuln-scanner

An automated vulnerability assessment platform that orchestrates 86 open-source security tools, aggregates and deduplicates findings, runs an optional OpenAI-compatible LLM analysis layer for triage, clustering, and remediation, generates proof-of-concept scripts, and produces professional Markdown, HTML, and JSON reports — all from a single BlackArch Linux Docker image.


Table of Contents

  1. Architecture
  2. Tools
  3. Target Type Gating
  4. Scan Modes
  5. Authenticated Scanning
  6. LLM Analysis
  7. PoC Generation and Execution
  8. Plugin System
  9. Report Formats
  10. Quick Start
  11. scanner.sh — Docker Wrapper
  12. Configuration
  13. Environment Variables
  14. Project Structure
  15. Adding a New Tool
  16. Development
  17. DefectDojo Integration

Architecture

root@kitploit:~
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)
Download Tool

All scanning tools and PoC execution run inside a BlackArch Linux Docker container — nothing is installed on the host.


Tools

86 tools organized by category. Each tool declares the target types it supports; the orchestrator skips incompatible pairings automatically.

Network & Port Scanning

ToolNotes
nmapFull port scan with service/version detection
rustscanFast port scanner, feeds into nmap
masscanHigh-speed TCP/UDP scanner
naabuPort scanner with service detection
netdiscoverARP-based host discovery

Web Application

ToolNotes
nucleiTemplate-based vulnerability scanner
niktoWeb server misconfiguration scanner
wapitiBlack-box web vulnerability scanner
ffufFast web fuzzer (dirs, params, headers)
feroxbusterContent discovery with recursion
gobusterURI/DNS/vhost brute-forcer
wfuzzWeb application fuzzer
dalfoxXSS scanner with parameter analysis
xsstrikeAdvanced XSS detection engine
commixCommand injection exploiter
sqlmapAutomated SQL injection and takeover
nosqlmapNoSQL injection scanner
httpxHTTP probing and fingerprinting
whatwebWeb technology fingerprinter
wafw00fWAF detection and fingerprinting
wpscanWordPress vulnerability scanner
acunetixWeb vulnerability scanner (API-based)
arachniWeb application security scanner
zapOWASP ZAP DAST scanner
wapitiBlack-box vulnerability scanner
drheaderHTTP security header analyser
humbleHTTP header security checker
hakrawlerFast web crawler for URLs and endpoints
katanaNext-gen web crawling framework

API & GraphQL

ToolNotes
kiterunnerAPI route discovery with kite files
graphql_copGraphQL security auditor
restlerStateful REST API fuzzer
apifuzzerOpenAPI/Swagger-based fuzzer
cherrybombOpenAPI spec security linter
arjunHTTP parameter discovery
paramspiderParameter mining from wayback/sources

DNS & Reconnaissance

ToolNotes
amassSubdomain enumeration (passive + active)
subfinderFast passive subdomain enumeration
dnsxDNS resolver and probe toolkit
dnsreconDNS enumeration and zone transfer
fierceDNS reconnaissance and host discovery
theharvesterOSINT: emails, names, hosts, subdomains
purednsFast subdomain brute-forcer with wildcard filtering
alterxSubdomain permutation engine
waybackurlsHistorical URL collection from Wayback Machine
httprobeLive HTTP/HTTPS host prober

TLS / SSL

ToolNotes
testsslTLS configuration and cipher suite audit
sslyzeTLS scanner (cipher suites, Heartbleed, ROBOT)
sslscanSSL/TLS service scanner
tlsxFast TLS probing
tls_attackerTLS protocol attack tool
ssh_auditSSH configuration and algorithm auditor

SMB & Network Services

ToolNotes
smbmapSMB share enumeration and permissions
enum4linuxSMB/NetBIOS enumeration
crackmapexecActive Directory and SMB assessment
openvasOpenVAS vulnerability scanner

SAST & Code Analysis

ToolNotes
banditPython SAST — common security anti-patterns
semgrepMulti-language SAST with community rules
gosecGo security checker
bearerData-flow SAST with privacy and security rules
horusecMulti-language SAST engine
brakemanRuby on Rails SAST scanner
flawfinderC/C++ static analysis for common flaws
dependency_checkOWASP dependency vulnerability scanner
pip_auditPython package vulnerability checker

Software Composition Analysis (SCA)

ToolNotes
osv-scannerOpen Source Vulnerability database scanner
npm-auditNode.js package vulnerability audit
govulncheckGo module vulnerability checker

Secrets Detection

ToolNotes
gitleaksGit history secret scanner
trufflehogDeep entropy-based secret finder
secretfinderSecrets in JS files and endpoints
detect-secretsBaseline-based secret scanner
noseyparkerHigh-speed secret scanner with pattern rules

IaC & Configuration

ToolNotes
checkovTerraform/K8s/Dockerfile IaC scanner
tfsecTerraform static analysis
terrascanMulti-cloud IaC security scanner
hadolintDockerfile best-practice linter

Cloud Infrastructure

ToolNotes
prowlerAWS/GCP/Azure security posture assessment
kube-benchCIS Kubernetes Benchmark checker

Container & Supply Chain

ToolNotes
trivyContainer image + filesystem vulnerability scanner
grypeContainer and package vulnerability matcher

Target Type Gating

The orchestrator classifies each target into one or more types and only runs tools that declare support for that type. This eliminates noise from e.g. SMB tools running against web URLs.

TypeExampleTools that match
HOSTexample.comDNS, SSL, web, SMB tools
IP10.0.0.1Network, port, SMB tools
CIDR10.0.0.0/24Network scanners
URLhttps://app.example.comWeb, API, SSL tools
PATH/src/myappSAST, SCA, secrets, IaC tools
REPOhttps://github.com/org/repoSecrets, SAST, SCA tools
IMAGEmyapp:latestContainer scanners
CLOUDaws:profile=prod, arn:aws:…Cloud posture tools (prowler, kube-bench, terrascan)

Classification is automatic — just pass the target string; the scanner figures out the type.

Cloud target formats recognised:

  • AWS ARN: arn:aws:iam::123456789012:root
  • Named profile shorthand: aws:profile=production
  • GCP project: projects/my-project-id
  • Azure subscription UUID: 00000000-0000-0000-0000-000000000000

Scan Modes

ModeDescription
paranoidMaximum stealth — passive probing, minimal footprint
passiveNo active attacks — enumeration and banner grabbing only (default)
activeStandard vulnerability checks enabled
aggressiveFull scan: all templates, brute-force, fast timing

Authenticated Scanning

Credentials are forwarded to all applicable web tools (nuclei, ffuf, feroxbuster, gobuster, nikto, sqlmap, dalfox, wpscan, wapiti, katana, hakrawler, arjun, wfuzz, corscanner, kiterunner, httpx).

Global credentials

Applied to every target unless a per-target override exists.

Via config:

root@kitploit:~
[scan.auth]
bearer_token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
username     = "admin"
password     = "secret"

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

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

Via environment variables (global only):

root@kitploit:~
VS_AUTH_BEARER_TOKEN=eyJ...
VS_AUTH_USERNAME=admin
VS_AUTH_PASSWORD=secret

Via CLI (global only):

root@kitploit:~
vuln-scanner --targets https://app.example.com \
  --auth-bearer eyJ... \
  --auth-cookie session=abc123 \
  --auth-header X-API-Key=secret

Per-target credentials

When scanning multiple targets that require different credentials, define per-target overrides under [scan.auth.targets."<target>"]. A matching entry replaces the global config for that target entirely — there is no merge. Per-target auth is config-file only (env vars and CLI flags only set the global default).

root@kitploit:~
[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"

Resolution: per-target config > global config


LLM Analysis

When an API key is present, the LLM layer activates automatically. It performs four passes over the scan results:

PassNameWhat it does
1TriageAssigns CWE, confidence, false-positive flag, exploitability summary, and designs a PoC for each finding
2PoC generationWrites self-contained Python/Bash scripts that confirm the finding using tools already in the container
3MitigationProduces concrete short-term mitigations and permanent remediations, optionally informed by PoC evidence
4ClusteringGroups findings by root cause, writes shared remediations, and produces an executive summary

Provider configuration

The LLM client is OpenAI-API-compatible — works with OpenAI, Azure OpenAI, Ollama, vLLM, LM Studio, OpenRouter, and any other compatible endpoint.

root@kitploit:~
[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 example:

root@kitploit:~
[llm]
base_url = "http://localhost:11434/v1"
api_key  = "ollama"
model    = "llama3.2"

vLLM example:

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

Feature matrix

Each LLM capability is a named feature, toggleable globally and overridable per tool or per category.

FeatureDefaultDescription
logs_analysisonFeed tool's raw output to the LLM
enrichonCWE / confidence / false-positive / exploitability triage
classifyonClassify finding type and risk
clusteronGroup findings by root cause
mitigationonGenerate mitigation and remediation
generate_poconWrite PoC scripts as report assets
execute_pocoffRun PoCs in-container (requires VS_IN_CONTAINER=1)
false_positive_filteronSuppress likely false positives from the report

Global feature config:

root@kitploit:~
[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

Feature precedence: tool override > category override > global

Custom prompts

All LLM prompts are overridable:

root@kitploit:~
[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}

Scope filters

root@kitploit:~
[llm]
include_tools      = []          # empty = all tools
exclude_tools      = ["hakrawler", "gau"]
include_categories = []
exclude_categories = ["dns"]

PoC Generation and Execution

Generation (always host-safe)

The LLM writes self-contained Python and/or Bash scripts per finding. Scripts use tools already in the BlackArch image (curl, sqlmap, nuclei, dalfox, etc.) and are written to <report>_assets/poc/. Generation never executes code — it only writes files.

root@kitploit:~
[llm.poc]
languages        = ["python", "bash"]
only_severities  = ["critical", "high", "medium"]
max_pocs         = 20
allow_git_clone  = false   # permit cloning official exploit PoCs from GitHub

Execution (container-only)

PoC execution is gated behind two independent guards:

  1. execute_poc = true in [llm.features]
  2. VS_IN_CONTAINER=1 environment variable (baked into the Docker image)

The runner refuses silently if either guard is missing, so it cannot execute on the host. A static denylist rejects scripts containing destructive patterns (rm -rf /, mkfs., fork bombs, etc.) before execution.

root@kitploit:~
# Enable PoC execution inside the container
VS_LLM_FEATURE_EXECUTE_POC=true docker compose ... run --rm scanner ...

Plugin System

Drop a .py file defining one or more AbstractTool subclasses into ./plugins/ (or ~/.vuln-scanner/plugins/) and they are auto-discovered at startup — no code changes needed.

Discovery order (later entries override on name collision):

  1. ./plugins/ (relative to CWD)
  2. ~/.vuln-scanner/plugins/
  3. Extra dirs configured via [plugins] dirs or --plugin-dir

Example plugin (plugins/my_scanner.py):

root@kitploit:~
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]:
        ...

Config:

root@kitploit:~
[plugins]
enabled = true
dirs    = ["/opt/company-scanners"]

CLI:

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

Per-target behaviour

Plugin tools are registered globally but the orchestrator's type-gating controls which targets each plugin actually runs against. A plugin declaring applicable_targets = frozenset({TargetType.URL}) will never fire against an IP or a filesystem path.

To restrict a plugin to specific target strings beyond type-gating (e.g., only run against a known staging host), return ScanStatus.SKIPPED inside run():

root@kitploit:~
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)

There is no config-level per-target plugin filter — that logic belongs in the plugin itself.


Report Formats

Three formats are generated in parallel. Select any combination:

root@kitploit:~
[report]
formats    = ["markdown", "html", "json"]
output_dir = "./reports"

Or via CLI: --formats markdown html json

Markdown (.md)

Professional structured report following industry pentest conventions:

  1. Executive Summary — prose for management
  2. Scope and Methodology — target list, tools used, scan config
  3. Severity Rating Guide — CVSS ranges
  4. Findings Overview — risk distribution matrix + per-target breakdown
  5. Vulnerability Clusters — root-cause groupings (LLM-generated)
  6. Detailed Findings — per finding: ID, severity, affected system, description, business impact, analyst note, mitigation, permanent remediation, PoC references
  7. Appendix A — scan errors
  8. Appendix B — PoC asset index

Findings from multiple tools reporting the same issue on the same target are deduplicated into a single entry showing all contributing tools.

HTML (.html)

Self-contained single-file report (no external dependencies) with:

  • Light/dark theme toggle
  • Severity-colour-coded finding cards
  • Collapsible cluster sections
  • Stats grid and executive summary hero

JSON (.json)

Full structured dump of the Assessment model — findings, LLM enrichment, clusters, stats, PoC records. Suitable for CI/CD pipeline ingestion and downstream tooling.


Quick Start

The poc.sh script starts DefectDojo, three vulnerable targets, and the scanner in one command.

Prerequisites: docker, docker compose plugin, curl, python3

root@kitploit:~
./poc.sh
StepAction
1Checks prerequisites
2Loads .env (copies from .env.example if missing)
3Starts DefectDojo stack
4Waits for DefectDojo API to be ready
5Obtains API token via admin credentials
6Starts vulnerable target containers
7Waits for each target to be reachable
8Builds the scanner Docker image
9Runs the scanner, generates reports, pushes to DefectDojo
10Prints summary with URLs and teardown instructions

With LLM analysis:

root@kitploit:~
# Copy the example env and add your key
cp .env.example .env
# Edit .env: set OPENAI_API_KEY and VS_LLM_MODEL
./poc.sh

Override scan mode:

root@kitploit:~
SCAN_MODE=active ./poc.sh

Teardown:

root@kitploit:~
docker compose down -v
docker compose -f docker-compose.target.yaml down -v

Vulnerable Targets

Local (Docker — started by poc.sh)

AppURLDescription
OWASP Juice Shophttp://localhost:3000Modern Node.js app covering OWASP Top 10
WebGoathttp://localhost:8888/WebGoatJava/Spring intentionally insecure app

Remote Lab — pentest-ground.com

Publicly available, intentionally-vulnerable systems maintained by pentest-ground.com. No setup required — scan directly to validate tools and PoC generation.

SystemURLTypeVulnerability Classes
DVWAhttps://pentest-ground.com:4280Classic Web AppCSRF, XSS, SQLi
DVGQLhttps://pentest-ground.com:5013GraphQL APICMDi, XSS, SQLi
RestFlawhttps://pentest-ground.com:9000REST APISQLi, Code Injection, XXE
GuardianLeakshttps://pentest-ground.com:81Web AppXSS, SSRF, Code Injection
root@kitploit:~
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

scanner.sh — Docker Wrapper

scanner.sh is the recommended day-to-day interface for running the scanner. It wraps docker compose run so you never need to type the compose invocation manually — just pass targets and flags directly.

root@kitploit:~
./scanner.sh [OPTIONS] [-- SCANNER_ARGS...]

Options

FlagDescription
-t, --targets HOST...One or more scan targets (URL, IP, CIDR, path, image)
-m, --mode MODEScan mode: passive | active | aggressive | paranoid
-c, --config FILEConfig file to mount (default: ./config.toml)
-f, --formats FMTReport formats, comma-separated: markdown,html,json; repeatable
--no-llmDisable LLM enrichment
--llm-model MODELLLM model override (e.g. gpt-4o, claude-sonnet-4-5)
--llm-min-severity SEVMinimum severity for LLM: info|low|medium|high|critical
--include-tools TOOLSComma-separated list of tools to run
--exclude-tools TOOLSComma-separated list of tools to skip
-e, --env KEY=VALUEPass an extra environment variable to the container
-b, --buildRebuild the Docker image before running
-n, --no-defectdojoSkip DefectDojo integration
--shellOpen an interactive shell inside the container instead of scanning
-h, --helpShow help

Everything after -- is forwarded verbatim to the scanner entrypoint, bypassing all wrapper logic.

Examples

root@kitploit:~
# 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

What it does automatically

  • Loads .env (copies from .env.example if missing)
  • Copies config.example.toml → config.toml if no config exists
  • Creates the vuln_scanner_network Docker network if not present
  • Mounts a custom --config file into the container at /app/config.toml
  • Rebuilds the image when --build is passed

Configuration

Copy the annotated template:

root@kitploit:~
cp config.example.toml config.toml

Full reference:

root@kitploit:~
[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 <token>
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

Config merge precedence: CLI > env vars > config.toml > defaults


Environment Variables

Core

VariableCLI flagDescription
VS_TARGETS--targetsSpace-separated target list
VS_MODE--modeScan mode
VS_TIMEOUT--timeoutPer-tool timeout (seconds)
VS_RATE_LIMIT--rate-limitRate limit (req/s)
VS_MAX_CONCURRENT--max-concurrentParallel tool slots
VS_INCLUDE_TOOLS--include-toolsWhitelist tools by name
VS_EXCLUDE_TOOLS--exclude-toolsBlacklist tools by name
VS_INCLUDE_CATEGORIES--include-categoriesWhitelist categories
VS_EXCLUDE_CATEGORIES--exclude-categoriesBlacklist categories
VS_OUTPUT_DIR--output-dirReport output directory

Reports

VariableCLI flagDescription
VS_FORMATS--formatsReport formats: markdown html json

LLM

VariableCLI flagDescription
OPENAI_API_KEY—API key (standard env var, used as fallback)
OPENAI_BASE_URL—Base URL fallback (for non-OpenAI endpoints)
VS_LLM_ENABLED--no-llmauto | true | false
VS_LLM_MODEL--llm-modelModel name (required when active)
VS_LLM_TEMPERATURE—Sampling temperature
VS_LLM_MAX_TOKENS—Max output tokens
VS_LLM_FEATURE_<NAME>--llm-feature NAME=onGlobal feature toggle, e.g. VS_LLM_FEATURE_GENERATE_POC=false
VS_LLM_FEATURE_EXECUTE_POC--llm-poc-executeEnable PoC execution (container-only)

Authenticated Scanning

VariableCLI flagDescription
VS_AUTH_BEARER_TOKEN--auth-bearerBearer token (Authorization: Bearer …)
VS_AUTH_USERNAME--auth-userHTTP Basic username
VS_AUTH_PASSWORD--auth-passHTTP Basic password
VS_AUTH_LOGIN_URL--auth-login-urlForm-based login URL

Cookies and extra headers must be set via config file or --auth-cookie / --auth-header CLI flags.

Plugins

VariableCLI flagDescription
VS_PLUGINS_ENABLED--no-pluginsEnable/disable plugin auto-discovery
VS_PLUGINS_DIRS--plugin-dirExtra plugin directories (space-separated)

DefectDojo

VariableCLI flagDescription
VS_DEFECTDOJO_URL--defectdojo-urlDefectDojo base URL
VS_DEFECTDOJO_API_KEY--defectdojo-api-keyAPI token
VS_DEFECTDOJO_PRODUCT—Product name
VS_DEFECTDOJO_ENGAGEMENT—Engagement name

Project Structure

root@kitploit:~
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)

Adding a New Tool

For one-off or private tools, use the Plugin System — drop a .py file into ./plugins/ with no code changes. For tools that should ship with the project:

  1. Create vuln_scanner/tools/mytool.py:
root@kitploit:~
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})

    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
  1. Register it in vuln_scanner/tools/__init__.py:
root@kitploit:~
from vuln_scanner.tools.mytool import MyTool

TOOL_REGISTRY: dict[str, type[AbstractTool]] = {
    ...
    "mytool": MyTool,
}
  1. Add the binary to Dockerfile:
root@kitploit:~
RUN pacman -Sy --noconfirm mytool

Tips:

  • For tools that write to a file instead of stdout, use OUTPUT_FILE_SENTINEL in build_command() and override run() to call self._run_with_tempfile().
  • Tools with applicable_targets = frozenset(TargetType) (the default) run against all target types — use this only for genuinely universal tools.
  • Binary not found → ScanStatus.SKIPPED (hidden from report). Tool error → ScanStatus.FAILED (shown in Appendix A).

Development

root@kitploit:~
# 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 .

Test categories:

  • tests/test_config.py — config merge and validation
  • tests/test_target_typing.py — classify_target() and applies_to()
  • tests/test_orchestrator_gating.py — type-gating with mock tools
  • tests/test_llm.py — LLM features, mocked client, PoC runner container guard
  • tests/test_reports.py — all three reporters (Markdown, HTML, JSON)
  • tests/test_nmap.py — nmap output parser

Safety rule: never run real scanning tools on the host. All tool execution happens inside the Docker container against the isolated target containers. The PocRunner enforces this — it checks VS_IN_CONTAINER=1 before executing any PoC script, and the Docker image bakes this variable in.


DefectDojo Integration

Findings are pushed automatically when api_key and product_name are configured.

Get your API key:

  1. Open DefectDojo at http://localhost:8080
  2. Log in (default: admin / admin)
  3. Go to Profile → API v2 Key

Manual push:

root@kitploit:~
VS_DEFECTDOJO_API_KEY=your-key \
VS_DEFECTDOJO_PRODUCT="My App" \
uv run vuln-scanner --targets 192.168.1.1
gau
Known URL collector (AlienVault, WaybackMachine)
jsluiceJavaScript secrets and URL extractor
corscannerCORS misconfiguration scanner
crlfuzzCRLF injection scanner
smugglerHTTP request smuggling detector
linkfinderEndpoint discovery in JavaScript/HTML source
cariddiWeb crawler with secret and endpoint detection