Сканер Nuclei. Часть 1
Уязвимые хосты и простое сканирование
Nuclei - гибкий и быстрый инструмент с открытым исходным кодом для сканирования на наличие уязвимостей в приложениях, сетях и облачной инфраструктуре. Отличительной чертой этого решения является работа через YAML-шаблоны, определяющие способы отправки запросов и анализа ответов, и позволяющие реализовать самые разнообразные пользовательские сценарии.
Подготовка
В качестве основной системы буду использовать Kali Linux.
🔨 Устанавливаем сканер
1
sudo apt install nuclei
🛒 Для проверки работы сканера поднял несколько специальных docker контейнеров, содержащих уязвимости.
1
docker run -d -p 127.0.0.1:4380:80 vulnerables/web-dvwa
1
docker run -d -p 127.0.0.1:4480:3000 bkimminich/juice-shop
📚 Еще примеры образов и контейнеров с преднамеренными уязвимостями для обучения и тестирования:
-
vulnhub github - уязвимые контейнеры с популярными инструментами
-
metasploitable-2 - специализированная машина для практики поиска и эксплуатации уязвимостей
Справка по основным параметрам запуска
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
-u Указать домен
-l Список доменов
-t Указать шаблон
-j Вывод в формате JSON
-o Файл для вывода результатов
-irr Включить пары запрос/ответ в выходной отчет
-rl Ограничение скорости, максимальное количество запросов в секунду
-retries Количество попыток повторения неудачного запроса
-as Автоматическое сканирование веб-ресурсов с использованием технологии Wappalyzer для сопоставления тегов
-validate Проверка переданных шаблонов для Nuclei
-silent Отображать только результаты сканирования
-vv Показать загруженные шаблоны для сканирования
-H Добавить пользовательский агент
-tags Сканирование с шаблонами, помеченными определённым тегом
-itags Включить шаблоны по тегам (переопределяет настройки по умолчанию)
-etags Исключить шаблоны по тегам
-author Сканирование с шаблонами от определённого автора
-severity Сканирование с шаблонами определённой степени серьёзности (info, low, medium, high, critical)
-pt Фильтр по типу протокола
-nt Использовать новые шаблоны
Сканирование одиночных хостов
По умолчанию Nuclei запускает почти все шаблоны, разработанные сообществом, которые подходят для указанных целей. Некоторые шаблоны изначально отключены, например, предназначенные для фаззинга или способные вызвать отказ в обслуживании, однако их можно явно выбрать, используя опции фильтрации шаблонов.
- Сканируем
web-dvwaс экспортом отчета в форматеmarkdown
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
mkdir report_dvwa
nuclei -u 127.0.0.1:4380 -irr -markdown-export ./report_dvwa
[dvwa-default-login] [http] [critical] http://127.0.0.1:4380/index.php [password="password",username="admin"]
[cookies-without-httponly] [javascript] [info] 127.0.0.1:4380 ["PHPSESSID","security"]
[cookies-without-secure] [javascript] [info] 127.0.0.1:4380 ["security","PHPSESSID"]
[waf-detect:apachegeneric] [http] [info] http://127.0.0.1:4380
[exposed-gitignore] [http] [info] http://127.0.0.1:4380/.gitignore
[configuration-listing] [http] [medium] http://127.0.0.1:4380/config/
[http-missing-security-headers:x-content-type-options] [http] [info] http://127.0.0.1:4380/login.php
[http-missing-security-headers:x-permitted-cross-domain-policies] [http] [info] http://127.0.0.1:4380/login.php
[http-missing-security-headers:referrer-policy] [http] [info] http://127.0.0.1:4380/login.php
[http-missing-security-headers:cross-origin-resource-policy] [http] [info] http://127.0.0.1:4380/login.php
[http-missing-security-headers:strict-transport-security] [http] [info] http://127.0.0.1:4380/login.php
[http-missing-security-headers:content-security-policy] [http] [info] http://127.0.0.1:4380/login.php
[http-missing-security-headers:clear-site-data] [http] [info] http://127.0.0.1:4380/login.php
[http-missing-security-headers:cross-origin-embedder-policy] [http] [info] http://127.0.0.1:4380/login.php
[http-missing-security-headers:cross-origin-opener-policy] [http] [info] http://127.0.0.1:4380/login.php
[http-missing-security-headers:permissions-policy] [http] [info] http://127.0.0.1:4380/login.php
[http-missing-security-headers:x-frame-options] [http] [info] http://127.0.0.1:4380/login.php
[fingerprinthub-web-fingerprints:dvwa] [http] [info] http://127.0.0.1:4380/login.php
[tech-detect:php] [http] [info] http://127.0.0.1:4380
[readme-md] [http] [info] http://127.0.0.1:4380/README.md
[robots-txt-endpoint] [http] [info] http://127.0.0.1:4380/robots.txt
[INF] Scan completed in 1m. 21 matches found.
Получаем каждую уязвимость в отдельном markdown-файле с детальной информацией внутри.
- Для второго хоста выполняем такое же сканирование, но с отчетом в
json
1
nuclei -u 127.0.0.1:4480 -j -o ./report_juice.json
❗️ Ожидал увидеть больше уязвимостей, однако нашлась всего парочка уровня info. Повторил процесс - сканирование завершилось, не успев начаться. Оказывается контейнер отвалился после первого запуска, а причиной тому стало переполнение памяти. 😐 В логах контейнера следующая информация:
1
FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
💡 Попробовал снизить нагрузку на хост во время сканирования корректировкой параметров запуска
- Ограничиваем количество шаблонов для запуска (например, ищем только самые важные уязвимости)
1
nuclei -u 127.0.0.1:4480 -severity high,critical -j -o ./report_juice.json
- Снижаем скорость сканирования (флаг
-rl- ограничение количества запросов в секунду)
1
nuclei -u 127.0.0.1:4480 -severity info,low,medium -rl 10 -j -o ./report_juice.json
Процесс отработал полностью в обоих случаях. Критических уязвимостей найдено не было. За счет снижения скорости сканер трудился значительно дольше, однако собрал довольно полную информацию, в том числе обнаружил одну medium уязвимость.
Отчеты формируются очень подробные, содержат и метаданные по найденным уязвимостям, и детализацию запросов и ответов, ссылки на шаблоны, статистику и описание. Возможность представления в разных форматах имеется, что удобно для последующей обработки.
Дополнительные материалы по теме
🔸 Репа проекта: [1]



