【安全开发】Nuclei源码分析-任务执行流程(三)

目录

  • [Nuclei 扫描任务执行流程详解](#Nuclei 扫描任务执行流程详解)
    • [1. 程序启动与参数解析](#1. 程序启动与参数解析)
    • [2. 初始化 Runner](#2. 初始化 Runner)
    • [3. 执行枚举任务](#3. 执行枚举任务)
      • [3.1 模板加载与过滤](#3.1 模板加载与过滤)
      • [3.2 模板验证](#3.2 模板验证)
      • [3.3 模板聚类优化](#3.3 模板聚类优化)
      • [3.4 并发执行扫描](#3.4 并发执行扫描)
      • [3.5 结果处理与输出](#3.5 结果处理与输出)
    • [4. 协议执行流程](#4. 协议执行流程)
    • [5. 工作流执行](#5. 工作流执行)
    • 流程图

Nuclei 扫描任务执行流程详解

当一个新的扫描任务下达时,Nuclei 会按照以下步骤执行:

1. 程序启动与参数解析

首先,Nuclei 从 v2/cmd/nuclei/main.go 的 main() 函数开始执行:

go 复制代码
func main() {
    readConfig()
    runner.ParseOptions(options) // 解析参数
    nucleiRunner, err := runner.New(options)
    // ...
    if err := nucleiRunner.RunEnumeration(); err != nil {  
        // 这里是执行实际的扫描任务 
        // ...
    }
    nucleiRunner.Close()
}

在这个阶段,Nuclei 会解析用户提供的所有命令行参数,包括:

  • 扫描目标(单个目标、目标列表文件等)
  • 要使用的模板(特定模板、模板目录等)
  • 过滤条件(按标签、严重性、作者等)【过滤模板】
  • 输出选项(输出格式、输出文件等)
  • 扫描配置(并发数、速率限制、超时等)

2. 初始化 Runner

在 runner.New() 函数中,Nuclei 进行一系列初始化操作:

  • 处理模板更新:如果用户要求更新模板,则执行更新操作
  • 初始化目录:设置模板目录路径
  • 初始化 catalog:创建用于模板查找的目录结构
  • 处理报告配置:如果配置了 Issue Tracker,则初始化相关客户端
  • 处理输入目标:
    • 从命令行参数读取目标
    • 从文件读取目标列表
    • 从标准输入读取目标
    • 对目标进行去重处理
  • 初始化输出:设置输出格式和输出文件
  • 初始化进度条:设置进度跟踪和统计信息
  • 初始化 Interactsh 客户端:用于检测带外交互(OOB)
  • 设置速率限制器:根据用户配置限制请求速率

3. 执行枚举任务

初始化完成后,调用 RunEnumeration() 方法开始执行实际的扫描任务:

3.1 模板加载与过滤

  • 处理新模板:如果用户指定了 -new-templates 参数,则只加载新增的模板
  • 应用忽略规则:读取忽略配置文件,排除指定的标签和模板
  • 创建执行器选项:设置模板执行所需的各种配置选项
  • 创建模板加载器:初始化用于加载和解析模板的 loader
  • 加载模板:
    • 根据用户指定的路径加载模板
    • 应用各种过滤条件(标签、严重性、作者等)
    • 加载工作流模板

3.2 模板验证

如果用户指定了 -validate 参数,则只验证模板语法而不执行扫描。

3.3 模板聚类优化

为了提高效率,Nuclei 会对 HTTP 模板进行聚类处理:

  • 将具有相似请求的模板分组
  • 减少重复请求的发送
  • 有效降低网络负载

3.4 并发执行扫描

Nuclei 使用并发方式执行扫描任务:

  • 创建工作协程组:根据 -c 参数设置并发模板执行数
  • 模板分类处理:
    • 自包含模板:调用 processSelfContainedTemplates()
    • 工作流模板:调用 processWorkflowWithList()
    • 普通模板:调用 processTemplateWithList()
  • 针对每个目标执行模板:
    • 对于每个目标,执行模板中定义的所有请求
    • 根据模板中定义的匹配器(matchers)和提取器(extractors)处理响应
    • 将匹配结果输出到指定的输出位置

3.5 结果处理与输出

  • 处理 Interactsh 回调:检查是否有带外交互结果
  • 停止进度跟踪:结束进度条和统计信息收集
  • 关闭资源:关闭浏览器实例、输出文件等
  • 输出最终统计:显示扫描结果汇总信息

4. 协议执行流程

每种协议(HTTP、DNS、Network等)都有自己的执行流程:

  • 编译阶段:准备请求数据,预处理变量等
  • 执行阶段:发送请求并接收响应
  • 匹配阶段:根据 Matchers 和 Extractors 判断是否匹配
  • 输出阶段:将结果写入输出文件或屏幕

5. 工作流执行

对于工作流模板,Nuclei 会按照定义的逻辑顺序执行多个子模板,并根据匹配结果决定是否继续执行后续步骤。

流程图

整个流程可以用以下图表表示:

复制代码
graph TD
    A[程序启动] --> B[参数解析]
    B --> C[初始化Runner]
    C --> D[加载和过滤模板]
    D --> E[模板聚类优化]
    E --> F[并发执行扫描]
    F --> G[处理各协议请求]
    G --> H[匹配和提取结果]
    H --> I[输出结果]
    I --> J[清理资源]

通过这种结构化的设计,Nuclei 能够高效地执行大量模板扫描任务,并通过各种优化技术(如模板聚类、速率限制、错误缓存等)提高扫描效率和准确性。


by 久违 2025.10.20

相关推荐
white-persist2 小时前
汇编代码详细解释:汇编语言如何转化为对应的C语言,怎么转化为对应的C代码?
java·c语言·前端·网络·汇编·安全·网络安全
newxtc4 小时前
【辽宁政务服务网-注册_登录安全分析报告】
运维·selenium·安全·政务·安全爆破
wrangler_csdn4 小时前
如何一键将 PDF 转为 Word?
人工智能·安全·ai
李少兄4 小时前
IDEA / DataGrip 连接 SQL Server 提示“驱动程序无法通过 SSL 加密建立安全连接”的解决方法
安全·intellij-idea·ssl
2301_795167205 小时前
Rust 在内存安全方面的设计方案的核心思想是“共享不可变,可变不共享”
算法·安全·rust
leagsoft_10035 小时前
“移动政务”业务门户安全解决方案
安全·政务
jenchoi4135 小时前
【2025-11-03】软件供应链安全日报:最新漏洞预警与投毒预警情报汇总
网络·安全·web安全·网络安全
Z_renascence5 小时前
web214-web220
web安全·网络安全
喵个咪5 小时前
开箱即用的GO后台管理系统 Kratos Admin - 数据脱敏和隐私保护
后端·go·protobuf