Nuclei-模块化|高度可定制漏洞扫描工具

Nuclei-模块化|高度可定制漏洞扫描工具

Nuclei是一个基于模板的、可配置攻击目标的扫描快速工具,同时还提供了强大的可扩展性和易用性。

基于模板的nuclei被用来发送请求给目标,有着实现零误报的优点,并且可以对已知的路径进行有效的扫描。nuclei的主要用于在初期的探测阶段快速地对已知的且易于检测的漏洞或者CVE进行扫描。如果存在WAF的话,nuclei使用retryablehttp-go库来处理各种错误,并且重新尝试攻击,这也是我们自定义功能的核心模块之一。

我们也维护一个具有各个类型的模板的开源库,我们希望你也能贡献一些模板,贡献的这些模板最好是有效的,并且能允许每个人基于你的模板重新构建。查看nuclei.projectdiscovery.io这个网站去学习制作模板的入门知识。

nuclei目前能扫描的cve列表(一般货色)

├─2005
│      CVE-2005-2428
│
├─2008
│      CVE-2008-2398
│
├─2013
│      CVE-2013-2251
│
├─2014
│      CVE-2014-3120
│      CVE-2014-6271
│
├─2015
│      CVE-2015-1427
│
├─2016
│      CVE-2016-3081
│
├─2017
│      CVE-2017-1000028
│      CVE-2017-10075
│      CVE-2017-10271
│      CVE-2017-11444
│      CVE-2017-12615
│      CVE-2017-12635
│      CVE-2017-12637
│      CVE-2017-14537
│      CVE-2017-14849
│      CVE-2017-5638
│      CVE-2017-7391
│      CVE-2017-7615
│      CVE-2017-9506
│      CVE-2017-9841
│
├─2018
│      CVE-2018-0296
│      CVE-2018-1000129
│      CVE-2018-11409
│      CVE-2018-11759
│      CVE-2018-1247
│      CVE-2018-1271
│      CVE-2018-1273
│      CVE-2018-13379
│      CVE-2018-13380
│      CVE-2018-14574
│      CVE-2018-14728
│      CVE-2018-16341
│      CVE-2018-16763
│      CVE-2018-17431
│      CVE-2018-18069
│      CVE-2018-19386
│      CVE-2018-19439
│      CVE-2018-20824
│      CVE-2018-2791
│      CVE-2018-3167
│      CVE-2018-3714
│      CVE-2018-3760
│      CVE-2018-5230
│      CVE-2018-7251
│      CVE-2018-7490
│      CVE-2018-7600
│      CVE-2018-8006
│      CVE-2018-8033
│
├─2019
│      CVE-2019-10092
│      CVE-2019-1010287
│      CVE-2019-10475
│      CVE-2019-11248
│      CVE-2019-11510
│      CVE-2019-11580
│      CVE-2019-11581
│      CVE-2019-11869
│      CVE-2019-12314
│      CVE-2019-12461
│      CVE-2019-12593
│      CVE-2019-12725
│      CVE-2019-14223
│      CVE-2019-14322
│      CVE-2019-14696
│      CVE-2019-14974
│      CVE-2019-15043
│      CVE-2019-15107
│      CVE-2019-15858
│      CVE-2019-16278
│      CVE-2019-1653
│      CVE-2019-16662
│      CVE-2019-16759
│      CVE-2019-16920
│      CVE-2019-17382
│      CVE-2019-17506
│      CVE-2019-17558
│      CVE-2019-18394
│      CVE-2019-19368
│      CVE-2019-19781
│      CVE-2019-19908
│      CVE-2019-19985
│      CVE-2019-20141
│      CVE-2019-2588
│      CVE-2019-2725
│      CVE-2019-3396
│      CVE-2019-3402
│      CVE-2019-3403
│      CVE-2019-3799
│      CVE-2019-5127
│      CVE-2019-5418
│      CVE-2019-6112
│      CVE-2019-6340
│      CVE-2019-6715
│      CVE-2019-7219
│      CVE-2019-7256
│      CVE-2019-7609
│      CVE-2019-8442
│      CVE-2019-8449
│      CVE-2019-8451
│      CVE-2019-8903
│      CVE-2019-8982
│      CVE-2019-9041
│      CVE-2019-9670
│      CVE-2019-9733
│      CVE-2019-9955
│      CVE-2019-9978
│
├─2020
│      CVE-2020-0618
│      CVE-2020-10148
│      CVE-2020-10546
│      CVE-2020-10547
│      CVE-2020-10548
│      CVE-2020-10549
│      CVE-2020-11034
│      CVE-2020-1147
│      CVE-2020-11710
│      CVE-2020-11738
│      CVE-2020-11991
│      CVE-2020-12116
│      CVE-2020-12720
│      CVE-2020-13167
│      CVE-2020-13937
│      CVE-2020-13942
│      CVE-2020-14179
│      CVE-2020-14181
│      CVE-2020-14815
│      CVE-2020-14864
│      CVE-2020-14882
│      CVE-2020-15129
│      CVE-2020-15505
│      CVE-2020-15568
│      CVE-2020-15920
│      CVE-2020-16846
│      CVE-2020-16952
│      CVE-2020-17505
│      CVE-2020-17506
│      CVE-2020-17518
│      CVE-2020-17519
│      CVE-2020-17530
│      CVE-2020-1943
│      CVE-2020-2036
│      CVE-2020-2096
│      CVE-2020-2140
│      CVE-2020-23972
│      CVE-2020-24223
│      CVE-2020-24312
│      CVE-2020-24579
│      CVE-2020-25213
│      CVE-2020-2551
│      CVE-2020-25540
│      CVE-2020-26214
│      CVE-2020-27982
│      CVE-2020-27986
│      CVE-2020-3187
│      CVE-2020-3452
│      CVE-2020-35476
│      CVE-2020-4463
│      CVE-2020-5284
│      CVE-2020-5405
│      CVE-2020-5410
│      CVE-2020-5412
│      CVE-2020-5776
│      CVE-2020-5777
│      CVE-2020-5847
│      CVE-2020-5902
│      CVE-2020-6287
│      CVE-2020-7209
│      CVE-2020-7318
│      CVE-2020-7961
│      CVE-2020-8091
│      CVE-2020-8115
│      CVE-2020-8163
│      CVE-2020-8191
│      CVE-2020-8193
│      CVE-2020-8194
│      CVE-2020-8209
│      CVE-2020-8512
│      CVE-2020-8515
│      CVE-2020-8982
│      CVE-2020-9047
│      CVE-2020-9344
│      CVE-2020-9376
│      CVE-2020-9425
│      CVE-2020-9484
│      CVE-2020-9496
│      CVE-2020-9757
│      CVE-2020–26073
│
└─2021
        CVE-2021-22122
        CVE-2021-22873
        CVE-2021-25646
        CVE-2021-26710
        CVE-2021-26722
        CVE-2021-26723
        CVE-2021-3019

