Nuclei — сканер уязвимостей и ошибок конфигурации, который работает по YAML-шаблонам. Один и тот же движок проверяет HTTP-заголовки, TLS, DNS, TCP-порты и сетевые сервисы, а сообщество поддерживает тысячи шаблонов с тегами и уровнями критичности. Главная ценность не в «нажать кнопку и получить список», а в повторяемом и понятном процессе проверки. И главное правило: сканировать можно только собственные системы или те, на которые владелец дал письменное разрешение.
Границы законности и ответственности
Nuclei отправляет реальные запросы и может вызвать срабатывание защитных механизмов, создать нагрузку или изменить состояние сервиса. Запуск по чужому адресу без разрешения — это не «тестирование», а неправомерный доступ и нарушение правил эксплуатации. Перед первым запуском зафиксируйте в документе перечень доменов и IP, окно работ, контакты ответственного и запрещённые типы проверок. Сканируйте staging, а не production, если есть выбор. Для внешних сервисов используйте только те, где вы являетесь владельцем или подрядчиком по договору.
Технически тоже есть ограничения. Шаблоны с тегами dos, fuzz и intrusive могут уронить сервис или создать мусорные записи. Их нужно явно исключать, а не надеяться, что «ничего не случится». Отдельно отключите внешние callback-проверки, если не хотите, чтобы сканер отправлял данные на сторонние узлы.
Установка и обновление шаблонов
Удобнее всего поставить бинарник или собрать через Go. Второй вариант полезен, если нужна конкретная версия и воспроизводимая сборка:
go install github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest
nuclei -version
nuclei -update-templates
nuclei -tl | head -n 20
Команда -tl выводит список шаблонов, -update-templates обновляет локальный каталог. Шаблоны лежат в ~/nuclei-templates, настройки — в ~/.config/nuclei/config.yaml. Для сервера без интернета скачайте архив шаблонов на машине с доступом, проверьте контрольную сумму и распакуйте вручную. Не подключайте сторонние наборы шаблонов вслепую: в них встречаются агрессивные проверки и запросы к внешним доменам.
Первый запуск по своему стенду
Начните с одного адреса и жёстких ограничений по скорости. Так вы увидите, сколько запросов уходит и как ведёт себя приложение:
nuclei -u https://staging.example.com -severity critical,high,medium -tags cve,misconfig -rl 30 -c 10 -timeout 10 -retries 1 -stats -o report.txt
Флаг -rl задаёт число запросов в секунду, -c — параллелизм, -stats показывает прогресс. Если сервис за балансировщиком, добавьте -H "Host: example.com". Для списка целей используйте файл и явно исключите опасные теги:
nuclei -l targets.txt -severity critical,high -etags dos,fuzz,intrusive -ni -jsonl -o results.jsonl
-ni отключает interactsh и внешние callback-серверы, -jsonl даёт машиночитаемый результат. На первом прогоне не включайте автоматический перебор технологий и массовые проверки: сначала убедитесь, что область сканирования ограничена вашими адресами.
Как устроен шаблон
Шаблон — это YAML с идентификатором, метаданными и блоком запросов. Простейшая проверка наличия защитного заголовка выглядит так:
id: own-service-security-headers
info:
name: Security headers on own service
author: admin
severity: info
tags: own,headers
http:
- method: GET
path:
- "{{BaseURL}}/"
matchers-condition: and
matchers:
- type: word
part: header
words:
- "Strict-Transport-Security"
- type: status
status:
- 200
Проверьте шаблон до запуска: nuclei -validate -t own-headers.yaml. Внутри команды можно использовать {{Hostname}}, {{BaseURL}} и переменные из -var. Не вставляйте в шаблон реальные токены и пароли: они попадут в Git и в логи. Если проверка сложная, запускайте её на тестовом контейнере, а не на боевом домене.
Профили и управление шумом
На практике важнее не количество шаблонов, а управляемый набор. Разделите проверки на три профиля: быстрый (заголовки, TLS, версии), средний (известные CVE без эксплуатации) и глубокий (ручной разбор с участием человека). В CI запускайте только быстрый профиль на каждый коммит, средний — по расписанию, глубокий — по согласованию.
nuclei -l staging.txt -t http/misconfiguration/ -severity low,medium,high,critical -exclude-tags dos,fuzz,intrusive -rl 20 -bs 10 -stats -o ci-report.txt
Флаг -bs ограничивает размер пачки, -exclude-tags убирает опасные проверки. Для повторяемости зафиксируйте версию Nuclei и хеш коммита шаблонов: обновление баз может изменить результат без изменения вашего кода. Храните отчёт и список целей рядом с пайплайном, чтобы было понятно, что именно проверялось.
Разбор результатов и ложные срабатывания
Nuclei показывает совпадение шаблона, а не доказанную уязвимость. Отчёт нужно триажить: открыть запрос и ответ, проверить, тот ли это хост, нет ли заглушки балансировщика, воспроизводится ли проблема вручную. Для каждой находки фиксируйте статус: подтверждено, ложное срабатывание, принятый риск, исправлено. Иначе через месяц никто не вспомнит, почему проверка была закрыта.
- Сверяйте
matched-atс разрешённым списком доменов. - Проверяйте ответ глазами, а не только по названию шаблона.
- Отделяйте информацию от уязвимости:
infoне требует срочного патча. - Для исключений используйте
-ehи отдельный файл целей, а не правку шаблонов. - Сохраняйте сырые JSONL-логи для повторного анализа.
Регулярный прогон
Хороший процесс выглядит скучно: раз в неделю запускается один и тот же набор по staging, отчёт складывается в защищённое хранилище, новые находки попадают в трекер. В CI добавьте шаг с nuclei -validate для собственных шаблонов и отдельную задачу с ручным подтверждением для сканирования. Не давайте сканеру доступ к production-секретам и не запускайте его из сети, где он может задеть чужие адреса.
nuclei -l targets.txt -as -severity critical,high -etags dos,fuzz,intrusive -ni -stats -jsonl -o "report-$(date +%F).jsonl"
Флаг -as включает автоматический режим подбора технологий; используйте его осторожно и только на своих стендах. Перед запуском ещё раз проверьте targets.txt: одна лишняя строка превращает внутренний аудит в инцидент.
Чек-лист
- Есть письменное разрешение и точный перечень целей.
- Сканирование идёт по staging или по согласованному окну.
- Опасные теги исключены, rate limit задан.
- Версия Nuclei и шаблонов зафиксирована.
- Отчёты хранятся в защищённом месте и разбираются вручную.
- Внешние callback-сервисы отключены, если они не разрешены.
Итог
Nuclei полезен там, где нужна повторяемая проверка собственной инфраструктуры: он быстро показывает забытые заголовки, устаревшие компоненты и типовые ошибки конфигурации. Но сканер не заменяет аудит и не даёт права трогать чужие системы. Настройте ограниченный профиль, ведите список целей и относитесь к каждой находке как к гипотезе, которую нужно подтвердить.