一、工具简介
1.简介
Nuclei是一款基于YAML语法模板的开发的定制化快速漏洞扫描器。它使用Go语言开发,具有很强的可配置性、可扩展性和易用性。
目前该项目在Github上已经有6.6k个stars。
- 官网:https://nuclei.projectdiscovery.io
- Nuclei项目地址:https://github.com/projectdiscovery/nuclei
- Nuclei-Templates项目地址:https://github.com/projectdiscovery/nuclei-templates
2.功能
- HTTP | DNS | TCP | 文件支持
- 完全可配置的模板
- 大规模扫描
- 基于带外的检测
- 轻松编写自己的模板
小知识:
YAML(/ˈjæməl/,尾音类似camel骆驼)是一个可读性高,用来表达数据序列化的格式。YAML参考了其他多种语言,包括:C语言、Python、Perl,并从XML、电子邮件的数据格式(RFC 2822)中获得灵感。Clark Evans在2001年首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者。当前已经有数种编程语言或脚本语言支持(或者说解析)这种语言。
YAML是"YAML Ain't a Markup Language"(YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。
二、工具安装
1.安装Go语言
由于Nuclei需要最新的go才能安装,安装之前需要先使用以下命令安装Go语言:
sudo apt update
sudo apt install golang-go
安装完成后,可使用 go verison 命令查看Go语言版本。
2.安装Nuclei
Nuclei官方提供了各种安装方式,用户可以根据自己的实际情况选择最合适的安装方式。
#【在线源码编译安装】-需安装Go语言
go install -v github.com/projectdiscovery/nuclei/v2/cmd/nuclei@latest
#【本地源码编译安装】-需安装Go语言
git clone https://github.com/projectdiscovery/nuclei.git
cd nuclei/v2/cmd/nuclei
go build
mv nuclei /usr/local/bin/
nuclei -version
#【kali一键安装】-【推荐】-不需要安装Go语言,且仅限kali操作系统
apt install nuclei
#【macOS一键安装】-【推荐】-不需要安装Go语言,且仅限macOS操作系统
brew install nuclei
#【docker一键安装】-【推荐】-不需要安装Go语言
docker pull projectdiscovery/nuclei:latest
#【直接下载发行版】-【推荐】-不需要安装Go语言,适合各类操作系统
https://github.com/projectdiscovery/nuclei/releases
安装成功后,在终端窗口输入nuclei -version可以查看nuclei版本。
同时自v2.4.0版本以来,Nuclei内置了对自动更新/下载模板的支持,初次运行Nuclei会自动下载最新的nuclei-templates到当前用户根目录(/home/当前用户/nuclei-templates)。
Nuclei-Templates项目提供了一个社区贡献的现成模板列表,该列表将不断更新,用户也可以自己下载最新版模板到本地。
Nuclei-Templates下载地址:https://github.com/projectdiscovery/nuclei-templates
三、工具使用
1.nuclei -h
这将显示Nuclei的帮助,以下是所有支持的命令【以最新版为主】:
用法:
nuclei [命令]
命令:
目标:
-u, -target string[] 指定扫描的URL/主机
-l, -list string 指定需要扫描的URL/主机文件(一行一个)
模板:
-t, -templates string[] 指定需要扫描的模板或者模板的路径
-nt, -new-templates 只扫描最新版本中添加的模板
-w, -workflows string[] 指定扫描中的工作流或者工作流目录
-validate 验证通过的模板
-tl 列出所有可用的模板
过滤:
-tags string[] 执行有标记的模板子集
-etags, -exclude-tags string[] 执行标记为排除的模板
-itags, -include-tags string[] 不执行具有攻击性的模板
-et, -exclude-templates string[] 要排除的模板或者模板目录
-it, -include-templates string[] 执行默认或配置中排除的模板
-s, -severity value[] 根据严重性运行模板,允许的值有:info,low,medium,high,critical
-es, -exclude-severity value[] 根据严重性排除模板,允许的值有:info,low,medium,high,critical
-a, -author string[] 执行指定作者的模板
输出:
-o, -output string 输出发现的问题到文件
-silent 只显示结果
-nc, -no-color 禁用输出内容着色(ANSI转义码)
-json 输出为jsonL(ines)
-irr, -include-rr 在JSONL中输出对应的请求和相应(仅结果)
-nm, -no-meta 不显示匹配的元数据
-nts, -no-timestamp 不在输出中显示时间戳
-rdb, -report-db string 本地的Nuclei结果数据库(始终使用该数据库保存结果)
-me, -markdown-export string 以markdown导出结果
-se, -sarif-export string 以SARIF导出结果
配置:
-config string 指定Nuclei的配置文件
-rc, -report-config string 指定Nuclei报告模板文件
-H, -header string[] 指定报告中的标题:value格式
-V, -var value 通过var=value指定var值
-r, -resolvers string 指定Nuclei的解析文件
-sr, -system-resolvers 当DNS错误时使用系统DNS
-passive 启用被动扫描处理HTTP响应
-ev, env-vars 在模板中使用环境变量
交互:
-inserver, -ineractsh-server string 使用interactsh反连检测平台(默认为"https://interact.sh")
-itoken, -interactsh-token string 指定反连检测平台的身份凭证
-interactions-cache-size int 指定保存在交互缓存中的请求数(默认:5000)
-interactions-eviction int 聪缓存中删除请求前等待的时间(默认为60秒)
-interactions-poll-duration int 每个轮询前等待时间(默认为5秒)
-interactions-cooldown-period int 退出轮询前的等待时间(默认为5秒)
-ni, -no-interactsh 禁用反连检测平台,同时排除基于反连检测的模板
限速:
-r1, -rate-limit int 每秒最大请求量(默认:150)
-rlm, -rate-limit-minute int 每分钟最大请求量
-bs, -bulk-size int 每个模板最大并行检测数(默认:25)
-c, -concurrency int 并行执行的最大模板数量(默认:25)
优化:
-timeout int 超时时间(默认为5秒)
-retries int 重试次数(默认:1)
-mhe, -max-host-error int 某主机扫描失败次数,跳过该主机(默认:30)
-project 使用项目文件夹避免多次发送同一请求
-project-path string 设置特定的项目文件夹
-spm, -stop-at-first-path 得到一个结果后停止(或许会中断模板和工作流的逻辑)
-stream 流模式 - 在不整理输入的情况下详细描述
无界面浏览器:
-headless 启用需要无界面浏览器的模板
-page-timeout int 在无界面下超时秒数(默认:20)
-sb, -show-brower 在无界面浏览器运行模板时,显示浏览器
-sc, -system-chrome 不使用Nuclei自带的浏览器,使用本地浏览器
调试:
-debug 显示所有请求和响应
-debug-req 显示所有请求
-debug-resp 显示所有响应
-proxy, -proxy-url string 使用HTTP代理
-proxy-socks-url string 使用SOCK5代理
-tlog, -trace-log string 写入请求日志到文件
-version 显示版本信息
-v, -verbose 显示详细信息
-vv 显示额外的详细信息
-tv, -templates-version 显示已安装的模板版本
升级:
-update 更新Nuclei到最新版本
-ut, -update-templates 更新Nuclei模板到最新版
-ud, -update-directory string 覆盖安装模板
-duc, -disable-update-check 禁用更新
统计:
-stats 显示正在扫描的统计信息
-sj, -stats-json 将统计信息以JSONL格式输出到文件
-si, -stats-inerval int 显示统计信息更新的间隔秒数(默认:5)
-m, -metrics 显示Nuclei端口信息
-mp, -metrics-port int 更改Nuclei默认端口(默认:9092)
2.更新Nuclei
使用nuclei -update命令来将您的Nuclei更新到最新版本。
使用nuclei -update-templates命令来将您的核心模板nuclei-templates更新到最新版本,另外Nuclei本身每24小时也会进行一次自动更新。
3.扫描单个目标
nuclei -u https://example.com
#使用socks5代理
nuclei -u https://example.com -p socks5://127.0.0.1:1080
#使用http代理
nuclei -u https://example.com -p http://127.0.0.1:8080
例如我们使用vulfocus上的Grafana未授权任意文件读取漏洞进行扫描测试:
4.扫描多个目标
nuclei -list urls.txt
#使用socks5代理
nuclei -list urls.txt -p socks5://127.0.0.1:1080
#使用http代理
nuclei -list urls.txt -p http://127.0.0.1:8080
其中urls.txt为扫描目标的URL:
http://example.com
http://app.example.com
http://test.example.com
http://uat.example.com
5.自定义报告格式
Nuclei提供了扫描结果输出功能,用户可以根据自己的需求,自定义输出各种类型的报告格式,包括文本、JSON、Markdown等。
#输出结果为JSON格式
nuclei -u https://example.com -json
#输出结果保存到result.txt文件
nuclei -u https://example.com -o result.txt
#输出结果保存到Markdown格式文件
nuclei -u https://example.com -me result
例如:
我们使用nuclei -u http://vulfocus.fofa.so:53003 -me result 命令生成Markdown文件
输出的Markdown文件如下:
文件weblogic-weak-login-http___vulfocus.fofa.so_53003_console_j_security_check.md内容如下:
6.自定义扫描内容
Nuclei引擎支持三个基本过滤器来自定义模板执行。
- 标签(-tags)根据模板中可用的标签字段进行筛选。
- 严重级别(-severity)根据模板中可用的严重级别字段进行筛选。
- 作者(-author)根据模板中可用的作者字段进行筛选。
默认情况下,过滤器应用于模板的已安装路径,并可以通过手动模板路径输入进行自定义。
例如:
#以下命令将运行安装在~/nuclei-templates/目录上的所有模板,其中包含cve标签。
nuclei -u https://example.com -tags cve
#以下命令将运行~/nuclei-templates/exposures/目录下的所有带有config标签的可用模板.
nuclei -u https://example.com -tags config -t exposures/
多个过滤器与AND条件一起工作
#以下命令将运行所有带有cve标签的模板,并且具有critical或high严重级别和geeknik作为模板的作者。
nuclei -u https://example.com -tags cve -severity critical,high -author geeknik
8.自定义检测模板
Nuclei支持自定义编写YAML语法模板,您可以工具自己的需求编写自己的检测模板。
#该模板为请求/响应中的URL并匹配字符串的路径。
id: basic-example
info:
name: Test HTTP Template
author: pdteam
severity: info
requests:
- method: GET
path:
- "{{BaseURL}}/"
matchers:
- type: word
words:
- "This is test matcher text"
演示模板:
Spring Boot 目录遍历 (CVE-2021-21234)漏洞的YAML模板
id: CVE-2021-21234
info:
name: Spring Boot Actuator Logview - Directory Traversal
author: gy741,pikpikcu
severity: high
description: spring-boot-actuator-logview in a library that adds a simple logfile viewer as spring boot actuator endpoint. It is maven package "eu.hinsch:spring-boot-actuator-logview". In spring-boot-actuator-logview before version 0.2.13 there is a directory traversal vulnerability.
reference:
- https://blogg.pwc.no/styringogkontroll/unauthenticated-directory-traversal-vulnerability-in-a-java-spring-boot-actuator-library-cve-2021-21234
- https://github.com/cristianeph/vulnerability-actuator-log-viewer
- https://nvd.nist.gov/vuln/detail/CVE-2021-21234
tags: cve,cve2021,springboot,lfi,actuator
classification:
cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N
cvss-score: 7.70
cve-id: CVE-2021-21234
cwe-id: CWE-22
requests:
- method: GET
path:
- "{{BaseURL}}/manage/log/view?filename=/windows/win.ini&base=../../../../../../../../../../" # Windows
- "{{BaseURL}}/log/view?filename=/windows/win.ini&base=../../../../../../../../../../" # windows
- "{{BaseURL}}/manage/log/view?filename=/etc/passwd&base=../../../../../../../../../../" # linux
- "{{BaseURL}}/log/view?filename=/etc/passwd&base=../../../../../../../../../../" # linux
matchers-condition: or
matchers:
- type: regex
part: body
regex:
- "root:.*:0:0"
- type: word
words:
- "bit app support"
- "fonts"
- "extensions"
condition: and
part: body
更多模板编写规则请查看:
- 【模板指南】Introduction - Nuclei - Community Powered Vulnerability Scanner
- 【模板示例】Base HTTP - Nuclei - Community Powered Vulnerability Scanner
使用自己编写的模板
nuclei -u https://example.com -t mytemplate.yaml
9.使用Fiora管理Nuclei
项目简介
Fiora是LoL中的无双剑姬的名字,她善于发现对手防守弱点,实现精准打击。该项目为PoC框架nuclei提供图形界面,实现快速搜索、一键运行等功能,提升nuclei的使用体验。
项目地址:https://github.com/bit4woo/Fiora
项目作者:bit4woo
视频教程:Fiora:快捷搜索PoC、一键运行Nuclei_哔哩哔哩_bilibili
使用方法
- 使用java -jar Fiora-v0.1-jar-with-dependencies.jar命令独立运行Fiora
- 作为Burpsuite插件运行Fiora
如下方法安装插件: