Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
vuln-scanner — Сканер оценки уязвимостей с генерацией отчётов | Kitploit
Инструменты/GitHubGitHub/zappaboy/vuln-scanner
Сканеры уязвимостейБезопасность контейнеровСтатический анализ кода (SAST)Тестирование безопасности APIАудит конфигурацииВеб-безопасностьСетевая безопасностьТестирование на ПроникновениеБезопасность облачных средDevSecOpsОбнаружение СекретовАнализ DNS
1126 дней назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
GitHubzappaboy/vuln-scanner

vuln-scanner

Сканер оценки уязвимостей с генерацией отчётов

Репозиторий

vuln-scanner

Автоматизированная платформа оценки уязвимостей, которая оркестрирует 86 инструментов безопасности с открытым исходным кодом, агрегирует и дедуплицирует находки, запускает необязательный совместимый с OpenAI слой анализа на основе LLM для триажа, кластеризации и устранения уязвимостей, генерирует скрипты доказательства концепции и создаёт профессиональные отчёты в форматах Markdown, HTML и JSON — всё из единого Docker-образа BlackArch Linux.


Оглавление

  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 запускаются внутри Docker-контейнера **BlackArch Linux** — на хосте ничего не устанавливается.

---

## Инструменты

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-пробинг и снятие отпечатков (fingerprinting) |
| `whatweb` | Определитель веб-технологий |
| `wafw00f` | Обнаружение и идентификация WAF |
| `wpscan` | Сканер уязвимостей WordPress |
| `acunetix` | Сканер уязвимостей веб-приложений (на основе API) |
| `arachni` | Сканер безопасности веб-приложений |
| `zap` | DAST-сканер OWASP ZAP |
| `wapiti` | Сканер уязвимостей методом чёрного ящика |
| `drheader` | Анализатор HTTP security-заголовков |
| `humble` | Проверка безопасности HTTP-заголовков |
| `hakrawler` | Быстрый веб-краулер для URL и эндпоинтов |
| `katana` | Фреймворк веб-краулинга нового поколения |
| `gau` | Сборщик известных URL (AlienVault, WaybackMachine) |
| `jsluice` | Извлечение секретов и URL из JavaScript |
| `corscanner` | Сканер ошибок конфигурации CORS |
| `crlfuzz` | Сканер CRLF-инъекций |
| `smuggler` | Детектор HTTP-смагглинга (контрабанды запросов) |
| `linkfinder` | Обнаружение эндпоинтов в исходном коде JavaScript/HTML |
| `cariddi` | Веб-краулер с обнаружением секретов и эндпоинтов |

### API и GraphQL
| Инструмент | Примечания |
|------|-------|
| `kiterunner` | Обнаружение маршрутов API с файлами kite |
| `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: email-адреса, имена, хосты, поддомены |
| `puredns` | Быстрый брутфорсер поддоменов с фильтрацией wildcard |
| `alterx` | Движок перестановок поддоменов |
| `waybackurls` | Сбор исторических URL из Wayback Machine |
| `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` | SAST для Python — типичные анти-паттерны безопасности |
| `semgrep` | Многоязычный SAST с правилами сообщества |
| `gosec` | Проверка безопасности Go |
| `bearer` | SAST с анализом потоков данных и правилами приватности и безопасности |
| `horusec` | Многоязычный SAST-движок |
| `brakeman` | SAST-сканер для Ruby on Rails |
| `flawfinder` | Статический анализ C/C++ на типичные ошибки |
| `dependency_check` | Сканер уязвимостей зависимостей OWASP |
| `pip_audit` | Проверка уязвимостей Python-пакетов |

### Анализ состава ПО (SCA)
| Инструмент | Примечания |
|------|-------|
| `osv-scanner` | Сканер базы уязвимостей открытого ПО (Open Source Vulnerability database) |
| `npm-audit` | Аудит уязвимостей Node.js-пакетов |
| `govulncheck` | Проверка уязвимостей Go-модулей |

### Обнаружение секретов
| Инструмент | Примечания |
|------|-------|
| `gitleaks` | Сканер секретов в истории Git |
| `trufflehog` | Глубокий поиск секретов на основе энтропии |
| `secretfinder` | Секреты в JS-файлах и эндпоинтах |
| `detect-secrets` | Сканер секретов на основе базовой линии (baseline) |
| `noseyparker` | Высокоскоростной сканер секретов с правилами на основе паттернов |

### IaC и конфигурация
| Инструмент | Примечания |
|------|-------|
| `checkov` | Сканер IaC для Terraform/K8s/Dockerfile |
| `tfsec` | Статический анализ Terraform |
| `terrascan` | Мультиоблачный сканер безопасности IaC |
| `hadolint` | Линтер Dockerfile по лучшим практикам |

### Облачная инфраструктура
| Инструмент | Примечания |
|------|-------|
| `prowler` | Оценка уровня безопасности AWS/GCP/Azure |
| `kube-bench` | Проверка CIS Kubernetes Benchmark |

### Контейнеры и цепочка поставок
| Инструмент | Примечания |
|------|-------|
| `trivy` | Сканер уязвимостей образов контейнеров + файловых систем |
| `grype` | Сопоставитель уязвимостей контейнеров и пакетов |

---

## Фильтрация по типу цели

Оркестратор классифицирует каждую цель по одному или нескольким типам и запускает только те инструменты, которые заявляют поддержку соответствующего типа. Это исключает шум, например, от SMB-инструментов, запускаемых против веб-URL.

| Тип | Пример | Подходящие инструменты |
|------|---------|-----------------|
| `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`
- UUID подписки Azure: `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).

