Nuclei 扫描器调研
Table of Contents
时间:2021-06-10
Nuclei 是一款基于模板的漏洞扫描工具,诞生于 2020 年 4 月左右,虽然在国内流行度不高,但截止目前为止,官方的 Github 有超过 4k 的 star,其中也有一些华人贡献者(包括我在内)。
市面上多数的开源或商业的漏洞扫描器都是脚本/插件形式开发的,而Nuclei 主打“模板”的概念,所有的检测规则并非是传统的 API 方式开发的脚本,而是 YAML 格式的纯文本;长亭的 xray 也采用了类似的方式提供检测插件。
我也在扫描插件上做过不少工作,如果从开发的角度来说,写一个检测插件实质上就是在实现一个新需求,而不得不说多数安全从业者的软件工程能力不算太高,没有良好的开发实践,比如编码的代码可读性、质量、风格等都存在很多问题;如果要保证代码的质量,就需要耗费更多的时间,而作为漏洞研究人员,或者安全产品厂商,时间是非常重要的,这个时候应该只专注写好检测插件,不该过多精力耗费在写重复代码这事上。
另一方面,从更高的抽象维度来看,开发大多漏洞检测插件其实都是在做同一个模式的重复事情:构造 PoC -> 发包 -> 检测响应结果;遵循这个规律其实完全可以把流程抽象出来;所以我觉得基于模板的插件是非常好的一个选择,可以更专注漏洞本身,也能更高效地完成检测插件。
回到 Nuclei,它基于 Go 语言开发,得益于 Go 语言天然优势,Nuclei 天生具备:
- 可编译为单文件的二进制格式,解决了依赖问题,便于升级;
- 跨平台;
- 并发能力强。
而 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://github.com/projectdiscovery/nuclei/。
- 模板:https://github.com/projectdiscovery/nuclei-templates, 平均 3 天发布一个版本。
模板编写参考官方给的指南:https://nuclei.projectdiscovery.io/templating-guide/index.html, Nuclei 模板目前大概支持(更多的请看官方文档):
- Headless
- Netcat,能发送非 HTTP 协议网络包
- DNS 请求
- OOB(数据外带)
- DSL,能完成少量复杂场景的模板开发
1. 商用情况下的一些考虑
值得一提的是,Nuclei 使用了 MIT 开源协议,MIT 是一种非常宽松的许可协议,修改源码后商用且闭源,唯一限制是必须保留原有版权信息,所以 Nuclei 是能直接商用的。
如果作为商用场景,Nuclei 还有一些欠缺的地方:
- 不支持加密的 YAML,YAML 通常属于商业竞争能力需要得到一定的保护。
- 框架不具备对插件测试功能,不能通过 CI 等自动化方式来保证 YAML 的质量。
- Nuclei 通过 Github 方式更新检测规则,而不支持指定规则更新服务器。