跳转至

Deparos — 现代自适应内容发现

Deparos 是一个智能内容发现引擎,可对 Web 应用执行目录枚举、目录模糊测试和端点发现。它超越了静态字典暴力破解,通过从每个响应中学习——自适应调整策略、动态扩充字典,并通过基于指纹的软 404 检测来过滤误报。

工作原理

目标 URL
┌──────────────────────────────────────────────────────┐
│  初始化                                              │
│  1. 探测目标,提取主机组件                            │
│  2. 获取 robots.txt                                  │
│  3. 学习基线指纹(3 样本软 404 检测)                │
│  4. 加载之前的会话数据(如果恢复扫描)                │
│  5. 从字典 + 观测数据生成初始任务                     │
└──────────────────┬───────────────────────────────────┘
┌──────────────────────────────────────────────────────┐
│  优先级队列                                          │
│  ┌────┬────┬────┬────┬─────┬──────┬──────┬────────┐ │
│  │ P0 │ P1 │ P2 │ P4 │ P5  │ P7   │ P11  │ P12   │ │
│  │爬虫│观测│观测│观测│短词 │扩展变│长词  │模糊   │ │
│  │ JS │名称│文件│路径│典   │体数字│典    │       │ │
│  └────┴────┴────┴────┴─────┴──────┴──────┴────────┘ │
└──────────────────┬───────────────────────────────────┘
┌──────────────────────────────────────────────────────┐
│  载荷协调器                                          │
│  扩展器拉取任务 → Expand() 生成载荷                   │
│  N 个工作线程并发执行载荷                             │
│                                                      │
│  对每个响应:                                        │
│    指纹检查(软 404?)──→ 丢弃                      │
│    WAF 检测 ──→ 跟踪/退避                            │
│    真实发现 ──→ 回调                                 │
└──────────────────┬───────────────────────────────────┘
┌──────────────────────────────────────────────────────┐
│  发现回调                                            │
│  OnDirectoryDiscovered():                           │
│    • 学习目录的新指纹                                 │
│    • 创建递归任务(字典 + 观测数据)                  │
│    • 提取面包屑目录                                  │
│  OnFileDiscovered():                                │
│    • 提取扩展名 → 触发扩展名任务                     │
│    • 数字段 → 模糊测试 ±10 个变体                    │
│    • 排队扩展名变体探测(.bak, .old, …)             │
└──────────────────┬───────────────────────────────────┘
        ┌──── 循环回优先级队列 ────┐
        │  (来自发现的新任务)     │
        └─────────────────────────┘

自适应特性

1. 基于指纹的软 404 检测

扫描前,引擎请求 3 个随机的不存在路径,提取响应属性(状态码、内容类型、标头、正文哈希、内容长度范围)。只有 3 个样本中全部稳定 的属性才成为基线签名。扫描时,匹配此签名的响应将被丢弃为误报。

当出现未知响应模式时,通过 4 策略通配符验证(前缀、后缀、扩展名、中间)确认发现是真实的还是新的软 404 变体——并学习新模式。

2. 观测收集系统

四个数据池在扫描过程中持续增长:

来源 优先级
观测名称 爬虫链接、JS 解析、响应正文分词 P1
观测文件 发现中的完整文件名 P2
观测扩展名 发现中的文件扩展名 P5
观测路径 URL 中的完整路径段 P4

每个新发现的目录都会使用所有观测值作为高优先级任务进行探测。当首次发现新扩展名时,会触发对所有已知目录的任务。

3. JavaScript 智能分析

两层 JS 分析将端点反馈到发现队列:

  • JSScan(嵌入式二进制):反混淆打包的 JS,解析字符串拼接,追踪变量赋值,提取 fetch() / XMLHttpRequest / $.ajax 调用位置为完整的 HTTP 请求规范。
  • 爬虫提取器:解析内联 <script> 标签和 JS 字符串字面量中的 URL 模式。

提取的端点成为优先级 0 的任务——在任何字典模糊测试之前进行测试。

4. 动态字典增长

响应正文被分词(根据内容类型感知 HTML、JSON、JS、CSS)以提取候选词。这些词进入观测名称池,并在每个目录上重放。

5. 递归目录扩展

当在 /a/b/c/file.txt 发现文件时,引擎提取 /a//a/b//a/b/c/ 作为待测试的目录。每个新目录触发其自己的完整任务集(字典 + 观测 + 模块)。

任务类型

任务 优先级 描述
爬虫/JS 提取 0 来自链接提取和 JS 分析的 URL
观测名称 1 扫描期间看到的文件名,按目录重放
观测文件 2 完整的名称+扩展名对
观测路径 4 URL 中的完整路径段
短字典(文件) 5 来自短字典的常见文件名 × 扩展名
短字典(目录) 6 来自短字典的常见目录名
扩展名变体 7 备份/替代扩展名(.bak, .old, .zip, .tar.gz)
数字模糊 7 数字路径段的 ±10 个变体
长字典(文件) 9 扩展文件名词典 × 扩展名
长字典(目录) 11 扩展目录词典
FUZZ 12 基于模板的模糊测试(FUZZ 标记替换)

去重

多层机制防止冗余工作:

  • 任务级别:FNV-1a 哈希防止重复任务入队
  • 请求级别:缓存防止发送相同的 HTTP 请求两次
  • URL 级别:DiskSet 跟踪已处理的 URL
  • 正文级别:哈希防止使用 JSScan 重新分析相同的响应
  • 目录/文件跟踪器:防止重新处理相同的发现

内置模块

YAML 配置的模块在找到匹配目录时触发专门任务:

模块 触发条件 功能
backup 任何目录 测试备份扩展名(.bak, .old, .zip, .tar.gz)
js 任何目录 测试 .js, .mjs, .map 扩展名
api /api/, /v1/ REST/GraphQL/SOAP 端点字典
admin /admin/, /manage/ 管理面板路径
docs /docs/, /api-docs/ Swagger, OpenAPI, GraphQL playground
static /static/, /assets/ 阻止递归以避免噪音

支撑系统

组件 用途
WAF 检测 识别 Cloudflare, Akamai, AWS WAF, F5, Imperva, Sucuri, ModSecurity。跟踪连续拦截以进行退避/提前退出
范围强制 三种模式:any(不检查)、subdomain(相同 eTLD+1)、exact(相同主机)。每次发现和重定向时检查
大小写敏感检测 在首次发现文件时通过以更改的大小写重新请求自动检测
存储 SQLite 支持的站点地图,具有语义去重(FNV-1a-64)。支持跨运行的会话比较以进行差异扫描

与 Vigolium 集成

Deparos 作为输入源(DeparosDiscoverySource)在扫描流水线中运行。每个发现被转换为 httpmsg.HttpRequestResponse 并作为工作项馈送给执行器——然后流经主动和被动漏洞扫描模块。

DeparosDiscoverySource.Next()
  → Engine.Start() → 发现流输出
  → 转换为 httpmsg.HttpRequestResponse
  → 保存到数据库(可选)
  → 作为 WorkItem 返回 → 执行器 → 扫描器模块