澳门科技局id_token逆向案例

本文内容澳门特别行政区经济科技发展局网站的动态cookie案例,难度适中。

案例地址:https://www.dsedt.gov.mo/zh_CN/pg_home

@


接口分析

对pg_home页面发送了两次GET请求,其中访问了5个自定义的JS文件。
在这里插入图片描述
最后一次访问,cookies已经携带了id_token参数。

可以发现有一个gen_id_cookie的请求返回了id_token。但是请求时有4个Param参数。
在这里插入图片描述

经过测试,发现这些参数是动态生成的,所以说想获取id_token,就需要生成这4个参数。

接下来我们开始逆向分析。


断点调试

调试前先清空当前页面的cookie,或者开隐私窗口访问。
在这里插入图片描述
刚开始全局搜素定位没找到,堆栈进不去, 那么在XHR/Fetch中添加断点。
在这里插入图片描述
删除cookie,刷新页面。成功进入debugger。
此时请求中已经携带了这4个参数,说明断点时参数已经生成。
在这里插入图片描述
所以我们要往之前的步骤中调试。
在这里插入图片描述
倒退几步之后,可以看到进入了自定义的JS中。
在这里插入图片描述
这里的几个\x\x,经过转换后可以发现正是我们要找的参数。
在这里插入图片描述

定位到之后,就可以开始模拟生成。

模拟生成

最简单的方法是把代码扣出来,然后一点一点补全上下文环境,但是比较耗时。
在这里插入图片描述

sha256
在这里插入图片描述

Fingerprint2
在这里插入图片描述

getUserIP
在这里插入图片描述
经过一阵分析,发现这几个自定义的JS都需要使用,没有多余的代码。

那么把所有JS代码都复制出来,复制到本地之后继续分析参数生成。

补环境这块不知道怎么描述比较好,一般是缺啥补啥,但是也要注意检测点。大家继续往下看吧。


注意

_0x29c9[33] 是requestIdleCallback。
window.requestIdleCallback 方法是插入一个函数,这个函数将在浏览器空闲时期被调用。这段对我们本地执行没有意义,所以删除后自行调用fingerprintReport即可。
在这里插入图片描述

s.min.js 文件返回的 _0xe1a0xc6, 是后续要使用的Fingerprint2。
所以在闭包函数中让 Fingerprint2 = _0xe1a0xc6;
在这里插入图片描述


auth_token

auth_token获取比较简单,初次访问网站会返回一段script代码,可以从中提取auth_token。
在这里插入图片描述


murmur

var murmur = Fingerprint2['x64hash128'](jQuery['map'](_0x5ed5x3, function (_0x5ed5x5) {
      return _0x5ed5x5[_0x29c9[1]];
    })['join'](), 31);

调用方法:Fingerprint2.x64hash128

第一个参数:jQuery['map'](_0x5ed5x3, function (_0x5ed5x5) {return _0x5ed5x5[_0x29c9[1]];})['join']()
第二个参数:31
在这里插入图片描述

_0x5ed5x3是长度为28的数组,

把第一个参数优化一下: jQuery['map'](_0x5ed5x3, function(x) {return x['value']})['join']()

这段的意思就是从_0x5ed5x3中把value值拿出来拼接。
在这里插入图片描述

我感觉参数一 可以固定,但目前不确定网站是否会对这些值做检测。 如果后面被限制了,可以修改参数中的一些值进行测试。

本地执行代码,生成生成murmur。
在这里插入图片描述


h

已知 h 是 headless
在这里插入图片描述
headless是把auth_token处理后,再sha256加密得出的
在这里插入图片描述
需要注意的是,这里有一些检测点的。
在这里插入图片描述
比如这些常见的webdriver、plugins、languages等。
在代码中的意思是,如果webdriver存在,没有浏览器插件plugins、languages为空,则被检测到。
所以这些东西,需要我们自己去补上。


localip

localip 是 getUserIP的参数二中 function 的参数。
在这里插入图片描述
到getUserIP中看一下这段代码。在这里插入图片描述
先判断是不是移动设备或者非主流浏览器,是则 n(0.0.0.0)
如果是正常浏览器则在本地创建一个RTCPeerConnection,然后取出和服务器连接的address,n(address)

那这个地方该怎么获取localip,可以直接以移动设备的UA访问让localip固定为0.0.0.0。
或者手动复制一个网页端创建的localip,因为我并不知道如何在本地创建RTCPeerConnection。
所以最好就按 0.0.0.0吧。
在这里插入图片描述

4个参数的生成已经分析完毕,大家自己按步骤做一遍吧。

最后发送GET请求获取response中返回的id_token即可。


参考代码

补环境时,并不说所有的都要补的一模一样,你也可以某些时候给定值或者注释掉部分代码。

代码量太多了,贴不上来,大家自行下载吧。

欢迎关注《Pythonlx》公众号,发送 id_token 获取下载链接。

在这里插入图片描述

也可获取爬虫逆向群聊二维码!

点赞

发表回复