--- title: Nuclei --- <div class="header__logo" >Как сканировать цель на уязвимости с помощью Nuclei! </div> <p> </p> <style> .header__logo { font-size: 30px; font-weight: 700; color: #270469; text-align: center; } </style> <style> .secret{ display: flex; margin-left: auto; margin-right: auto; width: 50%; } </style> <style> .secret__block{ background-color: #fff; display: block; max-width: 100%; height: auto; transition: opacity .8s linear; color: black; text-transform: uppercase; font-weight: 700; text-align: center; } </style> <style> .secret__block img{ opacity: 5; } </style> <style> .secret__block:hover { opacity: 2 ; } </style> <style> .secret__img { opacity: ; transition: transform 1.8s linear; } </style> <style> .secret__img img{ opacity: 0 ; transition: transform 1.8s linear; } </style> <style> .secret__img img: hover{ opacity: 5 ; transition: transform 1.8s linear; } </style> <style> .secret__img img { display: block; max-width: 100%; height: auto; transition: opacity 1.8s linear; } </style> <style> .secret__img:hover { opacity: 5 ; } </style> <style> .secret__inner { position: relative; background-color: #fff; } </style> <style> .secret__inner:hover .secret__img { transform: translate3d(-10px, -10px, 0); } </style> <style> .secret__inner img:hover { opacity: 0; transition: opacity 2s linear; } </style> <style> .secret__inner img { transition: opacity 2s linear; } </style> <style> .secret__inner:hover .secret__img img { opacity: 1; } </style> ![](https://i.imgur.com/9puCWbz.png) <div class="TOC" > Содержание: <p> </p> </div> <style> .TOC { font-size: 26px; font-weight: 550; color: #270469; text-align: left; </style> > [TOC] --- # Вводная часть Данный топик является дополнением к [этому топику](https://hackmd.io/@Moby/MTUCI_pen_12), в котором уже были разобраны другие инструменты для сканирования целей на различные уязвимости. В этом же топике буден разобран основной **функционал** Nuclei. --- # Nuclei :::warning **[Nuclei](https://github.com/projectdiscovery/nuclei)** — это быстрый, эффективный и расширяемый сканер уязвимостей с открытым исходным кодом. Его работа основана на шаблонах, в которых и прописываются шаги, которые инстументу надо выполнить, чтобы выявить и эксплуатировать различные уязвимости. ::: В отличие от большинства уязвимостей в Nuclei применаются **шаблоны**, в которых и определяются необходимые шаги для обнаружения/эксплуатации уязвимости. Шаблон из себя представляет простой YAML-файл, в котором всё и расписано(метод запроса, маршрут, заголовки, параметры и их значения и тд.). ![](https://i.imgur.com/eV5BsxP.png) Внутри эти шаблоны выглядят как-то так: ![](https://i.imgur.com/D0jBo2j.png) Чтобы узнать какие ключи есть у Nuclei, можно ввести `nuclei -h`: ![](https://i.imgur.com/3uTKO0R.png) Давайте же разберёмся с тем, как можно использовать Nuclei! --- ## Быстрый запуск Чтобы запустить Nuclei, достаточно просто ввести команду `nuclei` и дальше указать цель/список целей: ``` # Запуск сканирования одной цели nuclei -u https://example.com # Запуск сканирования не HTTP(s) службы у цели nuclei -u example.com:5759 # Запуск сканирования нескольких целей, которые указаны в txt-файле nuclei -l /path/to/list-of-targets.txt ``` После такого запуска Nuclei выберет некоторые параметры по умолчанию и будет запускать почти все шаблоны, разработанные сообществом, которые имеют отношение к выбранной службе (службам) для указанной цели (целей). Несколько шаблонов будут отключены, так как они предназначены для фаззинга и могут вызывать DoS-атаки. --- ## Использование с другими инструментами Помимо того, что Nuclei можно запускать отдельно, его можно использовать совместно с другими инструментами: ``` Данная цепочка инструментов делает следующее: 1) Брут поддоменов цели (subfinder -d targetdomain.com -silent) 2) Фильтрация поддоменов от тех, где не работает HTTP(S) 3) Запуск Nuclei по отфильтрованым поддоменам с шаблоном, который помогает определять работающие технологии на этих поддоменах subfinder -d targetdomain.com -silent | httpx | nuclei -t technologies/tech-detect.yaml ``` --- ## Фильтрация шаблонов Существует огромное количество шаблонов, написанных для Nuclei, и чтобы не тратить лишнее время на ожидание результата работы тулзы, можно фильтровать шаблоны по разным признакам: ### Автоматический выбор (-as) `nuclei -u https://example.com -as` При выборе данного ключа Nuclei определяет стек и компоненты цели, а затем выбирает шаблоны, которые были помечены специальными ключевыми словами(Например, если на сайте используется PHP, то Nuclei будет использовать только те шаблоны, которые связаны с PHP). ### Только новые шаблоны (-nt) `nuclei -u https://example.com -nt` Эта опция будет использовать только те шаблоны, которые были добавлены из последнего обновления шаблонов(-update-templates). ### Конкретные шаблоны (-t) Отбирать шаблоны можно по имени самого YAML-файла: `nuclei -u https://example.com -t file/logs/python-app-sql-exceptions.yaml -t exposures/files/pyproject-disclosure.yaml` Вместо одного имени файла в качестве аргумента может быть указан файл, содержащий список имен файлов шаблонов (по одному в строке): `nuclei -u https://example.com -t templates-35.txt` ``` cat templates-35.txt file/logs/python-app-sql-exceptions.yaml exposures/files/pyproject-disclosure.yaml ``` Также можно указать путь к дериктории, в которой находятся все шаблоны и подпапки с шаблонами: `nuclei -u https://example.com -t file/logs -t exposures/files -t cves/2021` Вместо подпапки в качестве аргумента можно указать файл, содержащий список папок (по одной в строке): `nuclei -u https://example.com -t template-categories.txt` ``` cat template-categories.txt file/logs exposures/files cves/2021 ``` ### Шаблоны по тегу (-tags) `nuclei -u https://jira.targetdomain.site -tags jira,generic` Эта опция будет использовать только те шаблоны, которые были помечены указанным значением. Шаблоны могут быть помечены технологическим стеком или приложением или службой и тд. ### Шаблоны по severity (-s) :::warning У различных уязвимостей в различных ситуациях может быть разная **оценка опасности** - Severity. Например, если вы нашли Blind SSRF, от которой приходят только DNS-запросы, то в зависимости от ситуации она может иметь как и низкую (low) оценку опасности, так и среднюю (medium). ::: `nuclei -u https://jira.targetdomain.site -s critical,high,medium,low,info` Этот параметр будет использовать только те шаблоны, которые имеют указанную оценку опасности в своих метаданных. ![](https://i.imgur.com/BUXRvPT.png) --- ## Ограничение скорости Иногда нужно ограничить скорость и количество отправляемых запросов от Nuclei, чтобы не уронить сервис и не получить по шапке! `nuclei -u https://my.target.site/ -rl 3 -c 2` **-rl** Ограничение исходящих запросов до 3 в сек. **-c** Параллельно выполнять только 2 шаблона. **-rlm** Тоже самое, что и -rl, только тут указывается ограничение на количество запросов в минуту --- ## Оптимизация работы Nucklei Можно также использовать и другие ключи, чтобы сократить время сканирования: ### Длина тайм-аута (-timeout) `nuclei -l list-of-targets.txt -timeout 1` С помощью этой опции мы можем установить количество времени до истечения времени ожидания попытки подключения(по умолчанию 5). ### Количество повторных попыток (-retries) `nuclei -l list-of-targets.txt -retries 3` По умолчанию Nuclei не будет повторять неудачную попытку подключения. Используя данную опцию, мы можем установить количество повторных попыток. ### Количество ошибок (-mhe) `nuclei -l list-of-targets.txt -mhe 3` По умолчанию, если при попытке сканирования у нас выдалось 30 ошибок - сканирование заканчивается. Количество ошибок можно изменить с помощью данного ключа. --- ## Пользовательские заголовки и сертификат Если в запросе нужно отправлять определённые заголовки или если нужен клиентский сертификат, то можно использовать следующие ключи: ### Файлы cookie или любой другой HTTP-заголовок (-H) Если нужно отправить определённые заголовки или cookie в запросах, то можно использовать ключ -H с данными следующего вида `«header_name:header_value»`: `nuclei -u https://example.com -tags php,apache -H “Cookie:sc_=BPGFJcNgMwfePZBeJqoC838j8Mv4”` ### Аутентификация через сертификат (-cc) Некоторым службам на сканируемых хостах может потребоваться сертификат клиента для аутентификации. Сертификат должен быть в формате PEM и может быть предоставлен с использованием опции -cc (есть также -ck(PEM-encoded private key) и -ca(Certificate Authority (CA))) : `nuclei -u https://api.target.site -cc /path/to/client-cert.pem` --- ## Возобновление сканирования Если сканирование пришлось прекратить по какой-либо причине, и вы ввели комбинцию `ctrl+c`, Nuclei создаст файл возобновления и напечатает путь в выводе консоли: ![](https://i.imgur.com/n3CCwIf.png) И сканирование можно будет продолжить введя следующую команду: `nuclei -l targets-file.txt -resume /path/to/resume-file.cfg ` --- ## Вывод результата Не всегда удобно держать/работать с выводом работы Nuclei в терминале, поэтому вывод можно настроить с помощью следующих ключей: ### Вывод в файл (-o) С помощью данного ключа можно указать файл, в который нужно записать результат сканирования: `nuclei -u https://example.com -o ~/result.txt` ### Тишина (-silent) Выводится будут только подтверждённые находки, а не вся информация. ### JSON (-json) Сделать вывод сканирования в формате JSON. ### MarkDown (-me, -markdown-export) С помощью данного ключа можно указать директорию, в которую будет экспортирован результат сканирования в формате MarkDown. --- # Полезные ссылки - [Как писать и понимать шаблоны для Nuclei](https://blog.projectdiscovery.io/ultimate-nuclei-guide/amp/#custom-templates) - [GitHub-репозиторий от разработчиков данного инструмента, который содержит огромное количество шаблонов для Nuclei](https://github.com/projectdiscovery/nuclei-templates)