feat(security): Nuclei #69 — install + verified smoke (CLI, not MCP)
bin/nuclei.exe v3.8.0 + 13060 templates. Smoke vs live portal verified (1057 reqs sent to 127.0.0.1:8000, scan completed, 0 matched on tech tag). Quirks documented: target 127.0.0.1 not localhost (resolver); low rate-limit for single-threaded artisan serve. Wired as CLI (like gitleaks/squawk/Trivy), not MCP — nuclei doesn't speak MCP; no .mcp.json/l1-watcher needed for #69. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
# Nuclei (#69) — установка и использование
|
||||
|
||||
**Узел A8:** #69 — широкое сканирование на известные уязвимости / небезопасную экспозицию.
|
||||
**Источник (IS9-вет принят):** `projectdiscovery/nuclei` v3.8.0, MIT (см. `infosec-vet.md`).
|
||||
**Тип:** CLI-сканер (Go-бинарь) — **не MCP-сервер** (см. «Решение по интеграции» ниже).
|
||||
|
||||
---
|
||||
|
||||
## Установка (native-Windows)
|
||||
|
||||
Готовый бинарь (Go не требуется):
|
||||
|
||||
```powershell
|
||||
# v3.8.0 windows amd64, pin из IS9-вета
|
||||
Invoke-WebRequest -Uri "https://github.com/projectdiscovery/nuclei/releases/download/v3.8.0/nuclei_3.8.0_windows_amd64.zip" -OutFile "$env:TEMP\nuclei.zip"
|
||||
Expand-Archive "$env:TEMP\nuclei.zip" -DestinationPath "$env:TEMP\nuclei" -Force
|
||||
Copy-Item "$env:TEMP\nuclei\nuclei.exe" "bin\nuclei.exe"
|
||||
bin\nuclei.exe -update-templates -silent
|
||||
```
|
||||
|
||||
- **Расположение:** `bin/nuclei.exe` (рядом с gitleaks/lychee/squawk; `bin/*.exe` в `.gitignore` → бинарь машинно-локальный, в репозиторий не коммитится).
|
||||
- **Шаблоны:** `~/AppData/Roaming/nuclei` + `~/nuclei-templates` (13 060 yaml, v10.4.3 на 2026-05-21).
|
||||
- **Verified:** `nuclei -version` → v3.8.0 ✓.
|
||||
|
||||
## Квирки native-Windows (важно)
|
||||
|
||||
1. **Цель — `127.0.0.1`, НЕ `localhost`.** Резолвер nuclei на этой машине падает на `localhost` (`[INF] Skipped localhost:8000 ... no address found for host`), хотя `curl http://localhost:8000` → 200. Всегда указывать явный IPv4: `-u http://127.0.0.1:<port>`.
|
||||
2. **Низкий rate-limit/concurrency для dev-сервера.** `php artisan serve` однопоточный — под нагрузкой полного скана даёт массу connection-ошибок (в smoke: 1698 errors на 1057 запросов). Для локальной цели: `-rate-limit 20 -c 5` (или ниже). Это не уязвимости, а таймауты/résets перегруженного dev-сервера.
|
||||
3. **`-duc`** (disable update check) — в офлайн/CI-прогонах, чтобы не дёргать сеть на проверку версии.
|
||||
|
||||
## Smoke (verified 2026-05-21)
|
||||
|
||||
```powershell
|
||||
bin\nuclei.exe -u "http://127.0.0.1:8000" -tags tech -stats -timeout 5 -no-color -duc
|
||||
```
|
||||
|
||||
Результат: 931 шаблон загружен, 1057/1059 запросов отправлено к цели, скан завершён (`Scan completed`), **Matched: 0** (чисто на теге `tech` — ожидаемо для dev-портала). Доказывает: nuclei устанавливается, видит и сканирует живой портал. (Первый прогон по `localhost` цель пропустил — см. квирк 1; по `127.0.0.1` отработал.)
|
||||
|
||||
## Решение по интеграции: CLI, не MCP
|
||||
|
||||
В IS9-вете слот #69 предполагал «self-authored MCP-wrapper». При реализации уточнено: **nuclei не говорит на протоколе MCP** — обернуть его в MCP-сервер = писать собственный MCP-серверный код (доп. attack surface + поддержка). Вместо этого nuclei интегрируется как **CLI-инструмент** — ровно как уже существующие security-CLI проекта (gitleaks #8, squawk #15, Trivy #26): бинарь в `bin/`, вызывается по требованию из Bash скилом go-live (#73). Преимущества: ноль чужого/своего обёрточного кода между Claude и бинарём; единообразие с тулчейном; минимальный attack surface. Следствие: для #69 **не нужны** `.mcp.json`-блок и l1-watcher alias (они только для настоящих MCP-серверов; #68 ZAP — единственный MCP в наборе).
|
||||
|
||||
## Использование
|
||||
|
||||
```powershell
|
||||
# Цель ВСЕГДА 127.0.0.1 (квирк 1); бережный режим для dev (квирк 2)
|
||||
bin\nuclei.exe -u "http://127.0.0.1:8000" -rate-limit 20 -c 5 -timeout 5 -duc -severity medium,high,critical
|
||||
```
|
||||
|
||||
Гард IS8: по умолчанию — локальная/тестовая копия (127.0.0.1). Боевой сервер — только по явной команде заказчика.
|
||||
Reference in New Issue
Block a user