查看原文
其他

X-Young认证协议分析

ChenSem 看雪学院 2021-03-07

本文为看雪论坛优秀文章

看雪论坛作者ID:ChenSem



注:此次分析基于Mac端。



0x01



这种上网方式一直需要连着网线而且使用它自己定制的软件,只要网线一断就没网了。然而无线AP的网非常非常慢,于是想着逆向PC端的网络协议,将它移植到路由器上,这样就方便很多。


0x02



软件使用的是http协议,没有启用https。直接wireshark抓取一下重要的http协议。


认证过程分为下面几个步骤:

1. 往服务器发送GET请求,响应的是个302报文。其中Location字段含有一个重要的value (tag)。

2. 请求Location,获取相关配置URL。

3. 获取一个ticket,也就是请求上网。

4. 获取完ticket后,生成相关的url,展示为url。手机客户端扫描二维码,请求服务器通过此次上网请求。

5. 其中还有一个stage.cgi,这个URL是PC端展示目前认证的一个状态(上网失败,上网成功,正在请求)。

下面看一个各个请求中的字段。
  

第一个GET请求没啥东西,wlanuserip是获取到的内网IP,mscgip是外网IP,wlanusermac是一个mac地址,userlocation可能是记录网络接口物理位置的参数。

分析ticket.cgi。

  
里面POST的内容是突然多出来的,看这个格式像hexstr,分析可能是加密过的。于是去程序中分析这个POST data的由来。通过这个Headers里面的字段去定位这个data的生成。


分析程序的一个字符串表,看到有个getTheTicket的,在drawAndCheckQRCode。
 

objc_msgSend就是这个调用getTheTicket函数的。这个函数不在程序中,调用的是动态链接库的,我们切换到动态链接库去查看。


分析这个getticket函数,其实这里我没有分析多少,这里它的日志没有关闭,我们直接可以查看到他的日志。



 这里的他原始生成的其实是一个xml序列。


他这个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将二维码销毁掉。


0x03



整个协议挺简单的,不复杂。注意就是在测试的时候每个参数应该大致知道他的由来,不然模拟报文发送的时候不能正常模拟,又得花费很长时间去查找出错的原因。






- End -








看雪ID:ChenSem

https://bbs.pediy.com/user-771450.htm 


*本文由看雪论坛 ChenSem 原创,转载请注明来自看雪社区







推荐文章++++

基于二进制代码的代码混淆研究

移动基带安全研究系列之一 概念和系统篇

Linux Kernel Exploit 内核漏洞学习(4)-RW Any Memory

Android 调试任意APK - smail工程--多进程

使用IDA Python寻找二进制漏洞




进阶安全圈,不得不读的一本书














“阅读原文”一起来充电吧!

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存