项目地址:

GitHub: github.com/projectdiscovery/nuclei/

特色功能

  • 有着易于开发的、简单的、模块化的代码库
  • 使用了基于模板的引擎,运行速度极快,可以修改所以配置
  • 可以对特殊情况处理、重试、绕过等,可以绕过WAF
  • 智能匹配,零误报

安装方法

二进制文件安装

二进制文件安装很简单,你可以从Releases页面下载已经构建好的二进制文件压缩包,使用解压工具提取下载的压缩包,并将解压的文件夹移动到$PATH目录,就可以直接使用了。

#从如下网址下载最新的二进制文件 #https://github.com/projectdiscovery/nuclei/releases

tar -xzvf nuclei-linux-amd64.tar.gz
mv nuclei /usr/local/bin/
nuclei -version

源码安装

nuclei需要**go1.14+**才能成功安装,运行以下命令获取repo

GO111MODULE=on go get -v github.com/projectdiscovery/nuclei/v2/cmd/nuclei

GitHub安装

git clone https://github.com/projectdiscovery/nuclei.git
cd nuclei/v2/cmd/nuclei/
go build
mv nuclei /usr/local/bin/
nuclei -version

Nuclei模板

你可以使用update-templates来下载和更新nuclei模板,该命令会从unclei的模板库中下载最新版本,这个由社区来维护的库是可以随时使用的。

nuclei -update-templates

此外您可以根据自己的工作情况或者需求编写模板,请参阅nuclei模板向导去编写自定义模板

用法

nuclei -h

这条命令会显示帮助,以下是nuclei支持的所有命令

