赛尔号吧 关注:488,116贴子:44,832,823

【220110】从技术和理论的角度分析赛尔号被“盗号”的可能及手段

只看楼主收藏回复

提起盗号,大家想到最多的是什么?我想大多数人以为的盗号,就是获取登录账号及密码。
不得不承认,起初的盗号的确就是如此,但随着技术的发展和成熟,通过盗取账号密码实现非法使用非本人网络账号的手段已经基本无法实现,最经典的就是qq盗号一说。
大家都应该知道,qq的登录验证是非常完善的,包括不限于:异地登录检测、登录设备检测、账号在线情况检测、登录滑动验证码,通过多种防护形式及验证手段,来防止通过非法获取(如钓鱼等)账号密码实现登录。
可以说,qq用到的防护手段,是目前互联网绝大多数产品对用户账号保护的手段。
但很可惜的是,这些防护手段淘米都没有。
甚至部分网站到现在依然没有用上ssl,不用ssl意味着可能被劫持,关于这一点就很让人迷惑。
去年,淘米因为这个问题发生了两起事件。
第一起就是学生网无法登录的事件,原因是,登录发生了http劫持,数据无法正常提交至服务端,导致返回超时,而淘米又没有设置类似错误事件的返回描述,所以返回客户端的就是“非常抱歉,您可能受到移动网络运营商端口限制...”或者其他意为无法登录的描述。
第二起就是登录器脚本崩溃的事件。据了解,在去年12月份之前,淘米页游网站(seer.61.com)没有用上ssl协议,依然在使用传统的http协议。而再淘米更换协议装配证书后,许多登录器就遇到了无法使用脚本的问题。这个问题就是因为,没有配置证书的FD抓包是无法抓取使用ssl协议的网站的。
淘米在协议上面吃了亏,所以就在2021.12.13装配上了一个TrustAsia TLS RSA CA的免费证书(无法理解,淘米这么大公司居然使用免费证书,一年几百的证书也比这个香),免费证书最长申请一年,可以猜测一年后如果没有换上新证书,会又闹出什么乌龙呢?

