草庐IT

POC模拟攻击利器 —— Nuclei入门(一)

测试开发Kevin 2024-04-21 原文

引入Nuclei的缘由

使用dependency check 发现的问题,需要研发人员修复,研发人员要求复现问题!这个的确有难度不仅仅要了解cve 相关bug的具体含义,还要模拟攻击,对于测试人员显然要求过高!凭借自己多年的各种测试工具调研经验,直觉告诉自己,应该有类似的工具,经过各种技术调研选择了Nuclei。使用Nuclei主要对cve相关问题进行模拟,另外并不是所有的cve问题该工具都能模拟,建议大家使用前可以自行查看需要验证的cve问题是否在nuclei的template中,如果不在,还需要自行创建。

Nuclei基础

Nuclei是一款基于YAML语法模板的开发的定制化快速漏洞扫描器。它使用Go语言开发,具有很强的可配置性、可扩展性和易用性。Nuclei使用零误报的定制模板向目标发送请求,同时可以对大量主机进行快速扫描。Nuclei提供 dns, file, http, headless, network, workflow, ssl, websocket, whois等协议的扫描,通过强大且灵活的模板,可以使用Nuclei模拟各种安全检查。

Nuclei安装

首先安装go环境(go1.17以上版本)

下载对应平台的安装包,默认安装即可,本文默认安装windows版本

https://github.com/projectdiscovery/nuclei/releases

Nuclei基础使用介绍

原理:根据yaml模板中的内容模拟攻击请求,然后根据响应结果来判断系统中是否存在漏洞。内置yaml文件路径如下:(本文只关注cve相关漏洞)

 上图中一个yaml文件其实就模拟了一个攻击请求,以CVE-2022-29298.yaml为例,文件内如如下:

id: CVE-2022-29298
info:
name: SolarView Compact 6.00 - Directory Traversal
author: ritikchaddha
severity: high
description: SolarView Compact ver.6.00 allows attackers to access sensitive files via directory traversal.
reference:
- https://www.exploit-db.com/exploits/50950
- https://drive.google.com/file/d/1-RHw9ekVidP8zc0xpbzBXnse2gSY1xbH/view
- https://nvd.nist.gov/vuln/detail/CVE-2022-29298
- https://drive.google.com/file/d/1-RHw9ekVidP8zc0xpbzBXnse2gSY1xbH/view?usp=sharing
classification:
cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
cvss-score: 7.5
cve-id: CVE-2022-29298
cwe-id: CWE-22
metadata:
shodan-query: http.html:"SolarView Compact"
verified: "true"
tags: cve,cve2022,lfi,solarview
requests:
- method: GET
path:
- "{{BaseURL}}/downloader.php?file=../../../../../../../../../../../../../etc/passwd%00.jpg"
matchers-condition: and
matchers:
- type: regex
part: body
regex:
- "root:.*:0:0:"
- type: status
status:
- 200

我们可以重点关注以下字段:

severity表示这个cve漏洞的级别

tags,表示这个漏洞被定义的标签,cve表示在命令行中输入cve标签时会执行该yaml

requests,表示要模拟的请求,关于method: GET、path"{{BaseURL}} "、就不详细讲解了,他们与http协议中定义的内容一致。

Matchers,简单的说就是用于对请求响应的校验,上述代码中校验了响应中的两项内容:

通过正则方式- type: regex校验响应body里是否有满足正则表达式- "root:.*:0:0:"的内容

校验响应的状态码- type: status 是否是200。

这两项校验内容是与的关系,matchers-condition: and(默认是or),关于更多的matcher相关知识我会加后面的文章中提及。

关于编写http请求的详细规则请参考

https://nuclei.projectdiscovery.io/templating-guide/protocols/http/

具体template编写语法请参考

https://github.com/projectdiscovery/nuclei/blob/master/SYNTAX-REFERENCE.md

备注:从v2.5.2开始,nuclei在运行时会自动更新template

注意:这里有的同学可能要问下面的语法形式是什么意思呢?

- type: status
status:
- 200

这是yaml语法,大家可以自行百度之!

Nuclei常用命令

Nuclei帮助文档

nuclei –h

这里就不再详细介绍了,自行查看即可。其他常用命令如下:

1.对url https://example.com,进行cve规则的检测(通过tags cve),检测的漏洞级别是critical和high,作者是geeknik

nuclei -u https://example.com -tags cve -severity critical,high -author geeknik -o result.txt

2.对url https://example.com, 控制台输出统计结果-stats,检测的漏洞级别是critical和high,并把结果输出到result2.json(推荐,json形式的报告统计信息非常详细)

nuclei -u https://example.com -stats -severity critical,high -o result2.json -json -irr

3.对url https://example.com,进行模板CVE-2022-1439.yaml的检测,详细打印请求信息和响应信息(-debug)

nuclei -debug -u https://example.com -t \cves\2022\CVE-2022-1439.yaml

4.nuclei也支持对不同的url进行扫描,定义一个txt文件,然后里面保存需要扫描的url,具体使用如下:

nuclei -list urls.txt

