这个登录流程是真的坑爹。。
我们学校由于未知原因,宿舍不通校园网。所以我们就必须去办坑爹的4M独家电信宽带。然后,电信还不让我们用路由器接网给几个人同时用。。幸运的是,经过一通操作,我们终于用上了路由器。虽然这样,电信的密码还要每日一换。因此,我们一直希望实现自动更换密码。于是现在我终于开始搞了。。
首先想的是,能不能直接上路由器的系统,然后改配置文件。。但是一扫发现根本就没有开相应端口。。
|
|
所以就只能硬着头皮搞这个登录流程了。。用Burpsuite抓包,发现请求的顺序诡异。先是POST请求http://192.168.1.1/?code=2&asyn=1
,然后返回了一串奇怪的字符
|
|
再然后,就会去POST请求一个http://192.168.1.1/?code=7&asyn=0&id=t8%5BK%2CWGC0QF%5BKDAx
。再往后好像就一直通过这个id加在参数里面来请求了。于是问题来了,在请求包回包里面没看到有id这玩意。但是id这个参数又特别重要,必须要搞到。直接view-source:192.168.1.1,得到首页源码
|
|
下载class.js文件,format一下就可以开始怼代码。由于Ctrl+Shift+I看Element可以发现密码输入框的id是lgPwd。直接在class.js里面搜lgpwd,可以发现this.getLgPwd这个函数。但是Console里面看sessionLS并没有什么信息Storage {lgKey: "", length: 1}
。。
|
|
但是发现了一个貌似有点用的函数,刚好就在this.getLgPwd上面,是这样的
|
|
精妙的是在Console里面输入$.auth,就会发现这个函数。点击后发现,这个函数来自lib/Quary.js
|
|
Console里面确认了TDDP_AUTH就是7,所以这个函数一通操作,就是刚才说到的莫名其妙首次带上了id这个参数的请求。在Sources下面的lib目录找了半天,终于找到了encodePara。结果发现只是一个简单的URL encode。
|
|
首先看一下authInfo。Console里面直接打出来,发现和前面说到的第一个请求得到的莫名其妙的字符串好像。结果测试下发现就是。。因此第一个请求得到的data,进行data.split(“\r\n”)就可以得到authInfo
因此我们知道,只要搞明白securityEncode就稳了。
|
|
这个代码估计是混淆过,反正暂时也不需要搞明白他是怎么样一个安全encode,直接Python化这段代码,可得
|
|
看起来我好像是稳了,实际上并不是。我随便用登录密码为123测试,但是用这个函数生成的id还是和请求里面的不一样。搞了半天后,我点开了401这个错误。然后幸运地在VM68:124
发现了lgDoSub这个函数。
|
|
这个函数的意图很明显,直接先用id(“lgPwd”)取出密码输入框的input,再取出密码。可以发现,这里请求并不是直接用密码输入框里面的值调用$.auth,即($.auth(value)),而是$.auth($.orgAuthPwd(value)),是先对密码调用了orgAuthPwd,再进行$.auth。所以我大胆预测,上面this.auth里面的$.pwd,也是这样子生成的。于是这次就真的是稳了。
|
|
因此是这样一个流程
这样一通操作就可以得到正确的id参数了。所以可以搞一波水星MW313R路由器的管理端密码爆破脚本。。
|
|
所以说,代码的混淆是十分重要的。像这个路由器的登录代码,虽然其实混淆做的也不是很到位,但是还是需要一通操作才得到id生成方式。如果是一下子就得到,这个爬虫岂不是一下就搞出来了。像之前逆向某检查手机违禁文件的Android app就是发现没有混淆啥的,直接就被扒光看,实在是僵。。
其实事情到现在还没完。。模拟登录是可以成功了,但是还要改宽带密码。不过这些就简单很多了,因为后面操作的鉴权方式几乎都是根据上面累死累活算出的id。试改密码,再抓包,可得。(其实这里会有坑,如果密码没改,他发包是另一个包,就会有迷惑性,一定要改了密码再抓包)
|
|