# 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). Боевой сервер — только по явной команде заказчика.