### Глобальные учётные данные

Применяются к каждой цели, если не существует переопределения для конкретной цели.

**Через конфигурацию:**```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:~
**Resolution:** `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 и любым другим совместимым endpoint.```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 является именованной функцией, глобально переключаемой и переопределяемой для каждого инструмента или категории.

Глобальная конфигурация функций:```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. execute_poc = true в [llm.features]
  2. Переменная окружения VS_IN_CONTAINER=1 (встроена в Docker-образ)

Раннер молча отказывается от выполнения, если отсутствует любой из предохранителей, поэтому он не может выполняться на хосте. Статический денайлист отклоняет скрипты, содержащие деструктивные паттерны (rm -rf /, mkfs., fork-бомбы и т.п.) перед выполнением.```bash

Enable PoC execution inside the container

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

root@kitploit:~
---

## Система плагинов

Поместите `.py`-файл, определяющий один или несколько подклассов `AbstractTool`, в `./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-адреса или пути файловой системы.

Чтобы ограничить плагин конкретными строками целей в дополнение к гейтингу по типу (например, запускать только против известного staging-хоста), возвращайте ScanStatus.SKIPPED внутри run():```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. Подходит для ingestion в CI/CD-пайплайны и для последующих инструментов.


Быстрый старт

Скрипт poc.sh запускает DefectDojo, три уязвимые цели и сканер одной командой.

Необходимые компоненты: docker, плагин docker compose, curl, `python3````bash ./poc.sh

root@kitploit:~
| Step | Action |
|------|--------|
| 1 | Проверяет предварительные требования |
| 2 | Загружает `.env` (копирует из `.env.example`, если отсутствует) |
| 3 | Запускает стек DefectDojo |
| 4 | Ожидает готовности API DefectDojo |
| 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:3000

Удалённая лаборатория — pentest-ground.com

Общедоступные, преднамеренно уязвимые системы, поддерживаемые pentest-ground.com. Настройка не требуется — сканируйте напрямую для проверки инструментов и генерации PoC.

root@kitploit:~
---

## scanner.sh — Docker-обёртка

`scanner.sh` — рекомендуемый повседневный интерфейс для запуска сканера. Он оборачивает `docker compose run`, так что вам не нужно вводить команду compose вручную — просто передавайте цели и флаги напрямую.```bash
./scanner.sh [OPTIONS] [-- SCANNER_ARGS...]

Опции

Всё, что идёт после --, передаётся дословно в точку входа сканера, минуя всю логику обёртки.

Примеры```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:~
### Что делает автоматически

- Загружает `.env` (копирует из `.env.example`, если отсутствует)
- Копирует `config.example.toml` → `config.toml`, если конфигурация не существует
- Создаёт Docker-сеть `vuln_scanner_network`, если она отсутствует
- Монтирует пользовательский файл `--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`

---

## Переменные окружения

### Основные

| Variable | CLI flag | Description |
|----------|----------|-------------|
| `VS_TARGETS` | `--targets` | Список целей через пробел |
| `VS_MODE` | `--mode` | Режим сканирования |
| `VS_TIMEOUT` | `--timeout` | Тайм-аут на инструмент (секунды) |
| `VS_RATE_LIMIT` | `--rate-limit` | Ограничение скорости (запросов/с) |
| `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` | Каталог вывода отчётов |