简单说了下淘米网站在登录这块的客户端验证情况及淘米网站存在的一些安全隐患,复杂的问题当然也有,不过与我们今天要谈的“盗号”问题没有关系,在此就不做详细的说明。
接下来,我们来说说看关于这次盗号事件。
首先,我本人是在贴吧里看到的,也就是“第二现场”了解到的,仔细看了后,捕获到几个关键点:所有登录器都存在盗号隐患、Ollydebug、“盗号者”发布的所谓被盗账号密码的截图,其实当时看到这张图我心里就大概有个猜测了,这里先不说,我们先来谈谈前面两个关键点。
【所有登录器都存在盗号隐患】关于这点,我想说的是,“盗号者”说的其实并没有错。从技术的角度上来说,登录器可以实现“盗号”这点,本人能想到的办法就是,监控键盘输入来实现账号密码获取,再将这些数据上传收集。这个方法的确可以实现盗号一说,但是对于数据的处理却很麻烦,而且大多数使用登录器的玩家本地都是有登录信息缓存的,并不需要再次输入,所以成功率很低。至于说获取本地缓存来获取账号密码就更是扯淡了,原因我们后面说。
亲自动手,我们来看看玩家常用的chika登录器(下载链接:http://yoso.redstoner.cn/wp/go/chika_download,主程序文件MD5:289b464726e9a3e0d890615b6b3ae9f0,文件CRC32:6B9EA786)有没有在后台上传数据。
打开FD,配置下允许解析https及流量。绑定登录器窗口后,开始抓包,下图是抓包信息。

从图上来看,没有向登录器开发者传递数据,后面有机会可以做一个传递数据的例子作对比分析。
https://f0.0sm.com/node0/2022/01/861DBC4D6A798162-44504d84906139cf.txt感兴趣可以下载看看。
其他登录器,大家可以按照上述方法自行测试。
【Ollydebug】其他说法叫OD,这是一个反汇编工具,是支持动态调试的。“盗号者”说可以通过这个反向追踪获取到游戏的账号密码,可以实现吗?答案是不可以。
理论分析下,首先od是对一个本地可执行文件进行反调试的工具,一切都是客户端本地的操作,那么能获取的数据就是从本地提交传输的数据,或服务端返回至客户端本地的数据,也就是说它不能获取存在服务端不返回客户端的数据。说的明白点,就是即便有登录器在上传你的相关信息,od也只能截取这部分数据,它不能获取非本机上传的数据,也就是od只能截取到在本地登录的账号密码信息,至于获取其他不在同一个局域网中的机子的?如果能像“盗号者”说的这么玩,网络社会早崩塌了。
这是理论上的分析,至于技术上行不行呢?当然可行,但是有一个前提啊,那就是登录器得在上传这些账号密码信息啊,进过我们上面的分析,chika登录器并没有做这样的事情,所以按照“盗号者”的说法——任何登录器都可以获取,就是纯属扯淡了。
这个时候,也许会有聪明的同学发现,我前面说到od是可以获取到“从本地提交传输的数据”,那么包不包括我在本地登录赛尔号游戏时的封包数据呢?当然能获取到,但是依然不能获取到真实的登录密码,原因后面说。
【“盗号者”发布的所谓被盗账号密码的截图】我前面就提到了,当看到“盗号者”的这张图片时我就大概有个猜测了,这就要说说赛尔号这款游戏的登录验证了。
要谈赛尔号的登录验证,就要分析赛尔号的通信协议。
这里粗略的谈一下,首先通过FD抓取相关的SWF资源文件。整理下需要用到的(如下图),使用JPEXS Free Flash Decompiler工具来分析。

这里简单说明下各个文件:
Assets.swf 是赛尔号登录页面加载的资源包

Login.swf 是赛尔号登录注册验证的核心组件
PetFightDLL_201308.swf 是赛尔号对战的核心组件
RobotAppDLL.swf 和 RobotApp_2DLL.swf 和 RobotCore2DLL.swf 是赛尔号的应用插件库,包含如各类应用函数、通信密钥等
TaomeeLibraryDLL.swf 是赛尔号的核心库,里面包含了我们要分析的通信协议相关代码
这里不多做分析,有想要技术交流的可单独联系我。
这里只写下对Login.swf进行的分析。
分析swf首先判断是否进行加密,最简单的办法直接拖入JPEXS看能不能打开,最可靠的办法就是看代码文件头应是否为CWS或FWS。
(加密无法解析的错误提示)
检测发现,Login.swf是并未加密的,所以我们直接在拖进之后点击【导出所有控件】,勾选【脚本】进行导出,导出后打开指定保存文件夹下的【scripts】目录,从vscode里面打开这个目录(方便后面进行全局查找),或者使用notepad++进行全局搜索也是可以的,但是会慢很多。

点击赛尔号登录页面的【登录】后,发送了【MAIN_LOGIN_IN】这个包给服务端,全局搜索下发现两个文件,其中我们要分析的是【com\robot\login\manager\LoginManager.as】这个文件,另外一个文件是定义的命令号,跟封包相关,这里我们无需关注。
直接定位到LoginManager.as文件里的login函数位置,

分析代码,我们可以知道,_loc3_和_loc4_都是一个字节数组,_loc4_通过包名定位很容易就猜出是包内的账号密码数据,通过对赛尔号登录页面的观察,其实也不难猜出_loc3_应该是其他登录方式的key数据(如qqkey)。
分析完login函数,我们接着来看看这个函数在哪里调用,同样是全局搜索【LoginManager.login(】,可以看到只有一个文件【com\robot\login\view\LoginView.as】,打开文件定位到调用位置进行分析。

分析代码不难发现,登录的密码是经过了二次MD5加密的,并且写了一个判断,来对密码进行处理。也就是说无论是首次登录时,由客户端提交给服务端的账号密码数据,还是说通过【记住密码】功能一键登录提交的数据,这个提交的密码都是经过加密处理的。(记住密码功能,会将密码加密后保存到本地缓存中去,并非是在登录调用时加密)。
PS:新玩家注册后,保存的密码数据也是二次MD5加密后的。在文件【com\robot\login\view\regsite\RegsiterPanel.as】674行可以看到相关代码。

MD5加密属于【不可逆加密】,当然随着技术的不断发展,不加盐的MD5加密是可以通过彩虹表跑出来的,但是有效的跑表对机子的配置要求有多高,大家可以自行百度去看看。
写到这里,大家应该也明白了我前面留的几个悬念,为什么我说他不可能获取到真实密码,为什么说看到图片就猜测是假的。因为根本无法直接获取到玩家的真实密码,而这个加密后的密码,也不能称为密码,这就是一个跟qqkey一种性质的“登录凭证”。
提到qqkey就必须要谈谈Oauth2,Oatuh2是目前很多网站使用的认证授权机制,而赛尔号也有自己的授权机制,这个我们后面会说说。
其实,文章写到这里就可以结束了,通过技术和理论我们证明了“盗号者”实为谣言传播者,大家以后如果看到了类似的行为,都可以直接百度本地网络违法犯罪举报网站进行举报,会有网警在线介入调查。
如果真有被盗号的情况,依据《中华人民共和国网络安全法》“非法截获、篡改、删除他人电子邮件或者其他数据资料,侵犯公民通信自由和通信秘密的,依照刑法有关规定追究刑事责任。”
如果是造谣,依据《中华人民共和国治安管理处罚法》“通过网络介质(例如邮箱、聊天软件、社交网站、网络论坛等)传播的没有事实依据的话语。对散布谣言,谎报险情、疫情、警情或者以其他方法故意扰乱公共秩序的行为,处五日以上十日以下拘留,可以并处五百元以下罚款;情节较轻的,处五日以下拘留或者五百元以下罚款。”
遇到问题不要慌,及时使用手里的法律武器来保护我们自身的合法权益。
谣言止于智者,欢迎各路大神指出文章中的错误或不足,同时欢迎各位玩家转发分享,让谣言彻底的被击破。
————————分界线————————
以上是关于赛尔号此次盗号事件的一个大致分析,以及对谣言的证实,接下来,我们就来讨论讨论关于赛尔号“盗号”的手段以及赛尔号鉴权和授权存在的明显问题。
PS:请注意,以下言论仅为技术交流,请勿损害淘米公司的合法权益,请勿通过任何手段及方式攻击网络。
大家现在应该知道,赛尔号游戏在登录验证时,实际是核对的二次MD5加密后的密码,也就是一个“登录凭证”。但,这意味着我们无法实现“盗号”吗?
并非如此,在整个登录过程中,客户端发送的【MAIN_LOGIN_IN】这个包里,只包含了一个“登录凭证”,也就是说我们并不需要真实密码去完成游戏内的登录,我们只需要通过手段来获取到“登录凭证”,就可以伪造封包完成登录,从而实现“盗号”。
至于获取这个“登录凭证”的方法嘛,技术上可以被截取到,这里不多说,但是可以明确两点的是:手段是违法的,且具有很大的局限性。
接着来说说赛尔号鉴权和授权存在的明显问题。
TIPS:先让大家了解清楚,鉴权和授权的区别及逻辑关系。
【鉴权 Authentication】鉴权是指对于一个声明者所声明的身份权利,对其所声明的真实性进行鉴别确认的过程。简单的来说,是用来识别一个人身份的,即“你是谁”,在赛尔号中即游戏账户。
【授权 Authorization】授权是指声明者在认证后所拥有的权利。简单的来说,即“你能干什么”,在赛尔号中即登录后所能做的事情。
从逻辑关系角度来说,只有先完成鉴权,才能进行授权。

先说说游戏登录,关于这个不具备时效性,没有任何限制的“登录凭证”,它什么时候会失效呢?更改密码,是唯一的失效方法。理论上来说,“凭证”是需要具备多种方法达到失效的目的(不兼容性),大多数网站登录后都是会生成一个token凭证,这是一般的登录验证方案,还有一部分使用jwt的方法替代token。
这里简单说下登录验证方案,一般来说分为两种。
一种是,客户端提交账号密码等数据至服务端,服务端认证通过后将信息存储至session中,将session id存储在cookie中,需要时自动从cookie中提取id,然后从session中提取对应的鉴权信息。而鉴权通过后的授权凭证,一般来说是由服务端返回一个token进行授权验证一系列操作;
另一种就是,服务端认证通过后将其信息返回至客户端,在客户端存储鉴权信息,这种方案的代表就是jwt。
赛尔号使用的方案属于半成品,保护效果几乎没有,针对登录多次提交返回失败倒是设置了一个验证码机制(但也很拉胯,传统的字符验证码,完全挡不住攻击者进行线程爆破密码)。
而且,赛尔号在游戏成功登录后,所给予的权限是非常大的。登录游戏后可以实现直接登录任何一个淘米网站(支付中心pay.61.com,账户中心account.61.com,淘米游戏game.61.com),这就是赛尔号特殊的授权机制。
这个授权机制没有任何保障,之所以没有保障是因为鉴权机制拉胯,也就是登录验证拉胯,我在后面会大致谈谈解决的方法。
谈方法之前,我们先聊聊关于qq的鉴权机制,我前面提到了授权机制跟鉴权机制有密切的关系,换言之授权是需要靠鉴权去保护的。而qq的鉴权就是前面谈到的什么异地登录检测啊这些,通过这些手段,可以保证只要不是在公共场合使用公共wifi(即在同一个局域网下),盗号成功(能成功登录qq及各种应用)的风险几乎为0。
直到现在,qq依然存在一个风险隐患,我们前面提到了赛尔号在登录游戏后是可以直接登录任何一个淘米网站的,qq也是一样,如果在公共场合下登录,很容易被嗅探到qq的skey,使用skey可以实现免密登录qq邮箱、qq空间等平台,无论是赛尔号的直接登录还是qq的skey这些,都属于授权凭证。这个凭证,相当于一把万能钥匙,只要找到支持这个口的,就都能打开。那么攻击者只需要嗅探到这个授权凭证,就可以实现“盗号”。
前面说了,鉴权是授权的前提,所以把鉴权保护好,自然就能保护好授权凭证,qq也是这么做的。
所以,其实解决的办法很明了了,我这里提供一个大致的思路:
发包的封包体增加一个字段,如唯一识别码、MAC地址一类,作为设备验证。在登录游戏时,服务端通过比对设备验证以及IP验证,来判断是否是在新设备上使用或在异地使用,判定为是,服务端则向客户端发送一个令牌验证(如手机验证码、邮箱验证码等比较成熟的临时身份验证方法),等待客户端完成回调,也就是给鉴权增加一个身份验证的交互。
【MAIN_LOGIN_IN】目前来说,这个封包内含有我们二次MD5加密后的密码,作为验证身份使用。我们不妨变换下思路,将这个加密后的密码替换为一个“加密结果”,实现上就是使用TEA(RSA)加密一个空字符串(或其他固定字符串),并使用这个二次MD5加密后的密码作为秘钥,将加密后的这个结果替换掉_loc4_内的密码。服务端只需要使用数据库中的密码去解密这个加密结果即可,解密成功,返回登录成功;解密失败,返回登录失败。
写到这里,基本上就结束了。
本人时间精力有限,谈不上全面分析,只能说是大致分析了下,所给出的解决方法也仅供参考,具体实现待有时间时再全面研究下。这篇文章写完就会直接发布,所以是初稿,可能会有细节描述不清楚,或其他技术错误,欢迎各位批评指正。
最后感谢各位的阅读,希望淘米能越来越好,赛尔号能飞的更久一点。


IP属地:湖南1楼2022-01-10 14:00回复
    支持技术大佬


    IP属地:山西来自iPhone客户端2楼2022-01-10 14:12
    回复
      强啊!大佬网工的?


      IP属地:山东来自Android客户端3楼2022-01-10 14:30
      回复
        dd


        IP属地:四川4楼2022-01-10 14:31
        回复
          过于硬核


          IP属地:安徽5楼2022-01-10 14:37
          回复
            🐮


            IP属地:广东来自Android客户端6楼2022-01-10 14:53
            回复
              硬核啊,厉害了


              IP属地:广东来自Android客户端7楼2022-01-10 14:58
              回复
                好,支持大佬正义辟谣


                IP属地:安徽来自Android客户端8楼2022-01-10 15:05
                回复
                  赛尔号吧✘计算机吧✔


                  IP属地:上海来自Android客户端9楼2022-01-10 15:06
                  回复
                    牛皮


                    IP属地:河南来自iPhone客户端10楼2022-01-10 15:09
                    回复
                      nb


                      IP属地:广东来自Android客户端11楼2022-01-10 15:11
                      回复
                        大佬牛逼


                        IP属地:江苏来自Android客户端12楼2022-01-10 15:25
                        回复
                          吓死人


                          IP属地:美国来自Android客户端13楼2022-01-10 15:27
                          回复


                            IP属地:福建来自Android客户端14楼2022-01-10 15:50
                            回复
                              离谱 刚开始还准备看下去 到后面索性直接翻到评论打一局nb


                              IP属地:江苏来自iPhone客户端15楼2022-01-10 15:54
                              回复