文章总结: 文档介绍了利用yakit的MITM模块热加载功能解决AES加Rsa混合加密流量的分析方法。通过分析发现前端随机生成的密钥可被固定值替换,演示了修改本地JS设定固定密钥,利用yakit拦截响应包替换JS文件,从而实现对加密数据包的解密与后续爆破,提升了渗透测试效率。 综合评分: 85 文章分类: 渗透测试,安全工具,WEB安全
yakit 替换本地JS 解决AES+Rsa加密
原创
进击的hack
进击的HACK
2025年4月9日 07:50 江苏
声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途给予盈利等目的,否则后果自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!
前言
虽然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==
RSA setPublicKey
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRvA7giwinEkaTYllDYCkzujvi
NH+up0XAKXQot8RixKGpB7nr8AdidEvuo+wVCxZwDK3hlcRGrrqt0Gxqwc11btlM
DSj92Mr3xSaJcshZU8kfj325L8DRh9jpruphHBfh955ihvbednGAvOHOrz3Qy3Cb
ocDbsNeCwNpRxwjIdQIDAQAB
-----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被我们固定
此时请求包中的参数,我们就可以通过已知密钥进行查看了。
当然,我们也可以通过编写插件查看,至于如何编写,后续会更新。欢迎关注~
参考资料
如何在chrome浏览器使用本地js替换远程js内容
往期推荐
攻防演练中 elasticsearch 如何利用
通过Web Fuzzer 序列,爆破一次性key和iv的加密数据包
yakit 调用jsRpc加解密,免去抠代码补环境
代码审计 | 一次JWT任意用户登录审计
Yakit JWT Token 弱口令枚举
yakit 弱口令爆破与未授权检测
yakit 验证码识别 进行webfuzzer
yakit 安装和初次使用
数据库自动取样工具DataMiner
burpsuite指纹识别插件合集
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:进击的HACK 进击的hack《yakit 替换本地JS 解决AES+Rsa加密》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论