### Отчёты

| Variable | CLI flag | Description |
|----------|----------|-------------|
| `VS_FORMATS` | `--formats` | Форматы отчётов: `markdown html json` |

### LLM

| Variable | CLI flag | Description |
|----------|----------|-------------|
| `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 (только в контейнере) |

### Аутентифицированное сканирование

| Variable | CLI flag | Description |
|----------|----------|-------------|
| `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 входа на основе формы |

Cookies и дополнительные заголовки должны быть заданы через файл конфигурации или флаги CLI `--auth-cookie` / `--auth-header`.

### Плагины

| Variable | CLI flag | Description |
|----------|----------|-------------|
| `VS_PLUGINS_ENABLED` | `--no-plugins` | Включить/отключить автоматическое обнаружение плагинов |
| `VS_PLUGINS_DIRS` | `--plugin-dir` | Дополнительные каталоги плагинов (через пробел) |

### DefectDojo

| Variable | CLI flag | Description |
|----------|----------|-------------|
| `VS_DEFECTDOJO_URL` | `--defectdojo-url` | Базовый URL DefectDojo |
| `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, используйте `OUTPUT_FILE_SENTINEL` в `build_command()` и переопределите `run()` для вызова `self._run_with_tempfile()`.
- Инструменты с `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 — гейтинг по типу с мок-инструментами
  • tests/test_llm.py — возможности LLM, мок-клиент, контейнерная защита PoC-раннера
  • tests/test_reports.py — все три генератора отчётов (Markdown, HTML, JSON)
  • tests/test_nmap.py — парсер вывода nmap

Правило безопасности: никогда не запускайте реальные сканирующие инструменты на хосте. Всё выполнение инструментов происходит внутри Docker-контейнера с изолированными целевыми контейнерами. PocRunner обеспечивает это — он проверяет VS_IN_CONTAINER=1 перед выполнением любого PoC-скрипта, а Docker-образ содержит эту переменную.


Интеграция с DefectDojo

Находки отправляются автоматически, когда настроены api_key и product_name.

Получите свой API-ключ:

  1. Откройте DefectDojo по адресу http://localhost:8080
  2. Войдите (по умолчанию: admin / admin)
  3. Перейдите в Профиль → 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:~
Скачать инструмент
ФункцияПо умолчаниюОписание
logs_analysisonПодавать сырой вывод инструмента в LLM
enrichonТриаж CWE / уверенности / ложных срабатываний / эксплуатируемости
classifyonКлассифицировать тип находки и риск
clusteronГруппировать находки по первопричине
mitigationonФормировать меры по смягчению и устранению
generate_poconСоздавать PoC-скрипты как артефакты отчёта
execute_pocoffЗапускать PoC в контейнере (требуется VS_IN_CONTAINER=1)
false_positive_filteronПодавлять вероятные ложные срабатывания в отчёте
Современное Node.js-приложение, охватывающее OWASP Top 10
WebGoathttp://localhost:8888/WebGoatПреднамеренно небезопасное Java/Spring-приложение
СистемаURLТипКлассы уязвимостей
DVWAhttps://pentest-ground.com:4280Классическое веб-приложениеCSRF, XSS, SQLi
DVGQLhttps://pentest-ground.com:5013GraphQL APICMDi, XSS, SQLi
RestFlawhttps://pentest-ground.com:9000REST APISQLi, Инъекция кода, XXE
GuardianLeakshttps://pentest-ground.com:81Веб-приложениеXSS, SSRF, Инъекция кода
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
ФлагОписание
-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-llmОтключить обогащение LLM
--llm-model MODELПереопределение модели LLM (например, gpt-4o, claude-sonnet-4-5)
--llm-min-severity SEVМинимальный уровень критичности для LLM: info|low|medium|high|critical
--include-tools TOOLSСписок инструментов для запуска, разделённый запятыми
--exclude-tools TOOLSСписок инструментов для пропуска, разделённый запятыми
-e, --env KEY=VALUEПередать дополнительную переменную окружения в контейнер
-b, --buildПересобрать Docker-образ перед запуском
-n, --no-defectdojoПропустить интеграцию DefectDojo
--shellОткрыть интерактивную оболочку внутри контейнера вместо сканирования
-h, --helpПоказать справку