渗透|记一次不存在的加解密实战渗透_集群智慧网络安全云
全国客户服务热线:4006-054-001 疑难解答:159-9855-7370(7X24受理投诉、建议、合作、售前咨询),173-0411-9111(售前),155-4267-2990(售前),座机/传真:0411-83767788(售后),微信咨询:543646
企业服务导航

渗透|记一次不存在的加解密实战渗透

发布日期:2024-05-19 浏览次数: 专利申请、商标注册、软件著作权、资质办理快速响应热线:4006-054-001 微信:15998557370


渗透|记一次不存在的加解密实战渗透

0x00 起因 某天做梦,梦见老板让我对这个网站渗透,我打开一看,诶!!!前端js加密??? 0x01 入手 1.相信不少小伙伴在渗透过程中都遇到过,抓包中存在着一些加密传输字符。 2.当我们作为一个毫无办法的新手时,我们需要做的第一件事就是“搜”。 3.搜什么呢?如上图数据包,哪里加密搜哪里。这里搜frameUrlSecretParam与frameBodySecretParam。 4.我们的frameUrlSecretParam搜出来存在与一段混淆加密的js里。 5.我打上断点,定睛一看,诶,并没有停到此处。说明,业务流程与这儿毫无关系。 6.那么我接着搜下一个frameBodySecretParam参数名,直接搜不到,WTF? 7.不怕,掏出我20种常用办法之一,搜索encrypt。 encryptdecryptJSON.parseJSON.stringifyajax.... 8.这么多我要断点哪一个,很明显sm2secrity.js是个加密的调用文件,函数触发点肯定不在这儿,至于miniui.js全是大写的,更不像,那么只剩前几个了,简单调试一下。 9.很明显encryptAjaxParams就是我们frameBodySecretParam的核心加密函数了,那么入手工作就已完成。 0x02 代码分析一 1.重新回到断点,在停到断点时,选择步进函数,进入到加密函数本体,代码被混淆了。 2.逐步步过,和寻找encrypt加密点一样,紧紧跟住参数值,找到真正加密点,走了三步左右,数据便被加密。 3.核心分析点为 return window['x75x73x65x53x6dx32x45x6ex63x72x79x70x74'] ? _0x3a232b = _0xbfd749(0x1f7) + Util[_0xbfd749(0x223)](mini[_0xbfd749(0x210)](_0x4b8958)) : _0x3a232b = Util[_0xbfd749(0x1ee)](mini[_0xbfd749(0x210)](_0x4b8958)), 4.这是javascript的三目运算,百度即可。类似if else。 5.具体混淆代码代表是什么东西,通过查看数据的值来进行判断。 x75x73x65x53x6dx32x45x6ex63x72x79x70x74 6.问号前是条件语句,而windows是全局浏览器对象,那么对象里的这个是什么呢?我们用python print一下就知道了。答案是useSm2Encrypt。 7.那么我们现在断在断点前面,使用console进行打印。 8.这里就是空,也是false,代表使用冒号后面的条件进行加密。 9.简单阅读一下功能,_0x4b8958是我们的原参数,mini_0xbfd749(0x210),熟悉js应该知道,这里其实就是json序列化类似于JSON.stringify(),当然也可以自行百度。 10.整理代码如下。 _0x3a232b = Util[_0xbfd749(0x1ee)](mini[_0xbfd749(0x210)](_0x4b8958)) 11大概翻译过来也就是这样。 加密值 = Util.encrypt(json.stringify(原参数值)) 12.我找到加密函数,进入了加密函数,在加密函数里找到了加密函数,那么我要做什么呢?进入加密函数,继续分析,找到加密点,跟到了这儿。 12.跟到这儿以后,简单阅读一下功能。 var _0x747baa = _0x20b204[_0x32df64(0x206)](_0x20b204[_0x32df64(0x1e5)](_0x20b204[_0x32df64(0x206)](_0x4510fe))); _0x20b204是window,里面对象的值大概就是 var 加密值 = window["encodeURIComponent"](window["bota"](window["encodeURIComponent"](值))) 12.关于window["encodeURIComponent"]与window["bota"]是什么直接百度。就是简单的url编码+base64编码+url编码。 13.在burp上进行测试,如右边编码。 14.至此加密分析一结束。 0x03 代码分析二 1.也就是同上步骤,当window.useSm2Encrypt为true的时候又发生了什么呢,这里我们需要找到一个功能点是true的时候。 2.断点断上,在consloe输出一下window.useSm2Encrypt为ture的时候。 3.开始分析,冒号之前的代码。 _0x3a232b = _0xbfd749(0x1f7) + Util[_0xbfd749(0x223)](mini[_0xbfd749(0x210)](_0x4b8958)) 加密值 = "encbody_" + Util[_0xbfd749(0x223)](json.stringify(原数据)) 4.跟进 Util[_0xbfd749(0x223)]。 5.走到了这儿。 6.跟进sm2Encrypt,这就是一个普通的sm2加密了。 0x04 明文传输 1.如何采取明文进行传输呢? 2.首先我们要了解前后端交互的知识。那么在核心加密点处,我们不经过这个函数不就完了么? 3.那么这里要提及burp的功能之一,Match and replace。 4.这个功能可以匹配到相应的参数,进而进行替换。 这里直接写个案列。 5.替换后,进入burp查看,数据已经明文。 0x05 mitmproxy联动 1.如何使用中间代理进行自动的加密呢? 2.首先我们要了解mitmproxy是什么,相当于将burp的请求转到mitmproxy中进行自行加密。 3.使用burp的proxy功能将请求发送到mitmproxy。 4.仅抛转引玉,加密由后文单独阐述。 from mitmproxy import proxy, options from mitmproxy.tools.dump import DumpMaster import json, time class DLNSProxy: @staticmethod def request(flow): if flow.request.method == 'POST': datas = flow.request.get_content() print('########################requests path##################################') print(flow.request.path) datas = json.loads(datas.decode()) req_datas = xxx加密算法() flow.request.raw_content = req_datas #由于本文响应为明文故不需要处理响应 @staticmethod def response(flow): if flow.request.method == 'POST': datas = flow.response.get_content() try: datas = json.loads(datas.decode()) except: pass body = datas["body"].replace(" ", "").split("u001d")[0] print("------------") de = aes_decrypt(body) datas["text"] = de # if body != {}: # de = aes_decrypt(body) # datas["text"] = de rsp_data = json.dumps(datas, ensure_ascii=False, separators=(",", ":")).encode() Content_Length = bytes(str(len(rsp_data)), 'utf-8') headers = flow.response.headers headers['Content-Length'] = Content_Length flow.response.raw_content = rsp_data def start(): bp = DLNSProxy() opts = options.Options(listen_host='127.0.0.1', listen_port=8888) pconf = proxy.config.ProxyConfig(opts) m = DumpMaster(opts) m.server = proxy.server.ProxyServer(pconf) m.addons.add(bp) try: m.run() except KeyboardInterrupt: m.shutdown() if __name__ == '__main__': start() 0x06 总结 1.问题一,关于部分数据不明文,代表还有别的数据输入来源,应该如何去寻找? 2.问题二,由于加密存在两种,关于判断问题如何解决? 3.问题三,签名问题如何解决? 原文链接:https://xz.aliyun.com/t/12720#toc-6 文章来源:亿人安全 黑白之道发布、转载的文章中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途及盈利等目的,否则后果自行承担! 如侵权请私聊我们删文 END

渗透|记一次不存在的加解密实战渗透