命令描述例子
bulk-size每个模板最大并行的主机数(默认25)nuclei -bulk-size 25
burp-collaborator-biid使用burp-collaborator插件nuclei -burp-collaborator-biid XXXX
c并行的最大模板数量(默认10)nuclei -c 10
l对URL列表进行测试nuclei -l urls.txt
target对目标进行测试nuclei -target hxxps://example.com
t要检测的模板种类nuclei -t git-core.yaml -t cves/
no-color输出不显示颜色nuclei -no-color
no-meta不显示匹配的元数据nuclei -no-meta
json输出为json格式nuclei -json
include-rrjson输出格式中包含请求和响应数据nuclei -json -include-rr
o输出为文件nuclei -o output.txt
project避免发送相同的请求nuclei -project
stats使用进度条nuclei -stats
silent只输出测试成功的结果nuclei -silent
retries失败后的重试次数nuclei -retries 1
timeout超时时间(默认为5秒)nuclei -timeout 5
trace-log输出日志到log文件nuclei -trace-log logs
rate-limit每秒最大请求数(默认150)nuclei -rate-limit 150
severity根据严重性选择模板nuclei -severity critical,high
stop-at-first-match第一次匹配不要处理HTTP请求nuclei -stop-at-frst-match
exclude排除的模板或文件夹nuclei -exclude panels -exclude tokens
debug调试请求或者响应nuclei -debug
update-templates下载或者升级模板nuclei -update-templates
update-directory选择储存模板的目录(可选)nuclei -update-directory templates
tl列出可用的模板nuclei -tl
templates-version显示已安装的模板版本nuclei -templates-version
v显示发送请求的详细信息nuclei -v
version显示nuclei的版本号nuclei -version
proxy-url输入代理地址nuclei -proxy-url hxxp://127.0.0.1:8080
proxy-socks-url输入socks代理地址nuclei -proxy-socks-url socks5://127.0.0.1:8080
random-agent使用随机的UAnuclei -random-agent
H自定义请求头nuclei -H “x-bug-bounty:hacker”

运行Nuclei

运行单个模块

这将对urls.txt中所有的主机运行git-core.yaml并返回结果到results.txt

nuclei -l urls.txt -t files/git-core.yaml -o results.txt

你可以轻松的通过管道使用标准的输入(STDIN)传递URL列表。

cat urls.txt | nuclei -t files/git-core.yaml -o results.txt

💡 Nuclei可以接受如下列表的URL作为输入,例如以下URL:

https://test.some-site.com
http://vuls-testing.com
https://test.com

运行多个模板

这将会对urls.txt中所有的URL运行cvesfiles模板检查,并返回输出到results.txt

nuclei -l urls.txt -t cves/ -t files/ -o results.txt

使用subfinder运行

subfinder -d hackerone.com -silent | httpx -silent | nuclei -t cves/ -o results.txt

在docker中运行

你需要使用nuclei的docker镜像来运行

docker pull projectdiscovery/nuclei

下载并构建完成后,运行以下命令:

docker run -it projectdiscovery/nuclei

这将会对urls.txt中的URL通过docker中的nuclei进行检测,并将结果输出到本机的results.txt文件:

cat urls.txt | docker run -v /path/to/nuclei-templates:/app/nuclei-templates -v /path/to/nuclei/config:/app/.nuclei-config.json -i projectdiscovery/nuclei -t /app/nuclei-templates/files/git-config.yaml > results.txt

记住更改的模板路径到本机

速率限制

Nuclei有多种控制速率的方法,包括并行执行多个模板、并行检查多个主机,以及使nuclei限制全局的请求速率,下面就是示例。

  • -c参数 => 限制并行的模板数
  • -bulk-size参数 => 限制并行的主机数
  • -rate-limit参数 => 全局速率限制

如果你想快速扫描或者控制扫描,请使用这些标志并输入限制数,速率限制只保证控制传出的请求,与其他参数无关。

排除模板

Nuclei模板包含多种检查,其中有许多对攻击有用的检查,但并不是都有用的。如果您只希望扫描少数特定的模板或目录,则可以使用如下的参数筛选模板,或将某些模板排除。

排除模板运行

我们不建议同时运行所有的nuclei模板,如果要排除模板,可以使用exclude参数来排除特定的目录或模板。

nuclei -l urls.txt -t nuclei-templates -exclude panels/ -exclude technologies -exclude files/wp-xmlrpc.yaml

注意:如上述示例中显示的那样,目录和特定模板都将不会扫描

基于严重性运行模板

您可以根据模板的严重性运行模板,扫描时可以选择单个严重性或多个严重性。

nuclei -l urls.txt -t cves/ -severity critical,medium

上面的例子将运行cves目录下所有严重中等的模板。

nuclei -l urls.txt -t panels/ -t technologies -severity info

上面的例子将运行panelstechnologies目录下严重性标记为info的模板

使用.nuclei-ignore文件排除模板

自从nuclei的v2.1.1版本以来,我们添加了对.nuclei-ignore文件的支持,该文件与update-templates参数一起使用,在 .nuclei-ignore 文件中,您可以定义要从nuclei扫描中排除的所有模板目录或者模板路径,要开始使用此功能,请确保使用nuclei-update-templates参数安装nuclei模板,现在可以根据.nuclei-ignore的文件来添加、更新、删除模板文件。

nano ~/nuclei-templates/.nuclei-ignore

默认的nuclei忽略列表可以访问github.com/projectdiscovery/nuclei-templates/

如果不想排除任何内容,只需要删除`.nuclei-ignore`文件。