CVE-2016-3353:IE浏览器.URL 文件安全特性绕过 (MS16-104)
前言
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类:
知道CInternetShortcut类负责参与.URL文件的处理,现在我们可以在ieframe.dll的旧版本和新版本之间执行二进制文件比较了,要特别留意属于CInternetShortcut类方法的修改。
二进制文件差异对比
在IDA Pro中加载和分析这两个补丁版本之后的ieframe.dll,我们可以使用IDA插件BinDiff来显示两个数据库的差异,通过递增相似性对BinDiff中的匹配函数进行排序,我们可以看到CInternetShortcut类具有显著变化的第一个方法是
CInternetShortcut :: InvokeCommand CMINVOKECOMMANDINFO *),相似比为0.84。
当比较所述方法的流程图时,我们可以确定这确实是一个使用了安全修复的函数。
新的(已修复)版本包括在调用CInternetShortcut :: _ InvokeCommand之前的附加检查,如果我们深入到屏幕的右侧部分(修补版本),我们可以看到已添加的检查:
如果CL寄存器为0,那么CInternetShortcut :: _ InvokeCommand方法将照常调用,但是,当CL!= 0时,函数将调用CDownloadUtilities :: OpenSafeDialog,如果用户接受安全警告询问时,则调用CInternetShortcut :: _ InvokeCommand。
因此,我们继续确定CL寄存器的值设置在哪里:
从该代码段,我们可以得出结论,当处理的文件具有.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(在已修复版本,只有在额外的安全检查后才会调用该函数)。
该函数调用CInternetShortcut :: CExecHelper :: Init,它初始化了一个SHELLEXECUTEINFO[7]结构,然后调用CInternetShortcut :: CExecHelper :: ResolveProtocol以验证在.URL文件的URL键中指定的协议是否在当前计算机中正确注册。
前言
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类:
知道CInternetShortcut类负责参与.URL文件的处理,现在我们可以在ieframe.dll的旧版本和新版本之间执行二进制文件比较了,要特别留意属于CInternetShortcut类方法的修改。
二进制文件差异对比
在IDA Pro中加载和分析这两个补丁版本之后的ieframe.dll,我们可以使用IDA插件BinDiff来显示两个数据库的差异,通过递增相似性对BinDiff中的匹配函数进行排序,我们可以看到CInternetShortcut类具有显著变化的第一个方法是 copyright 无奈人生
CInternetShortcut :: InvokeCommand CMINVOKECOMMANDINFO *),相似比为0.84。
当比较所述方法的流程图时,我们可以确定这确实是一个使用了安全修复的函数。
新的(已修复)版本包括在调用CInternetShortcut :: _ InvokeCommand之前的附加检查,如果我们深入到屏幕的右侧部分(修补版本),我们可以看到已添加的检查:
如果CL寄存器为0,那么CInternetShortcut :: _ InvokeCommand方法将照常调用,但是,当CL!= 0时,函数将调用CDownloadUtilities :: OpenSafeDialog,如果用户接受安全警告询问时,则调用CInternetShortcut :: _ InvokeCommand。 内容来自无奈安全网
因此,我们继续确定CL寄存器的值设置在哪里:
从该代码段,我们可以得出结论,当处理的文件具有.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(在已修复版本,只有在额外的安全检查后才会调用该函数)。
该函数调用CInternetShortcut :: CExecHelper :: Init,它初始化了一个SHELLEXECUTEINFO[7]结构,然后调用CInternetShortcut :: CExecHelper :: ResolveProtocol以验证在.URL文件的URL键中指定的协议是否在当前计算机中正确注册。
无奈人生安全网
无奈人生安全网