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

blast · 2016/06/21 13:18

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文件中指定:

<application run="c:\windows\system32\cmd.exe"></application>
复制代码

便可以让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的列表(HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\InternetExplorer\MAIN\FeatureControl\FEATURE_LOCALMACHINE_LOCKDOWN)中,因此在WMP的WebBrowser中打开的本地页面中的脚本将会自动运行。

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

#!html
<application url="a.mlc"><script>alert(1)</script>
</application>
复制代码

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

0x03 主角――MS16-059


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

<application run="file:///\\127.0.0.1\c$\programdata\cpl.lnk"/>
复制代码

因为微软对UNC作出了拦截,攻击者使用了file:///来绕过过滤。同时,微软也对传递的文件后缀进行了拦截,因此作者又传入了lnk(快捷方式)文件进行了绕过。

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

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

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


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

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

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

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

#!bash
0:025> bp kernel32!CreateFileW
0:025> g
Breakpoint 0 hit
kernel32!CreateFileW:
00000000`779b1b88 ff2522b90700    jmp     qword ptr [kernel32!_imp_CreateFileW (00000000`77a2d4b0)] ds:00000000`77a2d4b0={KERNELBASE!CreateFileW (000007fe`fd944600)}
0:000> dqs esp
00000000`0021e108  00000000`779a0dad kernel32!CreateFileWImplementation+0x7d
00000000`0021e110  00000000`80000000
00000000`0021e118  00000000`00000000
00000000`0021e120  00000000`0000006c
00000000`0021e128  00000000`0039d2e0
00000000`0021e130  00000000`00000003
00000000`0021e138  00000000`00100000
00000000`0021e140  00000000`00000000
00000000`0021e148  00000000`00000000
00000000`0021e150  00000000`00440042
00000000`0021e158  00000000`03a7ed88
00000000`0021e160  00000000`00100000
00000000`0021e168  000007fe`f116bec7 mscorwks!DoNDirectCall__PatchGetThreadCall+0x7b
00000000`0021e170  00000000`00000000
00000000`0021e178  00000000`0021e1d0
00000000`0021e180  00000000`00000003
0:000> du 00000000`03a7ed88
00000000`03a7ed88  "C:\Users\BlastTS\Desktop\test.mc"
00000000`03a7edc8  "l"
复制代码

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

#!bash
# Child-SP          RetAddr           : Args to Child                                                           : Call Site
00 00000000`0021e108 00000000`779a0dad : 00000000`80000000 00000000`00000000 00000000`0000006c 00000000`0039d2e0 : kernel32!CreateFileW
01 00000000`0021e110 000007fe`f116bec7 : 00000000`00000000 00000000`0021e1d0 00000000`00000003 000007fe`f0331830 : kernel32!CreateFileWImplementation+0x7d
*** WARNING: Unable to verify checksum for C:\Windows\assembly\NativeImages_v2.0.50727_64\mscorlib\c3beeeb6432f004b419859ea007087f1\mscorlib.ni.dll
02 00000000`0021e170 000007fe`f0207f71 : 000007fe`f0331830 000007fe`eff69210 00000000`03a7ee70 000007fe`f0287aea : mscorwks!DoNDirectCall__PatchGetThreadCall+0x7b
03 00000000`0021e230 000007fe`f0207e2e : 00000000`03a7edd8 00000000`03a7edd8 00000000`03a7ee00 000007fe`f0288e86 : mscorlib_ni+0x317f71
……………………………………………………
17 00000000`0021f3b0 000007ff`00250222 : 00000000`02681eb0 00000000`02681f30 00000000`0021f4a0 00000000`0021f060 : 0x7ff`00252817
18 00000000`0021f5b0 000007fe`f116a21a : 40ca06f5`582e02ef bdb2bd08`2c45789a 00000000`00000000 00000000`00000000 : 0x7ff`00250222
19 00000000`0021f5e0 00000001`3f7e161b : 00000000`01e10020 00000000`003bcfa8 00000000`0021f6a0 00000000`00000000 : mscorwks!UMThunkStubAMD64+0x7a
1a 00000000`0021f670 00000001`3f7e153a : 00000000`00312462 00000000`00000000 00000000`003283c0 00000000`01e10020 : ehshell!LaunchMediaCenter+0x14e
1b 00000000`0021f6c0 00000001`3f7e148d : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ehshell!wWinMain+0xc3
1c 00000000`0021f920 00000000`779a59ed : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ehshell!InitializeCOMSecurity+0x382
1d 00000000`0021f9e0 00000000`77adb371 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : kernel32!BaseThreadInitThunk+0xd
1e 00000000`0021fa10 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!RtlUserThreadStart+0x1d
复制代码

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

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