urls.txt包括的内容如下:

http://example.com

http://app.example.com

http://test.example.com

http://uat.example.com

5.如果想把结果以不同格式输出,参考如下:

#输出结果为JSON格式

nuclei -u https://example.com -json

#输出结果保存到Markdown格式文件

nuclei -u https://example.com -me result

更多输出结果,请参考nuclei –h 的OUTPUT字段,内容如下:

OUTPUT:
-o, -output string output file to write found issues/vulnerabilities
-sresp, -store-resp store all request/response passed through nuclei to output directory
-srd, -store-resp-dir string store all request/response passed through nuclei to custom directory (default "output")
-silent display findings only
-nc, -no-color disable output content coloring (ANSI escape codes)
-json write output in JSONL(ines) format
-irr, -include-rr include request/response pairs in the JSONL output (for findings only)
-nm, -no-meta disable printing result metadata in cli output
-nts, -no-timestamp disable printing timestamp in cli output
-rdb, -report-db string nuclei reporting database (always use this to persist report data)
-ms, -matcher-status display match failure status
-me, -markdown-export string directory to export results in markdown format
-se, -sarif-export string file to export results in SARIF format

自定义检测模板

Nuclei支持自定义编写YAML语法模板,您可以工具自己的需求编写自己的检测模板。

例如定义模板mytemplate.yaml,内容如下:

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"

调用时,执行如下命令即可:

nuclei -u https://example.com -t mytemplate.yaml

nuclei使用总结

  • 首先确认要扫描的接口(http,url),这点没有appscan,zap工具方便,他们可以主动探索攻击;
  • 然后确认要扫描的规则,即确认yaml文件(根据tag选择想检测的内容,例如:cve、panel、lfi、xss等等),我们可以使用nuclei自带的yaml,也可以自定义yaml,为了提升扫描效率我们还可以自定义workflows,这个话题会在后面的文章中提及;
  • 最后就是通过命令运行脚本并生成测试报告。

有关POC模拟攻击利器 —— Nuclei入门(一)的更多相关文章

  1. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

  2. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  3. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  4. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

  5. ES基础入门 - 2

    ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear

  6. ruby-on-rails - 在这种情况下我如何模拟一个对象?没有明显的方法可以用模拟替换对象 - 2

    假设我在Store的模型中有这个非常简单的方法:defgeocode_addressloc=Store.geocode(address)self.lat=loc.latself.lng=loc.lngend如果我想编写一些不受地理编码服务影响的测试脚本,这些脚本可能已关闭、有限制或取决于我的互联网连接,我该如何模拟地理编码服务?如果我可以将地理编码对象传递到该方法中,那将很容易,但我不知道在这种情况下该怎么做。谢谢!特里斯坦 最佳答案 使用内置模拟和stub的rspecs,你可以做这样的事情:setupdo@subject=MyCl

  7. ruby - "public/protected/private"方法是如何实现的,我该如何模拟它? - 2

    在ruby中,你可以这样做:classThingpublicdeff1puts"f1"endprivatedeff2puts"f2"endpublicdeff3puts"f3"endprivatedeff4puts"f4"endend现在f1和f3是公共(public)的,f2和f4是私有(private)的。内部发生了什么,允许您调用一个类方法,然后更改方法定义?我怎样才能实现相同的功能(表面上是创建我自己的java之类的注释)例如...classThingfundeff1puts"hey"endnotfundeff2puts"hey"endendfun和notfun将更改以下函数定

  8. ruby - 在 RSpec 中 stub /模拟全局常量 - 2

    我有一个gem,它有一个根据Rails.env的不同行为的方法:defself.envifdefined?(Rails)Rails.envelsif...现在我想编写一个规范来测试这个代码路径。目前我是这样做的:Kernel.const_set(:Rails,nil)Rails.should_receive(:env).and_return('production')...没关系,只是感觉很丑。另一种方法是在spec_helper中声明:moduleRails;end而且效果也很好。但也许有更好的方法?理想情况下,这应该有效:rails=double('Rails')rails.sho

  9. ruby-on-rails - rspec 模拟对象属性赋值 - 2

    我有一个rspec模拟对象,一个值赋给了属性。我正在努力在我的rspec测试中满足这种期望。只是想知道语法是什么?代码:defcreate@new_campaign=AdCampaign.new(params[:new_campaign])@new_campaign.creationDate="#{Time.now.year}/#{Time.now.mon}/#{Time.now.day}"if@new_campaign.saveflash[:status]="Success"elseflash[:status]="Failed"endend测试it"shouldabletocreat

  10. ruby - 如何使用 rspec stub /模拟对命令行的调用? - 2

    我正在尝试测试命令行工具的输出。如何使用rspec来“伪造”命令行调用?执行以下操作不起作用:it"shouldcallthecommandlineandreturn'text'"do@p=Pig.new@p.should_receive(:run).with('my_command_line_tool_call').and_return('resulttext')end如何创建stub? 最佳答案 使用newmessageexpectationsyntax:规范/虚拟规范.rbrequire"dummy"describeDummy

随机推荐