freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

BurpSuite调用JavaScript处理Payload,通过JS完全自定义处理逻辑
2020-08-20 12:14:46

0×01 引言

大家在使用burp的intruder模块时,一定遇到过已有payload processing不能满足需求的情况。

例如某些系统使用了复杂的加密算法对参数加密之后传给服务器,当我们要对payload做复杂处理时,burp自带功能不能满足要求,只能自己写脚本翻译算法,这样一来,一定程度上进行了很多重复性工作,比如:

image.png

从上图可以看出,password与nonce两个参数是js加密后传输的,如果要用字典爆破,必须用相同的算法对payload加工之后才可以。

有经验的朋友应该从url和参数中看出来了,这是小米路由器的登录逻辑。接下来我就以小米路由器的登录操作来演示今天要分享的工具:JSRainbow,一个可以架通js和burp的精简插件。

下载地址:https://github.com/thinkoaa/JSRainbow

可以直接下载jar包导入,或者下载源代码再做修改。

此处最关键的是思路,工具本身只是一个彩虹通道,我写完之后发github,大家可以随意发挥修改。

0×02 前端加密逻辑分析

以小米路由器登录为示例,接下来我们看一下前端的加密逻辑:

image.png

从上图可以看出,两个参数分别调用了Encrypt中的init和oldPwd方法,我们再看方法中的具体内容:

image.png

从方法中可以看出,秘钥和偏移量是按照规则自定义的,nonce参数调用了nonceCreat方法生成,nonceCreat中又采用了本机的mac地址+时间+随机数+特殊字符的方式生成最终结果。

而oldPwd方法采用了crypto-js库中SHA1算法生成,生成的时候,结合了nonce参数+原来的pwd+自定义的key秘钥。

如此一来,如果要自己写脚本翻译上述代码的话,太浪费时间了,最关键的是,每次碰到类似情况都得定制化。

为了解决类似问题,接下来和大家分享一下burp调用js代码来fuzz的思路。

0×03 Burp Suite调用JS

第1步:导入JSRainbow

导入成功之后,如下图所示:

image.png

其中:

JS文件的绝对路径:通过点击[选择文件]按钮来指定,所指定的js文件必须是本地测试成功且没有语法错误的,另外,js中不要使用 let 定义变量,请使用var,也不要出现alert confirm等提示框,只写业务逻辑即可。

重新获取按钮:每次修改js之后,点击重新加载最新的js。

JS方法的调用名称:只需要填写方法名即可,如填写test,代码示意:

function test(payload){
var newPayload="";
......各种js对payload操作之后,赋值给newPayload.....
return newPayload;
}

另外:在repeater等模块中,选中字符串,然后直接右键点击JSRainbow,可以调用js方法处理选中的字符串,预览结果,如图:

image.pngimage.png

第2步:copy调试js代码

在本地新建一个js文件,命名为xm.js,因为登录逻辑中使用了crypto-js库中SHA1算法,所以我们从目标服务直接下载所使用的js,并且把js内容复制到xm.js中,接下来,再把小米路由器登录用到的js代码原封不动复制过来,如图所示:

image.png

image.png

image.png

其中excutePaylod是我定义的方法,方法的入参就是burp传来的payload,也就是字典中的一行行payload,而出参就是js处理之后,返回给burp的newPayload。为了演示清晰,语法写的很直接。

接下来我们在本地调试js,新建一个html文件,直接引入xm.js,并且调用excutePaylod方法,我们用同样的参数来比较小米路由器登录和本地js处理的结果格式,因为加密过程中使用了时间和随机数,所以先比较格式,再真正的发请求验证脚本正确性。

密码设置admin:

image.png

image.png

image.png

本地js调用执行返回的结果与在线登录加密后端结果格式一致,且js没有报错。

第3步:burp中使用字典fuzz

先指定js路径和方法名

image.png

再指定字典,因为是测试,所以我直接把正确密码写入字典前面

image.png

再抓包发intruder

image.pngimage.png

因为password和nonce两个参数要一起动态处理替换,所以我调整参数的位置,再设变量,调整后如下图:

image.png

大家可以对比一下上面两张截图的思路,接下来设置payload以及payload processing,取消payload encoding中url-encode勾选

image.pngimage.pngimage.png

因为小米路由器有完善的防爆破机制,所以调节线程数和延迟时间,这里不分析针对小米路由器的爆破思路,只做演示,如图:

image.png点击start attack等待结果:

image.pngimage.png通过筛选分析发现,该次请求登录成功,直接复制url在地址栏中访问,即可访问成功:
image.png

我们再改进一下,如果字典中payload多了,成功之后要直接看到明文payload,以便可以手动登录。我们对js做一些修改,返回的newPayload中我们多加一个参数,纯粹是给自己看。

image.png这样的话,当找到请求成功的访问时,url中自带明文paylod,如图:

image.png这样就可以手动登录了。

0×04 报错提示

因为是通过java的内置引擎加载js,因此浏览器中的windows、document等对象方法的使用需要从js文件中根据实际逻辑删改,不然会报错。其实,起作用的处理逻辑也几乎用不到那些对象中的方法。

如果js文件中存在java不支持的语法或对象、方法,则会弹出详细的错误信息,有一点点js经验的朋友,应该能修改过来,如果不行,可以发邮件或者私信、留言给我,时间允许的话,我会帮忙分析一下,不过一般只有周末晚上有时间。

举例说明:

代码中查看:

再举一个:

0×05 发散一下

上面演示的是入参是一个整体字符串,出参意义是一个结果,形式上是多个参数。

如果入参形式上是多个参数的话,如:name-pwd-code或其他格式

我们可以在自定义js方法中,分割-->处理-->返回。

以上就是burp调用javascript处理payload的思路,这样针对某些情况,可以不必写java、python代码,只需要在js中快速分析、粘贴、调式即可,目标系统怎么写,照抄就行。

当然,js中随意发挥的空间很大,根据实际需要去写即可。

# Burp Suite # payload # JS # 爆破攻击 # JS加密算法
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者