#!csharp
namespace MediaCenter.Extensibility
{
……
public ExtensibilityEntryPointInfo AddExternalAppEntryPoint(string strRun,string strTitle, string strDescription, string strCategory, object objContext,string strNowPlayingDirective)
{
IDictionarydictEntryPoint = CreateBaseEntryPointDict(Guid.NewGuid(), strTitle,strDescription, strCategory, objContext, strNowPlayingDirective);
dictEntryPoint[Run] = strRun;
return this.AddEntryPoint(dictEntryPoint);
}
复制代码

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

#!csharp
namespace MediaCenter.Extensibility
{
………………internal classExtensibilityExternalAppEntryPointInfo : ExtensibilityEntryPointInfo{
………………internal override LaunchResult Launch(ref object objState)
{
………………
Process process = null;
try
{
process = Process.Start(base._strRun);
}
catch (Exception exception)
………………
复制代码

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


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

0x06 十年以上的漏洞


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

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

#!html
<application
name = "Zsnes"
SharedViewport = ""
NowPlayingDirective = ""
run = "C:/Zsnes/Zsnes.exe">
<capabilitiesrequired
directx="True"
audio="False"
video="False"
intensiverendering="True"
console="False"
cdburning="False" />
</application>
复制代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255269.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SCARA机器人与 DELTA机器人

1、SCARA机器人SCARA&#xff08;Selective Compliance Assembly Robot Arm&#xff0c;中文译名&#xff1a;选择顺应性装配机器手臂&#xff09;是一种圆柱坐标型的特殊类型的工业机器人。1978年&#xff0c;日本山梨大学牧野洋发明SCARA&#xff0c;该机器人具有四个轴和四个…

一直以来都没直视的轮播-_-

一直以来做项目碰到轮播图我都是去网站上找现成插件拿来用&#xff0c;现成的插件1是省时间&#xff0c;拿来改改尺寸改改参数就能直接用&#xff0c;2是现在的插件确实很强大&#xff0c;对于我一个刚刚学习前端的人来说&#xff0c;牛人写的轮播我看懂也要花些功夫&#xff0…

HALCON示例程序circles.hdev边界轮廓的圆形拟合

HALCON示例程序circles.hdev边界轮廓的圆形拟合 小哥哥小姐姐觉得有用点个赞呗&#xff01; 示例程序源码&#xff08;加注释&#xff09; 读入图片 read_image (Image, ‘double_circle’)窗口初始化 dev_close_window () get_image_size (Image, Width, Height) dev_open…

asp.net 微信企业号办公系统-流程设计--保存与发布

如果流程未设计完时可以先保存&#xff0c;以后再打开接着设计。点击工具栏上的保存按钮即可保存当前流程设计: 如果下次要接着设计&#xff0c;则可以打开该流程继续设计&#xff1a; 如果流程设计完成&#xff0c;可以点击安装按钮来发布流程&#xff0c;流程安装成功后即加入…

search-guard 在 Elasticsearch 2.3 上的运用

uni3orns 2016/06/23 11:09Author&#xff1a;uni3orns参考内容&#xff1a;kibana.logstash.es/content/ela…groups.google.com/forum/#!for…github.com/floragunnco…此文章基于以下软件版本&#xff0c;不同版本可能略有差异&#xff1a;elasticsearch 2.3.3search-guard…

HALCON示例程序class_2dim_sup.hdev使用二维像素分类对图像进行分割

HALCON示例程序class_2dim_sup.hdev使用二维像素分类对图像进行分割 示例程序源码&#xff08;加注释&#xff09; 定义Interactive并赋值&#xff0c;0&#xff1a;固定框&#xff1b;1&#xff1a;手工绘制框。 Interactive : 0 读入图片 read_image (Image, ‘ic’) 关闭…

sys

sys.argv 命令行参数List&#xff0c;第一个元素是程序本身路径 sys.exit(n) 退出程序&#xff0c;正常退出时exit(0) sys.version 获取Python解释程序的版本信息 sys.maxint 最大的Int值 sys.path 返回模块的搜索路径&#xff0c;初…

修改环境变量

在path变量后添加&#xff0c;对变量长度无限制&#xff0c;需要重启后生效reg add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_SZ /d "%path%;c:\newpath;whatever" /freg save "HKLM\SYSTEM\CurrentCont…

Canny边缘检测算法原理及其VC实现详解(二)

3、 Canny算法的实现流程 由于本文主要目的在于学习和实现算法&#xff0c;而对于图像读取、视频获取等内容不进行阐述。因此选用OpenCV算法库作为其他功能的实现途径&#xff08;关于OpenCV的使用&#xff0c;作者将另文表述&#xff09;。首先展现本文将要处理的彩色图片。 …

IDEA注册jar包使用和常用插件

IDEA注册jar包使用 点击获取下载地址或生成注册码 一、安装完成后&#xff0c;先不启动&#xff0c;首先如下图修改相关的地方。 二、启动IDEA&#xff0c;并且激活IDEA IDEA插件仓库 IntelliJ IDEA Plugins 一、Maven Helper 我一般用这款插件来查看maven的依赖树。在不使用此…

HALCON示例程序class_2dim_unsup.hdev基于二维直方图的聚类分类

HALCON示例程序class_2dim_unsup.hdev基于二维直方图聚类分类的颜色分类 示例程序源码&#xff08;加注释&#xff09; 读入图片 read_image (Image, ‘patras’)关闭窗口 dev_close_window ()得到图片尺寸大小 get_image_size (Image, Width, Height)打开窗口 dev_open_wind…

Android Monkey压力测试

一. JAVA环境的搭建 安装jdk-8u151-windows-x64,可以到官网或者应用中心下载.JAVA环境变量的搭建: 在"我的电脑"-"属性"-"高级"-"环境变量"中,点击新建,填写变量名为JAVA_HOME,变量值为JAVA安装的路径.在系统变量中找到Path,点击编辑,…

bzoj 4517: [Sdoi2016]排列计数

4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 637 Solved: 396[Submit][Status][Discuss]Description 求有多少种长度为 n 的序列 A&#xff0c;满足以下条件&#xff1a;1 ~ n 这 n 个数在序列中各出现了一次若第 i 个数 A[i] 的值为 i&#x…

idea compare功能 之一次bug修复

一次bug修复 最近开发完了一套单点系统&#xff0c;jenkins打包上传到服务器就出问题&#xff0c; 可以启动但是不能正常工作。 首先想到的是环境不一样&#xff0c; 于是把jenkins的jdk和maven都调整和本机大版本相同。 当然肯定是没卵用的&#xff0c; 于是查看日志 Class pa…

黑白CCD成像不理想,如何补色

黑白CCD成像不理想&#xff0c;如何补色

HALCON示例程序class_ndim_box.hdev基于多通道图像的分类

HALCON示例程序class_ndim_box.hdev基于多通道图像的分类 示例程序源码&#xff08;加注释&#xff09; 读入图片 read_image (Image, ‘ic’)创建一个新的分类器 create_class_box (ClassifHandle)获取图片大小 get_image_size (Image, Width, Height)关闭窗口 dev_close_wi…

gcc编译系统

一、 C语言编译过程 C语言的编译过程可分为四个阶段&#xff1a; 1、预处理&#xff08;Preprocessing&#xff09; 对源程序中的伪指令&#xff08;即以#开头的指令&#xff09;和特殊符号进行处理的过程。 伪指令包括&#xff1a;1&#xff09;宏定义指令&#xff1b; 2&…

自制反汇编逆向分析工具 迭代第六版本 (五)

本工具从最初版的跳转分布图只为了更直观地分析反汇编代码的分支结构&#xff0c;第三版开始对直观图进行逆向分支代码的输出&#xff0c;第四版对分支输出策略的一些探索&#xff0c;第五版结合之前的探索进行改进。第六版在现在功能的基础上进行增强&#xff0c;利用第六版&a…

模型搜索 及 轮廓搜索 的原理

模型搜索 及 轮廓搜索 的原理

Linux中设置vim自动在运算符号两边加上空格

vim中设置自动在-之类的运算符号左右两边加上空格。原版的vim不带这个功能&#xff0c;写出的代码例如zxy&#xff0c;不美观&#xff0c;很多编译器&#xff08;如VS&#xff09;能够自动在符号两边加上空格&#xff0c;如z x y&#xff0c;看起来比较美观。 只要在.vimrc里…