一、工具简介

1.简介

Nuclei是一款基于YAML语法模板的开发的定制化快速漏洞扫描器。它使用Go语言开发,具有很强的可配置性、可扩展性和易用性。

目前该项目在Github上已经有6.6k个stars。

2.功能

  • HTTP | DNS | TCP | 文件支持
  • 完全可配置的模板
  • 大规模扫描
  • 基于带外的检测
  • 轻松编写自己的模板

小知识:

YAML(/ˈjæməl/,尾音类似camel骆驼)是一个可读性高,用来表达数据序列化的格式。YAML参考了其他多种语言,包括:C语言PythonPerl,并从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引擎支持三个基本过滤器来自定义模板执行。

  1. 标签(-tags)根据模板中可用的标签字段进行筛选。
  2. 严重级别(-severity)根据模板中可用的严重级别字段进行筛选。
  3. 作者(-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

更多模板编写规则请查看:

使用自己编写的模板

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

如下方法安装插件:

微信扫码关注:Hx0战队公众号获取最新安全资讯。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