Nuclei POC 编写教程(非常详细)

2023-12-21 14:50:34

目录

0x00 前言

0x01 YAML 简介

0x02 YAML POC 编写流程

0x03 Nuclei POC 案例 1 - CVE-2023-28432(匹配结果)

0x04 Nuclei POC 案例 2 - CVE-2022-30525(匹配交互)

0x05 Nuclei POC 模版生成 BP 插件


0x00 前言

希望和各位大佬一起学习,如果文章内容有错请多多指正,谢谢!?

个人博客链接:CH4SER的个人BLOG – Welcome To Ch4ser's Blog

0x01 YAML 简介

YAML 是 “YAML Ain’t a Markup Language”(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言)。

参考文章:

https://blog.csdn.net/qq_41315957/article/details/126594572
https://blog.csdn.net/qq_41315957/article/details/126594670

基本语法规则:

  • 大小写敏感
  • 使用缩进表示层级关系(不允许使用Tab键,只允许使用空格)
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

YAML POC 基本组成:(总的来说,可以看成三个部分:基本信息、请求、匹配或提取)

  • 1、编号?id
  • 2、信息?info
  • 3、请求?http?file?tcp...
  • 4、匹配?matchers?Interactsh
  • 5、提取?extractors

具体使用匹配还是提取,要根据实际情况来看。比如,当利用成功条件是页面返回里有特定关键字时,用的是匹配;当需要根据页面返回的长度判断有没有利用成功时,用的是提取。

0x02 YAML POC 编写流程

核心思路就是套用已有的模板,比如找到 Nuclei 的官方模板(在 C:\Users\ch4ser\nuclei-templates\ 下),然后根据需要修改。

首先需要修改 POC 的基本信息(编号 id、详细信息 info 等),然后编写提交的请求(大部分都是 HTTP),然后根据实际情况选择使用匹配还是提取。

0x03 Nuclei POC 案例 1 - CVE-2023-28432(匹配结果)

漏洞介绍:https://github.com/vulhub/vulhub/blob/master/minio/CVE-2023-28432/README.zh-cn.md

根据介绍得知,我们需要发送指定的 POST 请求数据包进行漏洞验证,最终根据返回包里是否有 MINIO_SECRET_KEY 和 MINIO_ROOT_PASSWORD 这两个关键字判断漏洞是否存在。

使用 VSCode 编写 POC,套用已有的模板进行修改不容易出错且效率高,这里我主要修改了下 http 请求包和 matchers 匹配器。

发送一个POST请求到目标系统的/minio/bootstrap/v1/verify接口,匹配器用于检查响应的内容和状态码。

它使用了三个关键词:"MINIO_ROOT_PASSWORD""MINIO_ROOT_USER""MinioEnv"。如果响应的内容中包含这些关键词,并且响应的状态码为200,则表示目标系统存在漏洞。

其中 http 请求中的变量 {{Hostname}} 会被替换为主机名(包括端口),matchers 的逻辑为含有关键字和状态码为 200 同时成立(and),且返回包中几个关键字全部含有(and)。

启动 Nuclei 对目标进行扫描,命令示例如下:

1、批量检测urls.txt,poc为test.yaml,输出结果result.txt
nuclei.exe -l urls.txt -t test.yaml -o result.txt

2、对单个目标检测,poc为test.yaml,输出结果result.txt
nuclei.exe -target http://xxx.com -t test.yaml -o result.txt

检测结果为目标存在 CVE-2023-28432 漏洞。PS:解决 CMD 输出彩色字体 ANSI(ansi189-bin)

0x04 Nuclei POC 案例 2 - CVE-2022-30525(匹配交互)

漏洞介绍:(CVE-2022-30525)Zyxel 防火墙未经身份验证的远程命令注入_zyxel.selfrep-CSDN博客

根据漏洞介绍得知命令注入点为 mtu 参数,采用 DNSLog 的方式进行漏洞验证,最终根据响应中是否包含特定的关键词(如interactsh-protocol)判断漏洞是否存在。

具体 POC 代码如下:

发送一个POST请求到目标系统的/ztp/cgi-bin/handler接口,请求中包含一个恶意命令注入的payload。这个payload会在mtu字段中插入一个特定的字符串{{exploit}},并在该字符串前面添加一个分号和一个ping命令来执行。

如果目标系统存在漏洞,它会执行这个命令并返回响应。POC中使用的匹配器会检查响应中是否包含特定的关键词,如interactsh-protocol,如果存在,则表示目标系统存在漏洞。

{{exploit}}可以理解为 payload 的占位符,在此传入命令执行的 payload。{{interactsh-url}}可以理解为 nuclei 自带的 DNSLog 地址。

启动 Nuclei 对目标进行扫描,由于 vulhub 没有这个漏洞环境,我在 Fofa 上搜了使用 Zyxel 防火墙的资产进行扫描,但没有扫到。

PS:在 Nuclei 官方自带的 POC 中,info 基本信息里基本上都有 Fofa、Shodan 对应漏洞的搜索语法,如下:

0x05 Nuclei POC 模版生成 BP 插件

Nuclei Template Generator Plugin 是一个能辅助生成 Nuclei POC 的 BurpSuite 插件,可直接从 BurpSuite 商店下载。

配置 nuclei.exe 的路径、模板存放路径、作者,完成后点击 save 即可。

以 CVE-2023-28432 为例,Burp 抓包后构造指定的 POST 请求并发送(注意这两个地方都要改成 9000 端口),看到 "MINIO_ROOT_PASSWORD" 等字段说明漏洞存在。

在左侧 Request 任意空白处右键 - Extensions - Nuclei Template Generator Plugin - Generate Template

然后在右侧 Response 选中 "MINIO_ROOT_PASSWORD" 右键 - Extensions - Nuclei Template Generator Plugin - Generate Template

点击 Execute 执行即可,类似 id、info 这种可以自己修改。

但是这个插件对于 CVE-2022-30525 这种匹配交互的情况是不行的,对于匹配结果的情况倒是非常的好用。

文章来源:https://blog.csdn.net/qq_46081990/article/details/135129068
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。