如何运行 Nuclei
Nuclei 模板提供两种主要的执行方法:支持的输入格式
Nuclei 支持各种输入格式来运行模板,包括 urls、hosts、ips、cidrs、asn、openapi、swagger、proxify、burpsuite 导出数据等。要了解更多关于使用输入指定选项的信息,可以参考 nuclei 输入格式。 这些输入可以使用-l 和 -input-mode 标志提供给 nuclei。
-im 标志来指定输入模式。
执行 Nuclei 模板
-t/templates
默认模板
来自我们 nuclei-template 仓库 的大多数社区模板默认情况下都会执行,直接从标准安装路径执行。典型的命令如下:
- 默认
.nuclei-ignore文件 中列出的某些标签和模板不包括在内。 - 代码模板 需要
-code标志才能执行。 - 无头模板 除非传递
-headless标志,否则不会运行。 - 模糊测试模板 除非传递
-fuzz标志,否则不会运行。
执行模板工作流
-w/workflows
工作流 可以使用以下命令执行:
模板类型
模板过滤器
Nuclei 引擎支持三种基本过滤器来自定义模板执行。-
标签 (
-tags) 基于模板中可用的标签字段进行过滤。 -
严重性 (
-severity) 基于模板中可用的严重性字段进行过滤。 -
作者 (
-author) 基于模板中可用的作者字段进行过滤。
~/nuclei-templates/ 目录中的所有带有 cve 标签的模板。
~/nuclei-templates/exposures/ 目录下所有带有 config 标签的模板。
cve 标签
AND 具有 critical 或 high 严重性 AND geeknik 作为模板作者的模板。
高级过滤器
多个过滤器也可以使用模板条件标志 (-tc) 组合,允许复杂表达式,如下所示:
id字符串name字符串description字符串tags字符串切片authors字符串切片severity字符串protocol字符串http_method字符串切片body字符串(包含所有请求体,如果有的话)matcher_type字符串切片extractor_type字符串切片description字符串
|| 和 &&)组合,并与 DSL 辅助函数一起使用。
同样,所有过滤器也支持工作流。
工作流在工作流中,Nuclei 过滤器应用于通过工作流运行的模板或子模板,而不是工作流本身。
公共模板
Nuclei 内置支持从 nuclei templates 项目自动下载/更新模板,该项目提供了 社区贡献 的随时可用模板列表,这些模板会不断更新。 Nuclei 在每次执行时都会检查新的社区模板发布,并在可用时自动下载最新版本。可选择使用-duc CLI 标志或配置文件禁用此功能。
自定义模板
用户可以在个人公共/私有 GitHub/AWS Bucket 上创建自定义模板,他们希望在任何环境中使用 nuclei 运行/更新这些模板,而无需在各处手动下载 GitHub 仓库。 要使用此功能,用户需要设置以下环境变量:GitHub 项目
GitHub 项目
GitLab 项目
GitLab 项目
AWS Bucket
AWS Bucket
Azure Blob Storage
Azure Blob Storage
$HOME/nuclei-templates/github/)。
自定义模板的目录结构如下所示:
-t 标志使用自定义模板,如下所示:
-update 标志更新到最新版本。
AI 驱动的模板生成
-ai
Nuclei 支持使用由 ProjectDiscovery API 提供的 AI 功能即时生成和运行模板。此功能允许你通过自然语言描述你想要检测的内容,执行快速、有针对性的扫描,而无需预先编写的模板。
前提条件:
- ProjectDiscovery API 密钥(在 cloud.projectdiscovery.io 获取)
-
使用以下方法之一配置 API 密钥:
方法 1:使用 CLI(推荐)
方法 2:环境变量
- 查找敏感信息泄露:
- 检测调试信息:
- 发现管理员接口:
- 识别暴露的密钥:
- 提取页面标题
-ai 标志需要活跃的互联网连接以与 ProjectDiscovery API 通信。生成的模板会同时存储在你的计算机本地和你的 ProjectDiscovery 云账户中以供将来参考。为了保护隐私,你的提示和生成的模板不会用于 AI 训练。目前,每个用户每天限制 100 个 AI 模板生成查询。这个限制可能会根据使用模式和防止滥用而变化。Nuclei 标志
速率限制
Nuclei 有多个速率限制控制多个因素,包括要并行执行的模板数量、每个模板要并行扫描的主机数量以及你想使用 nuclei 发送/限制的全局请求数量/每秒,这里是每个标志的示例描述。| 标志 | 描述 |
|---|---|
| rate-limit | 控制要每秒发送的总请求数 |
| bulk-size | 控制每个模板要并行处理的主机数量 |
| c | 控制要并行处理的模板数量 |
流量标记
许多 BugBounty 平台/项目要求你标识你发送的 HTTP 流量,这可以通过在$HOME/.config/nuclei/config.yaml 配置文件或 CLI 标志 -H / header 中设置自定义头来实现
使用配置文件设置自定义头
使用 CLI 标志设置自定义头
模板排除
Nuclei 支持各种方法来排除/阻止模板执行。默认情况下,nuclei 排除下面列出的标签/模板,以避免意外的基于模糊的扫描和一些不应进行大规模扫描的模板,这些可以通过 nuclei 配置文件/标志轻松覆盖。 Nuclei 引擎支持两种手动从扫描中排除模板的方法,-
排除模板 (
-exclude-templates/exclude) exclude-templates 标志用于排除单个或多个模板和目录,可以使用多个-exclude-templates标志提供多个值。 -
排除标签 (
-exclude-tags/etags) exclude-tags 标志用于基于定义的标签排除模板,可以使用单个或多个来排除模板。
排除单个模板的示例
多个模板排除的示例
排除带有单个标签的模板的示例
排除带有多个标签的模板的示例
- .nuclei-ignore 列表 - 默认情况下从 nuclei 扫描中排除的标签和模板的默认列表。
-include-templates 或 -include-tags 标志。这将确保指定的模板或标签优先于任何 .nuclei-ignore 或 denylist 条目。
运行被阻止模板的示例
执行 denylist 中特定模板的示例假设你在 Nuclei 配置文件的 denylist 中有全局匹配 (但你只想执行一个特定的模板。
*) 的自定义模板。列出模板路径
Nuclei 中的-tl 选项用于列出模板的路径,而不是执行它们。这可以帮助你检查给定当前模板过滤器的情况下,将使用哪些模板进行扫描。
在互联网数据库上扫描
Nuclei 支持与 uncover 模块 集成,该模块支持 Shodan、Censys、Hunter、Zoomeye 等服务,以在这些数据库上执行 Nuclei。 以下是 uncover 选项的使用方法 -Nuclei 配置
自 v2.3.2 发布以来,nuclei 使用 goflags 提供干净的 CLI 体验和长/短格式标志。
goflags 带有自动生成的配置文件支持,可以将所有可用的 CLI 标志转换为配置文件,基本上你可以将所有 CLI 标志定义在配置文件中,以避免每次扫描 nuclei 时重复使用 CLI 标志。
nuclei 配置文件的默认路径是 $HOME/.config/nuclei/config.yaml,取消注释并配置你希望作为默认运行的标志。
这是一个示例配置文件:
-config 标志。
运行 nuclei 与自定义 config 文件
Nuclei Result Dashboard
Nuclei 现在允许与 ProjectDiscovery Cloud Platform 无缝集成,以简化 Nuclei 结果的可视化并生成快速报告。此高度请求的功能从社区中启用,以简化结果处理,只需最少努力。 按照以下步骤设置你的 PDCP Result Dashboard:- 访问 https://cloud.projectdiscovery.io 以创建免费 PDCP API 密钥。
- 使用
nuclei -auth命令,在提示时输入你的 API 密钥。 - 要执行扫描并直接上传结果到云端,请在运行 nuclei 扫描时使用
-cloud-upload选项。
高级集成选项
通过环境变量设置 API 密钥 避免通过交互提示输入 API 密钥,通过环境变量设置它。ENABLE_CLOUD_UPLOAD 环境变量。
DISABLE_CLOUD_UPLOAD_WRN 环境变量。
$HOME/.pdcp/credentials.yaml
Nuclei Reporting
Nuclei 随 v2.3.0 发布,支持 GitHub、GitLab 和 Jira 集成,这允许 nuclei 引擎基于找到的结果在支持的平台自动创建票证。| 平台 | GitHub | GitLab | Jira | Markdown | SARIF | Elasticsearch | Splunk HEC | MongoDB |
|---|---|---|---|---|---|---|---|---|
| Support | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
-rc, -report-config 标志可以用于提供配置文件以读取要集成的平台配置详细信息。以下是 example config file 所有支持平台。
例如,要在 GitHub 上创建票证,请创建一个配置文件,如下所示并替换适当的值:
$CVSSMetrics, $CVEID, $CWEID, $Host, $Severity, $CVSSScore, $Name
此外,Jira 在自定义字段输入方面非常严格。如果字段是下拉菜单,Jira 只接受大小写敏感的特定字符串,并且 API 调用略有不同。为了支持这一点,有三种类型的自定义字段。
name是下拉值id是下拉的 ID 值freeform如果自定义字段是文本输入,则为 true
CLOSED_STATUS 可以使用 status-not 变量在 Jira 模板文件中。
summary ~ TEMPLATE_NAME AND summary ~ HOSTNAME AND status != CLOSED_STATUS
deny-list 可以用于排除特定严重性问题。
如果你在同一资产上运行定期扫描,你可能想要考虑 -rdb, -report-db 标志,该标志创建给定目录中有效发现的本地副本,用于报告模块以比较并 为唯一问题创建票证。
-me, -markdown-export 标志,此标志采用目录作为输入以存储 markdown 格式报告。
包括请求/响应在 markdown 报告中是可选的,并且当与 -irr, -include-rr 标志一起使用时包括在内。
-se, -sarif-export 标志。此标志采用文件作为输入以存储 SARIF 格式报告。
- 通过将 SARIF 文件上传到 SARIF Viewer
- 通过将 SARIF 文件上传到 Github Actions
这些是 不是 官方的 Nuclei 查看器,
Nuclei 对这些选项可视化 Nuclei 结果没有责任。这些只是一些公开可用的选项来可视化 SARIF 文件。扫描 Metrics
Nuclei 暴露运行扫描指标在本地端口9092 当使用 -metrics 标志和可以访问 localhost:9092/metrics,默认端口暴露扫描信息是可配置使用 -metrics-port 标志。
这是一个示例查询 metrics 同时运行 nuclei 如下 nuclei -t cves/ -l urls.txt -metrics
被动扫描
Nuclei 引擎支持被动模式扫描 HTTP 模板利用文件支持,使用此支持我们可以运行 HTTP 模板针对本地存储的 HTTP 响应数据收集自其他工具。Passive mode support is limited for templates having
{{BasedURL}} or {{BasedURL/}} as base path.运行 Docker
如果 Nuclei 安装在基于 installation instructions 的 Docker 容器中, 可执行文件没有主机机器的上下文。这意味着可执行文件将无法访问 本地文件,例如用于输入列表或模板。要解决此问题,容器应使用卷 映射到本地文件系统以允许访问这些文件。基本用法
此示例运行 Nuclei 容器针对google.com,将结果打印到 JSON 并删除容器一旦
它已经完成:
使用卷
此示例运行 Nuclei 容器针对 URL 列表,将结果写入.jsonl 文件并删除
容器一旦它已经完成。