本月微软的“星期二补丁”如约而至,其中就包括MS15-004补丁,修复了一个可能导致特权提升的漏洞(CVE-2015-0016),这是一个非常罕见的针对IE沙箱的漏洞,趋势科技的研究员对这个漏洞进行了详细的分析。
漏洞在TSWbPrxy.exe模块中,TSWbPrxy.exe是一个ActiveX控件,是微软远程桌面服务网络代理的程序。
首先,我用IDA插件patchdiff2查看补丁所作的修改,修改的是函数CTSWebProxy::StartRemoteDestop。
我用OleView加载了TSWbPrxy.exe,查看CTSWebProxy::StartRemoteDestop的定义。
StartRemoteDesktop的定义
我发现StartRemoteDesktop有两个参数,都和mstsc.exe有关,这个mstsc.exe就是远程桌面程序。
bstrMstsc: mstsc.exe的文件路径
bstrArguments: mstsc.exe的参数
StartRemoteDesktop函数创建进程启动mstsc.exe。我使用了IDA插件更加仔细地检查打过补丁版本和未打补丁的区别:
打过补丁版本和未打补丁的区别
左图是打过补丁的版本,右边是没有打过的。左图显示在调用CreateProcessW之前,首先会调用check_path函数(灰色部分),而未打补丁的版本没有调用这个函数。
那我们来仔细看看这个函数:
check_path代码
函数中有一个参数(lpApplicationName),函数执行过程如下:
首先检查lpApplicationName的长度,如果大于0x104,返回错误0x80075007。
对lpApplicationName进行格式化,将字符‘/’转换为‘\’,将结果保存至var_formatApplicationName。
调用CompareStringW对SystemDirectory + “mstsc.exe”与var_formatApplicationName进行比较,如果两者相同,check_path返回”0″。
调用CompareStringW对SystemWow64Directory + “mstsc.exe”与var_formatApplicationName进行比较,如果两者相同,check_path返回”0″,否则返回0x80075007错误。
我们看一看出微软是如何修复漏洞的。程序会检查lpApplicationName的值是否与远程桌面程序在系统文件夹(对于32位版本的系统是C:\Windows\System32,对于64位是C:\Windows\SysWOW64)中的路径相同。如果二者相同,就会创建进程,否则会返回错误。
漏洞的原理很简单:StartRemoteDesktop函数的功能应该是启动远程桌面程序mstsc.exe,但执行这一程序时没有检查lpApplicationName参数,这就意味着攻击者可以通过修改lpApplicationName参数启动其他任意的进程。
下面是未打补丁版本的代码
未打补丁版本的代码
绕过IE的沙箱
为了绕过IE的沙箱,我们先得知道沙箱的提升策略是怎样的。提升策略决定进程怎么启动,以什么特权级别启动,这些都储存在注册表项中:
HKLM\Software\Microsoft\Internet Explorer\Low Rights\ElevationPolicy\{GUID}
注册表项中有如下几个值:
AppName: 程序执行名称
AppPath: 程序路径
Policy: 程序的特权级别
不同的特权级别
对于特权级别为3的进程,IE沙箱会以中等完整性级别(当前用户的权限)运行这个进程。
而TSWbPryx.exe的特权级别正是3。
TSWbPryx.exe的注册表项
攻击者可以利用另一个漏洞通过IE运行任意代码,但前面说过,由于IE的沙箱机制,代码可能被限制为在较低的完整性级别(权限非常有限)运行,攻击者随后可以利用此漏洞导致任意代码在中等完整性级别(当前用户的权限)运行。攻击者可以用TSWbPrxy ActiveX控件调用StartRemoteDesktop,攻击者就可以较高权限运行某些程序,如,它的父进程TSWbPrxy.exe。
我们可以将这个漏洞与CVE-2014-6332配合使用,这样就可以绕过IE沙箱,以中等完整性级别运行程序。
另外,我们也可以使用CVE-2014-6332绕过ActiveX的安全机制。也就是说IE不会显示像下图这样的窗口,而是直接运行这些控件。
最终结果就是攻击者可以以中等完整性级别运行某些程序,如下图所示
以中等完整性级别运行计算器
文章来源:Freebuf黑客与极客(FreeBuf.COM)