0×01 引言
大家在使用burp的intruder模块时,一定遇到过已有payload processing不能满足需求的情况。
例如某些系统使用了复杂的加密算法对参数加密之后传给服务器,当我们要对payload做复杂处理时,burp自带功能不能满足要求,只能自己写脚本翻译算法,这样一来,一定程度上进行了很多重复性工作,比如:
从上图可以看出,password与nonce两个参数是js加密后传输的,如果要用字典爆破,必须用相同的算法对payload加工之后才可以。
有经验的朋友应该从url和参数中看出来了,这是小米路由器的登录逻辑。接下来我就以小米路由器的登录操作来演示今天要分享的工具:JSRainbow,一个可以架通js和burp的精简插件。
可以直接下载jar包导入,或者下载源代码再做修改。
此处最关键的是思路,工具本身只是一个彩虹通道,我写完之后发github,大家可以随意发挥修改。
0×02 前端加密逻辑分析
以小米路由器登录为示例,接下来我们看一下前端的加密逻辑:
从上图可以看出,两个参数分别调用了Encrypt中的init和oldPwd方法,我们再看方法中的具体内容:
从方法中可以看出,秘钥和偏移量是按照规则自定义的,nonce参数调用了nonceCreat方法生成,nonceCreat中又采用了本机的mac地址+时间+随机数+特殊字符的方式生成最终结果。
而oldPwd方法采用了crypto-js库中SHA1算法生成,生成的时候,结合了nonce参数+原来的pwd+自定义的key秘钥。
如此一来,如果要自己写脚本翻译上述代码的话,太浪费时间了,最关键的是,每次碰到类似情况都得定制化。
为了解决类似问题,接下来和大家分享一下burp调用js代码来fuzz的思路。
0×03 Burp Suite调用JS
第1步:导入JSRainbow
导入成功之后,如下图所示:
其中:
JS文件的绝对路径:通过点击[选择文件]按钮来指定,所指定的js文件必须是本地测试成功且没有语法错误的,另外,js中不要使用 let 定义变量,请使用var,也不要出现alert confirm等提示框,只写业务逻辑即可。
重新获取按钮:每次修改js之后,点击重新加载最新的js。
JS方法的调用名称:只需要填写方法名即可,如填写test,代码示意:function test(payload){
var newPayload="";
......各种js对payload操作之后,赋值给newPayload.....
return newPayload;
}
另外:在repeater等模块中,选中字符串,然后直接右键点击JSRainbow,可以调用js方法处理选中的字符串,预览结果,如图:
第2步:copy调试js代码
在本地新建一个js文件,命名为xm.js,因为登录逻辑中使用了crypto-js库中SHA1算法,所以我们从目标服务直接下载所使用的js,并且把js内容复制到xm.js中,接下来,再把小米路由器登录用到的js代码原封不动复制过来,如图所示:
其中excutePaylod是我定义的方法,方法的入参就是burp传来的payload,也就是字典中的一行行payload,而出参就是js处理之后,返回给burp的newPayload。为了演示清晰,语法写的很直接。
接下来我们在本地调试js,新建一个html文件,直接引入xm.js,并且调用excutePaylod方法,我们用同样的参数来比较小米路由器登录和本地js处理的结果格式,因为加密过程中使用了时间和随机数,所以先比较格式,再真正的发请求验证脚本正确性。
密码设置admin:
本地js调用执行返回的结果与在线登录加密后端结果格式一致,且js没有报错。
第3步:burp中使用字典fuzz
先指定js路径和方法名
再指定字典,因为是测试,所以我直接把正确密码写入字典前面
再抓包发intruder
因为password和nonce两个参数要一起动态处理替换,所以我调整参数的位置,再设变量,调整后如下图:
大家可以对比一下上面两张截图的思路,接下来设置payload以及payload processing,取消payload encoding中url-encode勾选
因为小米路由器有完善的防爆破机制,所以调节线程数和延迟时间,这里不分析针对小米路由器的爆破思路,只做演示,如图:
通过筛选分析发现,该次请求登录成功,直接复制url在地址栏中访问,即可访问成功:
我们再改进一下,如果字典中payload多了,成功之后要直接看到明文payload,以便可以手动登录。我们对js做一些修改,返回的newPayload中我们多加一个参数,纯粹是给自己看。
这样的话,当找到请求成功的访问时,url中自带明文paylod,如图:
0×04 报错提示
因为是通过java的内置引擎加载js,因此浏览器中的windows、document等对象方法的使用需要从js文件中根据实际逻辑删改,不然会报错。其实,起作用的处理逻辑也几乎用不到那些对象中的方法。
如果js文件中存在java不支持的语法或对象、方法,则会弹出详细的错误信息,有一点点js经验的朋友,应该能修改过来,如果不行,可以发邮件或者私信、留言给我,时间允许的话,我会帮忙分析一下,不过一般只有周末晚上有时间。
举例说明:
0×05 发散一下
上面演示的是入参是一个整体字符串,出参意义是一个结果,形式上是多个参数。
如果入参形式上是多个参数的话,如:name-pwd-code或其他格式
我们可以在自定义js方法中,分割-->处理-->返回。
以上就是burp调用javascript处理payload的思路,这样针对某些情况,可以不必写java、python代码,只需要在js中快速分析、粘贴、调式即可,目标系统怎么写,照抄就行。
当然,js中随意发挥的空间很大,根据实际需要去写即可。