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

相关推荐
我叫黑大帅10 小时前
通过eino-ext如何正常indexer RAG?
后端·面试·go
审判长烧鸡13 小时前
GO闭包【4】“普通闭包”与“循环闭包”之间捕获的核心区别
go·捕获·闭包
bluechips·zhao13 小时前
帝国CMS 8.0 安全审计分析——代码审计
安全·网络安全·代码审计
whuhewei13 小时前
为什么客户端不存在跨域问题
前端·安全
W.A委员会14 小时前
常见网络攻击
网络·http·网络安全
Flittly14 小时前
【SpringSecurity新手村系列】(4)验证码功能实现
java·spring boot·安全·spring
Flittly14 小时前
【SpringSecurity新手村系列】(3)自定义登录页与表单认证
java·笔记·安全·spring·springboot
TechWayfarer14 小时前
攻防对抗:利用IP段归属查询工具快速封禁攻击源——3步联动防火墙(附脚本)
python·网络协议·tcp/ip·安全
常宇杏起15 小时前
AI安全进阶:AI模型鲁棒性测试的核心方法
大数据·人工智能·安全
审判长烧鸡15 小时前
Go 闭包【1】基础
go·闭包