Пост

Сканер Nuclei. Часть 2

Шаблоны

Шаблоны в Nuclei - это сценарии сканирования для гибкой и, что главное, индивидуальной настройки процесса анализа под конкретную задачу и конкретную цель.


Структура шаблона

  • Простой yaml формат
  • Основные разделы:
    • id: идентификатор шаблона
    • info: блок с информацией о шаблоне
    • http: описание запросов, которые будут выполняться в процессе сканирования
    • matchers: определение соответствия ответа определенному правилу или условию (код ответа, наличие слов, регулярное выражение и т.д.)
    • extractors: извлечение информации из ответа по регулярному выражению, типу, формату и т.д.

Пример шаблона для поиска случайно попавших в открытый доступ .git директорий

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
id: git-directory-exposure

info:
  name: Git Directory Exposure
  author: security-team
  severity: medium
  description: Detects exposed .git directories that may contain sensitive source code and configuration
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N
    cvss-score: 5.3
    cwe-id: CWE-200
  metadata:
    verified: true
    max-request: 4
  tags: exposure,git,directory,misconfiguration

http:
  - method: GET
    path:
      - "/.git/"
      - "/.git/config"
      - "/.git/HEAD"
      - "/.git/logs/HEAD"

    redirects: true
    max-redirects: 2
    
    matchers-condition: or
    matchers:
      - type: word
        part: body
        words:
          - "[core]"
          - "repositoryformatversion"
          - "bare = false"
        condition: and

      - type: word
        part: body
        words:
          - "ref: refs/heads/"
          - "refs/heads/master"
          - "refs/heads/main"

      - type: regex
        part: body
        regex:
          - "^[a-f0-9]{40}\\s+[a-f0-9]{40}"

      - type: word
        part: body
        words:
          - "Index of /.git"
        case-insensitive: true

    matchers:
      - type: status
        status:
          - 200

    extractors:
      - type: regex
        part: body
        regex:
          - 'repositoryformatversion = ([0-9]+)'
          - 'bare = (true|false)'
        group: 1

      - type: regex
        part: header
        regex:
          - 'Server: (.+)'
        group: 1

📚 Дополнительная информация

1) Коротко про структуру шаблона из официальной документации.

2) Подробно по каждому полю шаблона из официальной документации.

3) Большой гайд по синтаксису шаблонов с примерами и полезными функциями.

4) Вводный гайд на хабре.


Установка базы шаблонов

Средствами nuclei выкачиваем базу шаблонов от разработчиков сканера и сообщества

1
nuclei -update-templates

По умолчанию падает в $HOME/.local/nuclei-templates или $HOME/nuclei-templates.


Применение шаблонов

Я как-то упоминал в заметке в своем Telegram-канале про найденные .git каталоги в опубликованных веб-приложениях, которые обнаруживаются простым сканированием, и откуда впоследствии извлекается чувствительная информация.

В базе шаблонов есть заготовки на эту тему, вот некоторые из них:

  • exposures/logs/git-exposure.yaml - проверка доступа к .git каталогу
  • exposures/configs/git-config.yaml - обнаружение git config
  • exposures/configs/git-credentials-disclosure.yaml - обнаружение .git-credentials

🔸 Запуск с применением шаблонов

1
2
3
4
# для одного хоста
nuclei -u http://test.host -t http/exposures/configs/git-config.yaml
# для списка хостов
nuclei -l hosts.txt -t http/exposures/configs/git-credentials-disclosure.yaml

Можно заметить, что шаблоны помечены тэгами, что удобно использовать при сканировании для охвата всего комплекса проверок разом.

1
nuclei -l hosts.txt -t http/exposures/ -tags git

❗️ Шаблонов уже более 3 тыс штук по совершенно разным направлениям. Сориентироваться можно как самостоятельно, так и пообщавшись с ИИ, попросив отыскать подходящие решения, только вот обновления инструмента и базы выходят с такой скоростью, что тот же ChatGPT не всегда выдает актуальную информацию, приходится перепроверять.


Генерация шаблонов с помощью ИИ

В nuclei добавлена поддержка ИИ модуля для инъекции промптов на естественном языке прямо в CLI (аргумент -ai), что обеспечивает автоматическую генерацию и выполнение шаблонов обнаружения уязвимостей. Процесс реализован через отправку запросов на платформу разработчика, для чего нужно обзавестись бесплатным ключом доступа.

Получения ключа для активации ИИ модуля

  • Создаем аккаунт на платформе Project Discovery.
  • В разделе Settings - API Key находим свой ключ.
  • Используем ключ для авторизации
1
nuclei -auth
  • Пишем запрос на естественном языке (можно на русском, но, как правило, с LLM лучше на родном языке).
  • В результате шаблон будет сформирован и применен по указанным целям. YAML шаблона сохраняется локально в nuclei-templates, а также ссылка на него на Project Discovery прикладывается в выводе.

🔸 Пример все с тем же .git каталогом

1
nuclei -l hosts.txt -ai "Find exposed .git directories allowing full repo download"

Готовые промпты для Nuclei AI

На github существует проект Nuclei-AI-Prompts - это коллекция готовых промптов для использования с функцией Nuclei AI с разбивкой по категориям, что упрощает подготовку выбранных сценариев.

🔸 Примеры запросов из проекта

1
2
3
4
5
6
7
8
9
10
11
# Поиск конфигурационных файлов
nuclei -list targets.txt -ai "Find exposed .env files leaking credentials, API keys, and database passwords"
nuclei -list targets.txt -ai "Find exposed configuration files such as config.json, config.yaml, config.php, application.properties containing API keys and database credentials"

# Анализ JavaScript
nuclei -l js_links -ai "Find hardcoded API keys, JWT tokens, OAuth credentials, and authentication secrets in JavaScript"
nuclei -l js_links -ai "Identify hardcoded cloud service credentials (AWS, GCP, Azure) in JavaScript files"

# Поиск уязвимостей
nuclei -list katana.jsonl -im jsonl -ai "Fuzz all parameters and HTTP methods using DSL, focusing on detecting SQL Injection vulnerabilities with pre-conditions"
nuclei -list katana.jsonl -im jsonl -ai "Test for reflected XSS in user-controllable parameters such as q, search, s, redirect, return, and url"

❗️ AI модуль, помимо необходимости писать yaml сценарии вручную, позволил избежать зависимости от обновлений статических шаблонов, быстро адаптироваться к новым типам уязвимостей и готовить уникальный подход к каждой цели.

Больше полезной информации в Telegram-канале