【安全开发】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

相关推荐
霖霖总总5 分钟前
[小技巧19]MySQL 权限管理全指南:用户、角色、授权与安全实践
数据库·mysql·安全
上海云盾-高防顾问6 小时前
中小企业低成本渗透测试实操指南
网络协议·web安全·网络安全
tianyuanwo7 小时前
合并XFS分区:将独立分区安全融入LVM的完整指南
安全·lvm
智驱力人工智能7 小时前
守护流动的规则 基于视觉分析的穿越导流线区检测技术工程实践 交通路口导流区穿越实时预警技术 智慧交通部署指南
人工智能·opencv·安全·目标检测·计算机视觉·cnn·边缘计算
2501_945837439 小时前
云服务器的防护体系构建之道
网络·安全
WayneJoon.H10 小时前
2023CISCN go_session
网络安全·golang·ctf·代码审计·ciscn
-曾牛12 小时前
Yak语言核心基础:语句、变量与表达式详解
数据库·python·网络安全·golang·渗透测试·安全开发·yak
源代码•宸12 小时前
Leetcode—1929. 数组串联&&Q1. 数组串联【简单】
经验分享·后端·算法·leetcode·go
小红卒14 小时前
海康威视未授权访问漏洞 (CVE-2017-7921)复现研究
安全
2503_9469718616 小时前
【CTI/IAM】2026年度威胁情报分析与身份隔离架构基准索引 (Benchmark Index)
网络安全·系统架构·数据集·身份管理·威胁情报