某团mtgsig1.1 && H5guard加密算法剖析
仅供研究学习使用。今天带来的是某团headers中mtgsig参数的逆向。目标站:商家后台登陆 --> 传送门目前大部分h5的算法都更新至1.2了 只有商家版后台还多为1.1的。这里抓包后可以清晰看到 mtgsig明显是一个加密参数,根据经验先瞄一眼a1 a2 …a6其中a1: 版本号a2: 时间戳a3: cookie相关a5: 未知a6:未知x0:固定值d1: 未知字符串取md5这里先从js入手
·
仅供研究学习使用。
今天带来的是某团headers中mtgsig参数的逆向。
目标站:商家后台登陆 --> 传送门
目前大部分h5的算法都更新至1.2了 只有商家版后台还多为1.1的。
废话不多说直接开干

mtgsig: {"a1":"1.1","a2":1741916388817,"a3":"z0u89y82y7xw599w021x55v507v835448057y35v7uw9795864z8z9zu","a5":"Th0orxZzYh0ZXe+pBUBrPj+76C/HwcrP","a6":"h1.5z8Lbkh4D/SJax6K/k+Zd9u+3R4tPZU3wbPUHiGt/LyvmIf/fUTjT3yqkuOjCpsY7HzaCmgkUvrWOaiSyB/Rpz166brpcXHldVTwITgaT47mFCZCtQerceGUDaFEU2Dp7dECDUFJjS3UFV0A81ULHxY2ZwrOvOasJZo+K+ht4ftU0B2MxsfeFQxKhH2jVswdorFMpx7yAXHT4qvGC19d5RXEcNMv/YD6Ar4j2dozKkjED2isCXXDSmnTFejxYJ1OHatJaeoyBUynvqQTJvnTW9APzB81UWQq7MUx36uaaCjoiuvMCJYMkJg96JwSheMRB38a36cOnLa7oE0LQksGOwApM+N420Xkyxw2a89mh4SNqXGKeNeTjJAWf5in4+HVC7L39K56s1gpHnsPl1H9PQA==","x0":4,"d1":"44339d845fc1562ef39a80651bf2cbae"}
这里抓包后可以清晰看到 mtgsig明显是一个加密参数,根据经验先瞄一眼a1 a2 …a6
其中
a1: 版本号
a2: 时间戳
a3: cookie相关
a5: 未知
a6:未知
x0:固定值
d1: 未知字符串取md5
这里先从js入手 可以从network中看到


这里看到整个js是一个自运行函数 其中算法部分基本上都是混淆加密了 且有控制流在里面

控制台打印可以看到 window.H5guard这个被赋值了 所以这里我们就可以考虑利用补环境来完成。
这里贴一部分需要检测的环境
const jsdom = require("jsdom");
const {JSDOM} = jsdom;
const dom = new JSDOM("<!DOCTYPE html><p>Hello world</p>", {
url: ["https://h5.waimai.meituan.com/waimai/mindex/home", "https://verify.meituan.com/v2/web/general_page"],
runScripts: 'dangerously',
resources: 'usable',
fetchOptions: {
credentials: 'include'
},
})
const {
performance, PerformanceObserver,
} = require('perf_hooks');
window = dom.window;
Window = dom.window;
self = window.self
document = window.document
navigator = window.navigator = {}
Navigator = window.Navigator = {}
navigator['userAgent'] = ''
location = window.location
sessionStorage = window.sessionStorage
XMLHttpRequest = window.XMLHttpRequest;
document.cookie = ''
screen = {
"availWidth": 391,
"availHeight": 855,
"width": 391,
"height": 855,
"colorDepth": 24,
"pixelDepth": 24,
"availLeft": 0,
"availTop": 0,
"orientation": {},
"onchange": null,
"isExtended": false
}
location = {
"ancestorOrigins": {},
"href": "",
"origin": "https://h5.waimai.meituan.com",
"protocol": "https:",
"host": "h5.waimai.meituan.com",
"hostname": "h5.waimai.meituan.com",
"port": "",
"pathname": "/waimai/mindex/home",
"search": "",
"hash": ""
}
实际上也可以自己把代码拷下来在nodejs里面运行 缺什么补什么即可
setInterval = function(){
return this
}
还有最好再重写一下setInterval方法 因为不重写可能程序不会自己终止。
接下来就是找明文的入参了

从这里跟进去就可以看到了

我们直接把hO的各项值复制下来 拿到nodejs里面去跑

这里可以看到 能够出值 但是这个a3明显不是我们想要的 浏览器上是纯字符串 而我们拿到的是时间戳+字符串格式
所以这里返回到第一步 我们看看H5guard.js的启动器

我们拷贝下来放到nodejs里面 先做一个init处理后再进行调用

至此逆向部分就结束了 我们拿到python中做校验

Ending
Github传送门
持续更新ing (欢迎各种star与fork)
如有权益问题可以发私信联系我删除
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)