声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途给予盈利等目的,否则后果自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!
前言
虽然encrypt-labs靶场还有几个没有写,但是后面几个没什么难的。yakit的webfuzzer的功能已经展示的差不多了,还不了解的师傅可以看我yakit标签的前面几篇文章。
接下来,我们进入了yakit的MITM模块的介绍。下面的文章将介绍,如何利用MITM中的热加载
,解决encrypt-labs靶场中AES+Rsa加密
的数据包。
AES+Rsa加密
key 和 iv 是浏览器随机生成的16位 byte
String()
找到加密方法
JS当中代码如下:
CryptoJS['AES']['encrypt'](_0x57740d, _0x4515a4, { 'iv': _0x5e9345, 'mode': CryptoJS['mode']['CBC'], 'padding': CryptoJS['pad']['Pkcs7'] })['toString']()
AES的key和密钥,十六进制和base64的结果
key ae6696f1599be559c7ed292f147f8c70 base64 rmaW8Vmb5VnH7SkvFH+McA==iv c5433e11dfe2bfde74d997011c19f830 base64 xUM+Ed/iv9502ZcBHBn4MA==
RSAsetPublicKey
-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRvA7giwinEkaTYllDYCkzujviNH+up0XAKXQot8RixKGpB7nr8AdidEvuo+wVCxZwDK3hlcRGrrqt0Gxqwc11btlMDSj92Mr3xSaJcshZU8kfj325L8DRh9jpruphHBfh955ihvbednGAvOHOrz3Qy3CbocDbsNeCwNpRxwjIdQIDAQAB-----END PUBLIC KEY-----
加密后key
VcwVaxDyjNvk60fim6Oe/+nyXD7ND0oZ78xRHtyWCEeMRHxvQSHOXJXoHv0bXwc+K0ob2nfr8SLC3iVIkVHauoU/T9UmJCs2v1r7UJkzfh9Q7vZwrZimivE/xIMlxs0x8iUOEbpvkj6YQyHDoikUZL18Rsa0+FLp/tkgbE1qEB8=
加密后iv
AxSRLrB/A5APbG38wo8TYHvcwcOy3GeR6dHwtV3GCvMS2uqPBW2vVAII13cqZ5kmQJajX8rZY/0+uAEPLUFsITOwtWgPrQi8ntT02uJ5VS8T1Mm0pwlCnm8LerCKITf/I2+cfP13zFLWSrAXaueqk0XZ2Hg4/WmuPAPbK02vI2M=
可得出,参数的加密方式encryptedData = AES(data)encryptedKey = RSA(key)encryptedIv = RSA(iv)
密码爆破的时候,encryptedKey和encryptedIv可以保持不变,encryptedData按照之前AES加解密的文章做即可。
更进一步
那么,如果遇到的是在渗透测试查看流量的时候遇到呢?那时候,每个包的key和iv都是随机的,我们要怎么处理?
经过之前的分析,AES的key和iv都是前端随机生成的,也就是后端对这个生成的结果是什么并不清楚。只要满足一定的格式,后端机会接受。
因此,我们完全可以在前端将key固定。
如何让浏览器加载我们修改后的key呢?方法1通过浏览器的 override content
但这种方法比较繁琐,可以自行搜索。
方法2通过Charles自带的替换JS功能右键 --> Map Local可参考:https://blog.csdn.net/BoBoLUI/article/details/122681085
方法3我们通过 yakit mitm模块的热加载替换。原理其实和Charles的类似,只不过匹配的URL地址由我们匹配。
yakit 热加载替换JS
我们先将app.js下载到本地,然后修改。通过 deepseek 生成相关的代码:
_0x4515a4 = CryptoJS.enc.Hex.parse('ae6696f1599be559c7ed292f147f8c70'), _0x5e9345 = CryptoJS.enc.Hex.parse('c5433e11dfe2bfde74d997011c19f830')
我们在本地用 python 起一个http服务
python -m http.server 8000
热加载中,修改响应包
afterRequest = func(ishttps, oreq/*原始请求*/ ,req/*hiajck修改之后的请求*/ ,orsp/*原始响应*/ ,rsp/*hijack修改后的响应*/){ // Example: // if str.Contains(string(rsp), "凝聚磅礴的中国文学力量") { // modified = poc.FixHTTPRequest(str.ReplaceAll(rsp, "凝聚磅礴的中国文学力量", "AAAAAAAAAAAAAAAA")) // return []byte(modified) // } url = poc.GetUrlFromHTTPRequest("http",oreq /*type: string*/) // 匹配包含 app.js的url if url.Contains("app.js") { // 获取本地修改后的app.js rsp1, temp1 = poc.Get("http://127.0.0.1:8000/app.js")~ rsp1 = poc.GetHTTPPacketBody(rsp1["RawPacket"]) // 替换响应体 rsp = poc.ReplaceHTTPPacketBody(rsp /*type: []byte*/, rsp1 ) } return rsp;}
我们清除浏览器的缓存,重新访问网站,查看app.js,可以看到此时aes的key和iv被我们固定
此时请求包中的参数,我们就可以通过已知密钥进行查看了。
当然,我们也可以通过编写插件查看,至于如何编写,后续会更新。欢迎关注~
参考资料
原文始发于微信公众号(进击的HACK):yakit 替换本地JS 解决AES+Rsa加密
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论