yakit替换本地JS解决AES+Rsa加密

admin 2025-12-29 00:58:20 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 文档介绍了利用yakit的MITM模块热加载功能解决AES加Rsa混合加密流量的分析方法。通过分析发现前端随机生成的密钥可被固定值替换,演示了修改本地JS设定固定密钥,利用yakit拦截响应包替换JS文件,从而实现对加密数据包的解密与后续爆破,提升了渗透测试效率。 综合评分: 85 文章分类: 渗透测试,安全工具,WEB安全


cover_image

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加密》

评论:0   参与:  0