Nuclei 扫描器调研

Table of Contents

时间:2021-06-10

Nuclei 是一款基于模板的漏洞扫描工具,诞生于 2020 年 4 月左右,虽然在国内流行度不高,但截止目前为止,官方的 Github 有超过 4k 的 star,其中也有一些华人贡献者(包括我在内)。

市面上多数的开源或商业的漏洞扫描器都是脚本/插件形式开发的,而Nuclei 主打“模板”的概念,所有的检测规则并非是传统的 API 方式开发的脚本,而是 YAML 格式的纯文本;长亭的 xray 也采用了类似的方式提供检测插件。

我也在扫描插件上做过不少工作,如果从开发的角度来说,写一个检测插件实质上就是在实现一个新需求,而不得不说多数安全从业者的软件工程能力不算太高,没有良好的开发实践,比如编码的代码可读性、质量、风格等都存在很多问题;如果要保证代码的质量,就需要耗费更多的时间,而作为漏洞研究人员,或者安全产品厂商,时间是非常重要的,这个时候应该只专注写好检测插件,不该过多精力耗费在写重复代码这事上。

另一方面,从更高的抽象维度来看,开发大多漏洞检测插件其实都是在做同一个模式的重复事情:构造 PoC -> 发包 -> 检测响应结果;遵循这个规律其实完全可以把流程抽象出来;所以我觉得基于模板的插件是非常好的一个选择,可以更专注漏洞本身,也能更高效地完成检测插件。

回到 Nuclei,它基于 Go 语言开发,得益于 Go 语言天然优势,Nuclei 天生具备:

  1. 可编译为单文件的二进制格式,解决了依赖问题,便于升级;
  2. 跨平台;
  3. 并发能力强。

而 Go 语言是一门工具型语言,没有复杂的概念,简单直接,学习成本也低,基本上一个周末就可以上手开发实际项目。

我用 cloc 统计了下 Nuclei 代码量,如下:

$ cloc .
     147 text files.
     147 unique files.
       2 files ignored.

github.com/AlDanial/cloc v 1.82  T=0.19 s (773.5 files/s, 81489.8 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Go                             142           1786           1157          12247

基本上代码在万行左右,我周末在家关了两天基本上能消耗个大概。

通常我们说的漏洞扫描工具,指的是包含了爬虫、通用漏洞检测(如 SQL 注入、XSS 检测)、指纹信息收集(如 Web 服务、语言框架等)、专用漏洞检测;Nuclei 只是其中完成“检测”这部分工作,同时官方是把检测引擎和“模板”分开维护的:

模板编写参考官方给的指南:https://nuclei.projectdiscovery.io/templating-guide/index.html, Nuclei 模板目前大概支持(更多的请看官方文档):

1. 商用情况下的一些考虑

值得一提的是,Nuclei 使用了 MIT 开源协议,MIT 是一种非常宽松的许可协议,修改源码后商用且闭源,唯一限制是必须保留原有版权信息,所以 Nuclei 是能直接商用的。

如果作为商用场景,Nuclei 还有一些欠缺的地方:

  1. 不支持加密的 YAML,YAML 通常属于商业竞争能力需要得到一定的保护。
  2. 框架不具备对插件测试功能,不能通过 CI 等自动化方式来保证 YAML 的质量。
  3. Nuclei 通过 Github 方式更新检测规则,而不支持指定规则更新服务器。