本文为看雪论坛优秀文章
看雪论坛作者ID:ChenSem
注:此次分析基于Mac端。
这种上网方式一直需要连着网线而且使用它自己定制的软件,只要网线一断就没网了。然而无线AP的网非常非常慢,于是想着逆向PC端的网络协议,将它移植到路由器上,这样就方便很多。
软件使用的是http协议,没有启用https。直接wireshark抓取一下重要的http协议。1. 往服务器发送GET请求,响应的是个302报文。其中Location字段含有一个重要的value (tag)。4. 获取完ticket后,生成相关的url,展示为url。手机客户端扫描二维码,请求服务器通过此次上网请求。5. 其中还有一个stage.cgi,这个URL是PC端展示目前认证的一个状态(上网失败,上网成功,正在请求)。第一个GET请求没啥东西,wlanuserip是获取到的内网IP,mscgip是外网IP,wlanusermac是一个mac地址,userlocation可能是记录网络接口物理位置的参数。
里面POST的内容是突然多出来的,看这个格式像hexstr,分析可能是加密过的。于是去程序中分析这个POST data的由来。通过这个Headers里面的字段去定位这个data的生成。分析程序的一个字符串表,看到有个getTheTicket的,在drawAndCheckQRCode。
objc_msgSend就是这个调用getTheTicket函数的。这个函数不在程序中,调用的是动态链接库的,我们切换到动态链接库去查看。分析这个getticket函数,其实这里我没有分析多少,这里它的日志没有关闭,我们直接可以查看到他的日志。他这个xmlDataWithDic其实就是生成这个xml序列。然后调用encodeData对这个xml序列进行加密,最后得到的这个值就是POST的数据。分析这个encodeData。里面有一个比较重要的函数keyCode。猜测可能是对数据进行加密的。这里可以直接在这里下个断点,然后查看相应的数据,看是否为原始数据。跟进这个Keycode。
这里发现其实是使用dlopen打开一个动态链接库,然后寻找到Code的函数,进行加密。 这个openZsmModule其实是写一个so文件,然后dlopen这个so文件。在这里下个断点直接将SO库拷贝出来即可。文件名是client.dylib。这里有了这个so文件,就可以去分析里面的Code函数。code函数有三个加密rc4,aes,des3。我们这里直接采用动态调试的方式,查看getticket的时候会进入哪一个case。分析过后其实是进入的aes这里面去了。aes需要一个key和一个iv。跟着上下文进行分析,发现v7就是我们需要的key。拿到key,iv还不知道。但是iv其实在aes中只会影响第一段后面的序列,还有一些模式不需要用到IV,就比如ECB模式,直接在线测试。最后发现其实是一段ECB模式的加密。那么拿到这个加密过后就可以对getticket的响应进行解密了。此时会得到一个ticket。生成的二维码我们可以直接用手机扫一下,其实就是一个URL。 就是这样的一个序列,cctp://[ticket]@主机名'mac。刚刚我们分析的POST data的生成,报文中还有一个比较重要的字段:CDC-checkSum,通过对程序的分析其实就是一个对POST data的MD5。1. userip,mscgip等一些参数要正确设置。2. 提示二维码失效的时候要及时通过api将二维码销毁掉。
整个协议挺简单的,不复杂。注意就是在测试的时候每个参数应该大致知道他的由来,不然模拟报文发送的时候不能正常模拟,又得花费很长时间去查找出错的原因。看雪ID:ChenSem
https://bbs.pediy.com/user-771450.htm
*本文由看雪论坛 ChenSem 原创,转载请注明来自看雪社区进阶安全圈,不得不读的一本书
文章来源: http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458298876&idx=1&sn=34c920712e3c20f068913041d024c9bb&chksm=b181997686f610600866ea3a94b21cbd2625d55551cd8d875e6100129c72eb057e28a63d163f#rd
如有侵权请联系:admin#unsafe.sh