0x00 简介


漏洞作者EduardoBraun Prado在今年早期发现了WMP的.MCL文件又存在一个可以导致远程代码执行的漏洞。为什么要说又呢,因为这个东西实在是“不争气”,同一个地方出现了多次绕过导致远程代码执行的问题。

0x01 历史A――MS15-100


2015年的MS15-100(CVE-2015-2509,Aaron Luo, Kenney Lu, and Ziv Chang of TrendMicro)漏洞便是MCL“噩梦”的开始,研究者发现只要在MCL文件中指定:

便可以让WMP运行cmd.exe,代码层面看,由于MCL是一个XML文件,WMP加载时只是简单的解析了该XML,便直接运行了“run”中指定的内容。看起来相当令人无语。

0x02 历史B――MS15-134


紧随着MS15-100中微软将run的内容做了过滤之后,MS15-134(CVE-2015-6127,Francisco Falcon of CoreSecurity)又诞生了。这回作者利用的倒不是run这个属性,而是另一个url属性。

通过application的url属性指定一个文件后,WMP会在自己的WebBrowser中加载这个URL。但是研究者发现,WMP的exe并不在Local Machine Lockdown的列表(

1
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/InternetExplorer/MAIN/FeatureControl/FEATURE_LOCALMACHINE_LOCKDOWN

)中,因此在WMP的WebBrowser中打开的本地页面中的脚本将会自动运行。

但是总归不能分发两个文件到用户电脑中吧,于是作者想到了更“优雅”的方式:在application标签中加入脚本。因为WMP的XMLParser把不认识的APPLICATION的子元素全部忽略,如果攻击者构造攻击文件a.mlc:

注意url指向自身,这样这个文件又会被当作HTML文件加载,由于WebBrowser(IE)处理HTML的宽松的特性――不认识的标签会被忽略,只去渲染认识标签的含义。就导致WebBrowser中直接渲染并在file域下执行了文件包含的脚本。接下来能干什么事情想必也不用细说了。

0x03 主角――MS16-059


在微软拦截的七七八八的时候,又有人发现了新玩法:

因为微软对UNC作出了拦截,攻击者使用了

1
file:///

来绕过过滤。同时,微软也对传递的文件后缀进行了拦截,因此作者又传入了lnk(快捷方式)文件进行了绕过。

作者在lnk中指定了调用一个CPL文件,CPL其实也是一个实现了特定接口的DLL文件,因此作者成功地绕过了MCL的拦截,执行了任意代码。

借助于UNC,作者仍然只需要传入一个MCL文件给用户即可,其他的所有恶意代码完全依靠远程拉取。

0x04 MCL是如何被处理的?(原版・14年版本)


因为虚拟机打补丁实在是太慢了,所以这里就直接用14年的DLL来演示了,看一个原始风貌。

MCL文件如何处理?打开注册表,查看MCL文件相关关联,可知是由ehshell.exe打开的:

1
HKEY_LOCAL_MACHINE/SOFTWARE/Classes/.mcl/OpenWithList/ehshell.exe

观察ehshell.exe的代码可以发现,ehshell.exe简单地加载了ehshell.dll,之后所有逻辑都是再ehshell.dll去做的。

从调用栈也可以得出这个结论(双击mcl文件之后的栈):

可以看到LaunchMediaCenter之后,ehshell基本就啥都不干了。

由于MediaCenter以及ehshell.dll都是C# DLL,因此WinDbg看就显得比较捉急了,我们将其反编译,生成源代码直接看:

Windows Media Center .MCL文件代码执行漏洞(MS16-059)-安全盒子

工程十分庞大,在漫长的生成过程后,搜索关键字可以看到这样的逻辑:在加载MCL之后,首先程序解析.MCL文件(通过System.XML),并在InternalExtensibilityAppInfo中为包含有Run属性的MCL创建一个特殊的“AppEntryPoint”。

在处理AppEntryPoint时,程序啥校验都不做,直接Process.Start启动程序。当然,这是最初的版本,因此没有任何弹框或判断。

0x05 新版如何过滤?(16年6月补丁后版本)


简单粗暴,所有包含Run/Url的全部弹窗二次确认。这也是微软对前几个严重问题所做的非常暴力的“折中”处理。

Windows Media Center .MCL文件代码执行漏洞(MS16-059)-安全盒子

0x06 十年以上的漏洞


而有趣的是,这个漏洞看起来感觉有十年以上。MCL文件最初就是为了在WMP中执行一个程序用的,这有点像HTA文件,在查找相关信息的时候,我发现了06年(肯定还有更早的)论坛帖子就有关于MCL如何启动程序的讨论了。非常有意思的是,当时的人们并不觉得这个功能是一个安全漏洞,而只是一个功能而已,但是到了2015年第一次被人报告开始,微软就给了这个问题最高的安全评级――但是这个原本是正常的“功能设计”。可见安全的概念在十年间转换了很多。

例如下面的代码是曾经一个帖子“如何在Xbox 360上运行Zsnes”的解决代码,和MS15-100的利用代码一模一样,发帖时间是2012年。