文章目录
前言
抓包
调试思路
解密
案例
0x01前言:
目前越来越多的企业对互联网公开服务的数据报文进行流量加密的方式进行传输。但是不管是Web端还是APP端,只要是采用对称加密算法进行加密的话,那么攻击者在用户端在代码中是一定能够获取密钥的。
因此现在有一些应用采用类似HTTPS的方式对数据报文进行加密处理。即,利用随机数函数生成一个随机数,然后使用随机数作为对称加密的密钥对数据报文进行加密,然后使用非对称加密算法对随机数进行加密,然后将加密过的随机数和加密后的报文一同发送到服务器端。
这样即解决密钥固定的问题,而且攻击者即使获取了密钥也只能保证一次有效。对于Android 端,由于Frida这个外挂的存在,我们可以利用Frida去Hook随机数函数来固定随机数。对于Web端,因为浏览器并不会去验证下载网站的完整性,因此我们可以使用BurpSuite 网站源码进行拦截替换来固定随机数。
然后对于微信小程序来说,一方面很难通过Hook的方式去Hook v8 来达到固定随机数。另外一方面,由于微信对小程序包的加载机制,直接修改也无效。
本文主要提供一种在Windows 平台对使用一次一密加密方式的微信小程序流量破解的解决方案。
0x02抓包
我们使用两种工具对小程序的报文进行抓取
BurpSuite
Proxifier
对于渗透测试人员来说,BurpSuite的干饭的工具,使用的方法就不再介绍。需要注意的是需要在客户端提前安装BurpSuite的证书
对于Proxifier
我们首先添加 ProxyServer 到我们BurpSuite 监听的端口
然后在Proxification Rules 中微信运行小程序的exe 让其走我们的代理。
wechatappex.exe 的路径获取方法如下:
先打开小程序,然后再打开任务管理器。然后寻找如下这个进程。在下面的子进程右键 ----> 打开文件所在位置。即可获取目录。
0x03调试思路
由于微信小程序,本身不支持F12进行调试。感谢大佬们的无私分享,这里提供一种微信小程序的调试方法,在分析代码起来更加的方便。
https:
//www.bilibili.com/video/BV1aa4y197UU/?spm_id_from=333.999.0.0&vd_source=5de1ac6c7f910f202848c8ef5cf1f879
借助这个工具,我们能够更加方便的定位小程序随机数生成的位置和逻辑。
0x04解密
现在前置条件都已经准备完成。
微信在每次打开小程序的时候都会对小程序的缓存包进行删除,然后重新下载。因此我们无法通过缓存包的方式进行修改。
我们采用的是,在小程序运行过程中,对小程序的缓存包中的代码进行修改。然后利用小程序”重新进入小程序”的功能,加载我们修改后报文到内存中。
0x05案例
假设我们现在通过调试的方式获取了某款小程序的随机数生成函数,代码如下:
从上面的代码中可以看出,程序随机数的逻辑是 math.random() *( t数据中的长度-1)然后取整,然后再去数字t中取值。
此时我们假设,如果t数据中的值全部为0,那么生成的随时数就是0.
小程序缓存下来的文件位置如下:
C:Users用户名DocumentsWeChat FilesApplet
我们可以把随机数命令的文件夹,全部删除,然后再重新打开小程序,这样我们就能快速定位到小程序的文件。
找到小程序的缓存文件以后,我们首先需要对文件进行解密。
UnpackMiniApp.exe
然后我们打开小程序,并保持启动,注意,以后所有操作都在小程序启动中进行,不可关闭小程序。
我们使用010editor 打开我们的wxapkg文件,然后利用关键字定位我们刚刚确定的小程序随机数的位置。
将上面的["0"......."z"] 修改为0000000.如上图。然后我们保存。
此时在小程序界面选择重新进入小程序
小程序运行也没有问题。
而且下断点调试可以看到随机数生成的是00000000000000
此时,我们就可以使用Burpy 编写解密脚本愉快的玩耍了。
完结撒花。
首发Freebuf,作者授权
原文链接:https:
//www.freebuf.com/articles/web/390152.html
原文始发于微信公众号(不秃头的安全):小程序一次一密流量解密
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论