如果觉得该文章有帮助的,麻烦师傅们可以搜索下微信公众号:良月安全。点个关注,感谢师傅们的支持。
免责声明
本号所发布的所有内容,包括但不限于信息、工具、项目以及文章,均旨在提供学习与研究之用。所有工具安全性自测。如因此产生的一切不良后果与文章作者和本公众号无关。如有涉及公司与个人敏感信息,侵权烦请告知,我们会立即删除并致歉。
前言
渗透测试中,经常遇到HTTP报文加密/加签传输的情况,这导致想要查看和修改明文报文很不方便,使用Burp插件Galaxy可以有效解决部分场景下的这个问题,实现自动加解密,在HTTP报文加密/加签传输的情况下也能够进行重放以及暴力破解。
这里用encrypt-decrypt-vuls加解密靶场来进行学习演示。
靶场情况
抓取登录包发现,请求体与响应体都进行了加密,并且还有requestId进行重放校验,timestamp进行时间戳校验,sign进行签名校验。
定位加密函数
利用v_jstools工具,开启挂钩,然后发起登录请求,在控制台中发现了加密前的参数。
定位到该js代码位置,下断点进行调试。
可以看到其利用了AES算法,模式为cbc,填充为pkcs7,key和iv都为1234567891234567。
实现自动解密
知道了加解密算法后,我们就可以利用Galaxy插件来写模板进行"Http Hook"了,Galaxy插件自带了AesCbc的模板。
我们新建一个demo文件,先复制AesCbc的内容过来,然后进行修改,首先修改模式为AES/CBC/PKCS7Padding,将key和iv都修改为1234567891234567。
然后还要修改获取数据和生成数据的方法,即getData和toData方法,因为这里的请求和回显都直接是aes加密的结果。
修改好后,点击start,开启"Http Hook",再次抓取登录包发现自动解密了。
这里的原理就是HTTP请求从客户端到达Burp时,对发送的加密数据进行解密,HTTP请求从Burp将要发送到Server时将,将数据加密回去。
HTTP请求从Server到达Burp时,对返回的加密数据进行解密,HTTP请求从Burp将要发送到客户端时,将数据加密回去。
实现重放
现在实现自动加解密了,但是还无法重发数据包,原因是对requestId做了校验。
改了requestId又会影响签名。
js调试,可以看到sign值是由data + requestId + timestamp的值进行md5后得到的,data就是我们发送的数据,requestId是随机获取的32位的字符,timestamp是当前时间戳。
可以利用Galaxy生成一个32位随机的requestId,生成当前时间戳timestamp,然后再用MD5加密算法加密data + requestId + timestamp生成sign,在HTTP请求从burp发送到server的时候修改这3个请求头即可。
生成32位的随机requestId:
String requestId = FactorUtil.randomString(32);
生成当前时间戳:
String timestamp = String.valueOf(System.currentTimeMillis());
生成签名:
String sign = HashUtil.calcToHex((d+requestId+timestamp).getBytes(),"MD5");
实现在HTTP请求从burp发送到server的时候修改这3个请求头,在hookRequestToServer方法中添加如下这段代码。
修改好后,点击start,开启"Http Hook",再次抓取登录包发现可以重放了。
虽然burp上显示请求头没变化,但实际请求头是在变化的,这里是因为只在hookRequestToServer方法中修改了请求头。
将线程设置的低一点,就可以实现暴力破解了。
参考链接
https://xz.aliyun.com/t/14629
https://github.com/outlaws-bai/Galaxy
https://github.com/0ctDay/encrypt-decrypt-vuls