Nuclei: гоним шаблоны, ищем дыры. Инструкция для тех, кто не хочет долбиться головой об стену
Кто в тусовке хоть раз не слышал про Nuclei — тот, наверное, с ёбаного CSS-форума приполз. Этот инструмент сейчас стандарт де-факто для автоматического поиска уязвимостей. Не хуйню какую-то рекламирую, сам пользуюсь.
Суть простая: вместо того чтобы вручную тыкать каждый эндпоинт и проверять, не открыта ли админка или не торчит ли где старый CVE, ты просто гонишь шаблоны и получаешь результат. Быстро, ёбано, эффективно.
Но, как обычно, есть нюансы. Я просидел с Nuclei не один день, наступал на грабли, разбирался с шаблонами, оптимизировал под себя. Теперь рассказываю как есть, без воды и рекламных буклетов.
Часть 1: Что это за зверь и нахуя оно надо
Nuclei — это сканер уязвимостей на базе шаблонов. Написан на Go, летает как ракета, жрёт ресурсов как котёнок. В отличие от тяжеловесных монстров типа Nessus или OpenVAS, которые ставят тебе пол-инфраструктуры на колени, Nuclei просто шлёт запросы и проверяет ответы по заданным правилам.
Что можно пихнуть в цели:
· отдельные URL
· списки доменов
· IP-адреса
· CIDR-диапазоны
· даже целые зоны (есть модуль для DNS)
Что на выходе: список уязвимостей с указанием типа, уровня опасности и ссылкой на шаблон.
Часть 2: Как это работает (для тех, кто в танке)
Алгоритм простой до пизды:
1. Ты скачиваешь/обновляешь шаблоны — это такие YAML-файлы, в которых описано, что искать и как проверять.
2. Запускаешь Nuclei с целями и выборкой шаблонов (можно все подряд, можно только по критичности).
3. Инструмент для каждой цели проходит по шаблонам, шлёт запросы (HTTP, DNS, TCP — что указано в шаблоне).
4. Проверяет ответы на соответствие условиям (матчеры).
5. Если нашлось — выдаёт в консоль/лог/куда скажешь.
Вот пример шаблона, который тупо проверяет, открыта ли админка:
```yaml
id: admin-panel-detect
info:
name: Admin Panel Detect
author: me
severity: info
requests:
- method: GET
path:
- "{{BaseURL}}/admin"
- "{{BaseURL}}/administrator"
- "{{BaseURL}}/wp-admin"
matchers:
- type: word
words:
- "admin"
- "dashboard"
- "login"
condition: or
```
Видишь, всё просто. Метод GET, пути перебираются, матчер ищет ключевые слова в ответе.
Часть 3: Установка — быстрая и безболезненная
Вариантов дохуя:
Самый простой — скачать бинарник с гитхаба:
```
wget https://github.com/projectdiscovery/nuclei/releases/latest/download/nuclei_linux_amd64.zip
unzip nuclei_linux_amd64.zip
chmod +x nuclei
sudo mv nuclei /usr/local/bin/
```
Если есть Go:
```
go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest
```
На macOS через brew:
```
brew install nuclei
```
Для параноиков — собрать из исходников:
```
git clone https://github.com/projectdiscovery/nuclei.git
cd nuclei/v3/cmd/nuclei
go build
mv nuclei /usr/local/bin/
```
После установки проверяем:
```
nuclei -version
```
Если выдало версию — можно работать.
Часть 4: Первый запуск — щупаем локальный хост
Для теста запусти на своём локальном сайте или тестовой машине:
```
nuclei -u https://example.com
```
Если шаблонов ещё нет (первый запуск), Nuclei сам их скачает с официального репозитория. Это займёт минуту-две.
После скачивания начнётся сканирование. В консоль полетят строчки:
```
[INF] [http] [http-missing-security-headers] Found on https://example.com
```
Зелёным подсвечиваются найденные уязвимости, жёлтым — инфо, красным — критические.
Часть 5: Шаблоны — наше всё
Шаблоны лежат в ~/.nuclei-templates/. Там куча папок:
· cves/ — уязвимости с CVE-номерами
· exposed-panels/ — открытые админки
· misconfiguration/ — неправильные конфигурации
· default-logins/ — дефолтные пароли
· technologies/ — детект технологий (не уязвимости, а определение CMS и т.п.)
Обновить шаблоны:
```
nuclei -update-templates
```
Запустить только определённую категорию:
```
nuclei -u https://example.com -t cves/
```
Или конкретный шаблон:
```
nuclei -u https://example.com -t cves/2020/CVE-2020-12345.yaml
```
Можно исключить какие-то шаблоны:
```
nuclei -u https://example.com -t cves/ -exclude cves/2021/
```
Часть 6: Фильтрация по критичности
У каждого шаблона в поле info есть severity:
· info
· low
· medium
· high
· critical
Запустить только критические:
```
nuclei -u https://example.com -severity critical
```
Или несколько уровней:
```
nuclei -u https://example.com -severity high,critical
```
Часть 7: Массовое сканирование — когда целей дохуя
Если нужно просканировать тысячу хостов, вбивать каждый вручную — заёбышься. Делаем файл со списком:
targets.txt:
```
site2.com
192.168.1.1
192.168.1.0/24
```
Запускаем:
```
nuclei -list targets.txt -t cves/
```
Или подаём на stdin:
```
cat targets.txt | nuclei -t cves/
```
Часть 8: Форматы вывода — куда складывать результаты
По умолчанию Nuclei пишет в консоль. Для нормальной работы лучше сохранять в файл.
JSON (удобно для парсинга):
```
nuclei -u https://example.com -json -o results.json
```
Markdown (для отчётов):
```
nuclei -u https://example.com -markdown -o results.md
```
CSV (для табличек):
```
nuclei -u https://example.com -csv -o results.csv
```
Можно комбинировать: и в консоль, и в файл:
```
nuclei -u https://example.com -o results.txt -json
```
Часть 9: Работа с прокси и обход ограничений
Если сканируешь через прокси:
```
nuclei -u https://example.com -proxy http://127.0.0.1:8080
```
Можно рандомизировать user-agent (чтоб не палиться):
```
nuclei -u https://example.com -random-agent
```
Или задать свой:
```
nuclei -u https://example.com -H "User-Agent: Mozilla/5.0"
```
Часть 10: Тюнинг производительности
По умолчанию Nuclei запускает 25 конкурентных запросов. Если цели большие и тебе похер на нагрузку, можно увеличить:
```
nuclei -u https://example.com -c 100
```
Если не хочешь положить свой роутер или целевую систему — уменьшай:
```
nuclei -u https://example.com -c 5
```
Таймауты:
```
nuclei -u https://example.com -timeout 10
```
Если сайты тормозные — увеличивай.
Часть 11: Интеграция с другими инструментами
Nuclei отлично дружит с остальными продуктами от projectdiscovery:
httpx — получаем список живых хостов, потом шлём в Nuclei:
```
cat domains.txt | httpx | nuclei -t cves/
```
subfinder — собираем поддомены, проверяем их:
```
subfinder -d example.com | httpx | nuclei -t cves/
```
найс-тулзы, в общем.
Часть 12: Пишем свой шаблон — не так сложно, как кажется
Допустим, нашли новую уязвимость или хотим проверять что-то своё.
Структура шаблона:
```yaml
id: my-custom-check # уникальный идентификатор
info:
name: My Custom Vulnerability
author: me
severity: medium
description: Проверяет, есть ли файл config.php
requests:
- method: GET
path:
- "{{BaseURL}}/config.php"
matchers:
- type: word
words:
- "DB_PASSWORD"
- "mysql"
condition: or
```
Сохраняем в ~/.nuclei-templates/custom/my-check.yaml, запускаем:
```
nuclei -u https://example.com -t custom/my-check.yaml
```
Можно делать матчеры не только по словам, но и по статус-кодам, по размеру ответа, по regex.
Часть 13: Где Nuclei сосёт
Не буду врать, у него есть недостатки:
1. False positive — дохуя. Особенно на старых шаблонах. Проверять руками всё равно придётся.
2. Зависимость от шаблонов — нет шаблона, нет проверки. Не найдёт то, о чём не знает.
3. HTTP-only по большей части — для сети есть протоколы, но основное — это веб.
4. Может спалить тебя — если гнать все шаблоны подряд, лог-файлы целевого сервера распухнут, и админ заметит. Некоторые шаблоны шлют запросы на несуществующие пути, которые мониторятся.
Часть 14: Мои грабли
1. Забыл обновить шаблоны и проверял старьё. Новые CVE не детектились. Теперь перед каждым сканом делаю nuclei -update-templates.
2. Попытался сканировать через медленный прокси — таймауты посыпались. Пришлось увеличить -timeout до 30 секунд.
3. Запустил с -c 200 на слабом VPS — сервер лёг. Ограничил до 50, стало норм.
4. Не указал исключения и наловил дофига инфо-мусора. Теперь всегда фильтрую по критичности или использую -t для конкретных категорий.
Итог
Nuclei — это тачка, которая должна быть в арсенале у каждого, кто занимается веб-безопасностью. Не единственный инструмент, не панацея, но база.
Он не найдёт сложные бизнес-логики, не проведёт ручной анализ, не заменит голову. Но для рекон-фазы и первичного пробива — лучше не придумаешь.
Главное — не забывай про лимиты, прокси и обновление шаблонов. И всегда проверяй, что нашёл, руками, потому что ложные срабатывания там встречаются чаще, чем хотелось бы.
Кто в тусовке хоть раз не слышал про Nuclei — тот, наверное, с ёбаного CSS-форума приполз. Этот инструмент сейчас стандарт де-факто для автоматического поиска уязвимостей. Не хуйню какую-то рекламирую, сам пользуюсь.
Суть простая: вместо того чтобы вручную тыкать каждый эндпоинт и проверять, не открыта ли админка или не торчит ли где старый CVE, ты просто гонишь шаблоны и получаешь результат. Быстро, ёбано, эффективно.
Но, как обычно, есть нюансы. Я просидел с Nuclei не один день, наступал на грабли, разбирался с шаблонами, оптимизировал под себя. Теперь рассказываю как есть, без воды и рекламных буклетов.
Часть 1: Что это за зверь и нахуя оно надо
Nuclei — это сканер уязвимостей на базе шаблонов. Написан на Go, летает как ракета, жрёт ресурсов как котёнок. В отличие от тяжеловесных монстров типа Nessus или OpenVAS, которые ставят тебе пол-инфраструктуры на колени, Nuclei просто шлёт запросы и проверяет ответы по заданным правилам.
Что можно пихнуть в цели:
· отдельные URL
· списки доменов
· IP-адреса
· CIDR-диапазоны
· даже целые зоны (есть модуль для DNS)
Что на выходе: список уязвимостей с указанием типа, уровня опасности и ссылкой на шаблон.
Часть 2: Как это работает (для тех, кто в танке)
Алгоритм простой до пизды:
1. Ты скачиваешь/обновляешь шаблоны — это такие YAML-файлы, в которых описано, что искать и как проверять.
2. Запускаешь Nuclei с целями и выборкой шаблонов (можно все подряд, можно только по критичности).
3. Инструмент для каждой цели проходит по шаблонам, шлёт запросы (HTTP, DNS, TCP — что указано в шаблоне).
4. Проверяет ответы на соответствие условиям (матчеры).
5. Если нашлось — выдаёт в консоль/лог/куда скажешь.
Вот пример шаблона, который тупо проверяет, открыта ли админка:
```yaml
id: admin-panel-detect
info:
name: Admin Panel Detect
author: me
severity: info
requests:
- method: GET
path:
- "{{BaseURL}}/admin"
- "{{BaseURL}}/administrator"
- "{{BaseURL}}/wp-admin"
matchers:
- type: word
words:
- "admin"
- "dashboard"
- "login"
condition: or
```
Видишь, всё просто. Метод GET, пути перебираются, матчер ищет ключевые слова в ответе.
Часть 3: Установка — быстрая и безболезненная
Вариантов дохуя:
Самый простой — скачать бинарник с гитхаба:
```
wget https://github.com/projectdiscovery/nuclei/releases/latest/download/nuclei_linux_amd64.zip
unzip nuclei_linux_amd64.zip
chmod +x nuclei
sudo mv nuclei /usr/local/bin/
```
Если есть Go:
```
go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest
```
На macOS через brew:
```
brew install nuclei
```
Для параноиков — собрать из исходников:
```
git clone https://github.com/projectdiscovery/nuclei.git
cd nuclei/v3/cmd/nuclei
go build
mv nuclei /usr/local/bin/
```
После установки проверяем:
```
nuclei -version
```
Если выдало версию — можно работать.
Часть 4: Первый запуск — щупаем локальный хост
Для теста запусти на своём локальном сайте или тестовой машине:
```
nuclei -u https://example.com
```
Если шаблонов ещё нет (первый запуск), Nuclei сам их скачает с официального репозитория. Это займёт минуту-две.
После скачивания начнётся сканирование. В консоль полетят строчки:
```
[INF] [http] [http-missing-security-headers] Found on https://example.com
```
Зелёным подсвечиваются найденные уязвимости, жёлтым — инфо, красным — критические.
Часть 5: Шаблоны — наше всё
Шаблоны лежат в ~/.nuclei-templates/. Там куча папок:
· cves/ — уязвимости с CVE-номерами
· exposed-panels/ — открытые админки
· misconfiguration/ — неправильные конфигурации
· default-logins/ — дефолтные пароли
· technologies/ — детект технологий (не уязвимости, а определение CMS и т.п.)
Обновить шаблоны:
```
nuclei -update-templates
```
Запустить только определённую категорию:
```
nuclei -u https://example.com -t cves/
```
Или конкретный шаблон:
```
nuclei -u https://example.com -t cves/2020/CVE-2020-12345.yaml
```
Можно исключить какие-то шаблоны:
```
nuclei -u https://example.com -t cves/ -exclude cves/2021/
```
Часть 6: Фильтрация по критичности
У каждого шаблона в поле info есть severity:
· info
· low
· medium
· high
· critical
Запустить только критические:
```
nuclei -u https://example.com -severity critical
```
Или несколько уровней:
```
nuclei -u https://example.com -severity high,critical
```
Часть 7: Массовое сканирование — когда целей дохуя
Если нужно просканировать тысячу хостов, вбивать каждый вручную — заёбышься. Делаем файл со списком:
targets.txt:
```
Site2 | Cybersecurity Compliance
Site2 helps businesses like yours assess, implement and comply with cybersecurity standards.
192.168.1.0/24
```
Запускаем:
```
nuclei -list targets.txt -t cves/
```
Или подаём на stdin:
```
cat targets.txt | nuclei -t cves/
```
Часть 8: Форматы вывода — куда складывать результаты
По умолчанию Nuclei пишет в консоль. Для нормальной работы лучше сохранять в файл.
JSON (удобно для парсинга):
```
nuclei -u https://example.com -json -o results.json
```
Markdown (для отчётов):
```
nuclei -u https://example.com -markdown -o results.md
```
CSV (для табличек):
```
nuclei -u https://example.com -csv -o results.csv
```
Можно комбинировать: и в консоль, и в файл:
```
nuclei -u https://example.com -o results.txt -json
```
Часть 9: Работа с прокси и обход ограничений
Если сканируешь через прокси:
```
nuclei -u https://example.com -proxy http://127.0.0.1:8080
```
Можно рандомизировать user-agent (чтоб не палиться):
```
nuclei -u https://example.com -random-agent
```
Или задать свой:
```
nuclei -u https://example.com -H "User-Agent: Mozilla/5.0"
```
Часть 10: Тюнинг производительности
По умолчанию Nuclei запускает 25 конкурентных запросов. Если цели большие и тебе похер на нагрузку, можно увеличить:
```
nuclei -u https://example.com -c 100
```
Если не хочешь положить свой роутер или целевую систему — уменьшай:
```
nuclei -u https://example.com -c 5
```
Таймауты:
```
nuclei -u https://example.com -timeout 10
```
Если сайты тормозные — увеличивай.
Часть 11: Интеграция с другими инструментами
Nuclei отлично дружит с остальными продуктами от projectdiscovery:
httpx — получаем список живых хостов, потом шлём в Nuclei:
```
cat domains.txt | httpx | nuclei -t cves/
```
subfinder — собираем поддомены, проверяем их:
```
subfinder -d example.com | httpx | nuclei -t cves/
```
найс-тулзы, в общем.
Часть 12: Пишем свой шаблон — не так сложно, как кажется
Допустим, нашли новую уязвимость или хотим проверять что-то своё.
Структура шаблона:
```yaml
id: my-custom-check # уникальный идентификатор
info:
name: My Custom Vulnerability
author: me
severity: medium
description: Проверяет, есть ли файл config.php
requests:
- method: GET
path:
- "{{BaseURL}}/config.php"
matchers:
- type: word
words:
- "DB_PASSWORD"
- "mysql"
condition: or
```
Сохраняем в ~/.nuclei-templates/custom/my-check.yaml, запускаем:
```
nuclei -u https://example.com -t custom/my-check.yaml
```
Можно делать матчеры не только по словам, но и по статус-кодам, по размеру ответа, по regex.
Часть 13: Где Nuclei сосёт
Не буду врать, у него есть недостатки:
1. False positive — дохуя. Особенно на старых шаблонах. Проверять руками всё равно придётся.
2. Зависимость от шаблонов — нет шаблона, нет проверки. Не найдёт то, о чём не знает.
3. HTTP-only по большей части — для сети есть протоколы, но основное — это веб.
4. Может спалить тебя — если гнать все шаблоны подряд, лог-файлы целевого сервера распухнут, и админ заметит. Некоторые шаблоны шлют запросы на несуществующие пути, которые мониторятся.
Часть 14: Мои грабли
1. Забыл обновить шаблоны и проверял старьё. Новые CVE не детектились. Теперь перед каждым сканом делаю nuclei -update-templates.
2. Попытался сканировать через медленный прокси — таймауты посыпались. Пришлось увеличить -timeout до 30 секунд.
3. Запустил с -c 200 на слабом VPS — сервер лёг. Ограничил до 50, стало норм.
4. Не указал исключения и наловил дофига инфо-мусора. Теперь всегда фильтрую по критичности или использую -t для конкретных категорий.
Итог
Nuclei — это тачка, которая должна быть в арсенале у каждого, кто занимается веб-безопасностью. Не единственный инструмент, не панацея, но база.
Он не найдёт сложные бизнес-логики, не проведёт ручной анализ, не заменит голову. Но для рекон-фазы и первичного пробива — лучше не придумаешь.
Главное — не забывай про лимиты, прокси и обновление шаблонов. И всегда проверяй, что нашёл, руками, потому что ложные срабатывания там встречаются чаще, чем хотелось бы.


