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

相关推荐
ltl12 分钟前
存储加密工程:块级、文件级与应用级怎么选
安全
破碎的南瓜3 小时前
wordpress核心框架漏洞(wp2shell)—先行版(小白篇)
安全·wordpress漏洞·wp2shell
运维开发笔记4 小时前
5.2 Go 数组进阶学习笔记(多维、排序、搜索)
go
howdoyoudo2026065 小时前
AI审计手记 #01(数据补全版):107小时、17,600次操作——OpenAI越狱案完整攻击链量化分析
大数据·人工智能·安全·ai·语言模型
zyj8890917 小时前
濮阳工厂目视化设计安全警示牌材质怎么选耐用
python·安全·材质
Summer-Bright7 小时前
Stripe 75亿美元收下OpenRouter、Nvidia让harness打败模型 —— AI软件简报 08.19-08.23
人工智能·安全·ai网关·模型路由
硅谷秋水7 小时前
通过技能-驾驭进化实现自我演化的具身智能体
人工智能·深度学习·安全·机器学习·语言模型·机器人
宸津-代码粉碎机7 小时前
FastUtil+AI多Agent实战:Java AI项目性能终极加速方案
java·服务器·开发语言·python·安全·php
三垣网安8 小时前
记一次渗透测试 | 教育src漏洞分享(2)
网络·安全·web安全·网络安全
小白说大模型9 小时前
Spring AI 框架中集成 MCP 的完整指南:从服务端到客户端的全流程实践
大数据·数据库·人工智能·安全·spring·chatgpt·开源