windows 打开exe传参_Windows联系人文件代码执行漏洞分析

背景

    1月28日,Twitter上一名为xxByte的安全研究人员公布了一个代码执行POC[1],通过构建Windows联系人文件(.contact文件)并内嵌HTML执行代码,相关推文如下图所示。

8737a29cf5ee8e8946e8ebb00c9dfba9.png

    而该漏洞实际最早由hyp3rlinx披露[2]。

攻击复现

   360威胁情报中心随后对公开的POC细节进行进一步分析,并尝试复现其攻击利用过程。

Windows联系人文件

    Windows联系人[3]是WindowsVista,Windows 7,Windows 8和Windows 10中包含的联系人管理器。它取代了但保留了Windows通讯录的大部分功能,并与Windows Live Mail和Vista版本的Windows Mail一起使用。

    WindowsContacts使用基于XML的架构格式。每个联系人都显示为单独的.contact文件,其中可以存储包括图片在内的自定义信息。Window Contacts具有可扩展性 API,可与其他应用程序集成并存储自定义信息。其还支持传统* .wab格式和开放标准* .vcf(vCard)和* .csv(CSV)。

   .contact文件在上述版本的windows系统中都存在,如当前登录用户的.contact文件就位于对应用户的联系人目录下。

97071dd38b02107df308b4fa67f931fb.png

    双击.contact文件后如下,其实际内容为XML格式文件。

7051591c57ed70ec78217d43ebb64115.png

1f71b2a18537a319f21fc660601a559e.png

    按公开的POC中在其中“姓名及电子邮件”标签下将电子邮件修改为pwn@microsoft.com,再双击打开如下所示。

76db7890e4c2edb7b8cad971a97c1e89.png

    对此,当将电子邮件修改为其他邮箱,这里如pwn@sina.com时。

fa3d62dc5efba34c01e30af2b7b5e49c.png

    修改后双击打开如下所示,在“摘要”中电子邮件部分显示了设置的邮件地址,并且其邮箱地址识别为链接,当点击邮箱地址后,计算器执行并弹出。

b4df6baf8dba7bc9a40584b93cefb89c.png

    这里我们注意到原推文中的POC使用microsoft.com邮箱并未显示如上所示的效果,推测可能是微软实现逻辑的问题。

    虽然这里POC展示的只是执行了计算器,但除了邮箱标签之外,web站点标签也是可以触发的。

VCF文件利用

    而hyp3rlinx在两周前还披露了一个利用VCF文件的代码执行漏洞,与上述利用.contact文件漏洞一致,但是该漏洞报给微软后,微软同样不认为这是一处漏洞,但是ZDI却给了漏洞编号。

c478b6f5a25cdc22faf831b5de1075f0.png

    由于在Windows系统中默认并不存在.vcf文件,这里展示如何构造利用漏洞的VCF文件过程。

    在Outlook下,新建一封邮件,在主题中插入选择名片。

6102e718eb278f2a3889fd91189f8f4c.png

如果是第一次使用,名片列表实际上是空的,选择联系人,建议联系人。

90429d04ab9fb16dd983c7ef943c347a.png

    这里可以看到两个推荐的联系人。

d10589f1b7b1d5321250d3b889d60ba8.png

    选择之后,附件上就自动附加上了一个vcf文件,右键复制。

7ed80e503dc0f0fea6fb2c388cf003f3.png

    粘贴保存到桌面

11f9658dbd5c7f8fadfae506c456188d.png

    点击之后打开,可以看到和之前的.contact文件几乎一样,但是这里需要注意的是这种方式保存的vcf文件在UI界面下是不可编辑的。

22888d855a8d4d9b7f6d21f630535ac9.png

    直接通过编辑器将邮箱地址修改为之前的POC。

1cb578000d454b629084d5609aa43450.png

    可以看到效果和.contact利用方式一致,点击后弹出计算器。

ac2699d031f07f38d917bfad0fa56ef2.png

原理分析

    通过Windbg可以看到.contact文件实际上是通过wab.exe起起来的,传入对应的.contact文件路径参数。

e0e62e85237f511f157ccf6fafc2a906.png

    同理可以看到.vcf也是通过该wab.exe启动的,这两种启动执行逻辑基本一致,这里以.contact文件打开流程为例。

    具体的调用如下所示,wab.exe直接加载wab32.dll对文件进行处理,主要的功能在wab32.dll中,最终在fnSummaryProc中响应用户的点击动作。

cea2ea83426e6bfb84e310dc768945ac.png

    可以看到传入的switch分支条件为0xfffffffe,进入到对应的default分支中,该分支调用函数SafeExecute。

378a408a09f54e0937caf5c0cefb86fd.png

   SafeExecute的第三个参数即为我们构造POC中的注入命令(此处为calc.exe)。

83ab2bd19c890d321b1e0c9f28328497.png

    SafeExecute如下所示,从代码来看这个函数是用于执行URL,但是其中似乎并没有对传入的URL进行校验。

9d76b0e76e04ec7a20fb3280bd8b9d50.png

    其中UrlCanonicalizeW传入的第一个参数为插入的URL命令(这里为calc.exe),并返回第二个参数pszCanonicalized。

2d0ad876b591f4853adc8d34abf324ed.png

UrlCanonicalizeW内部似乎未对URL命令字符串进行校验。

ee8245bc0c9de20acbbfb805dfae1671.png

但是需要注意的是传入绝对文件路径的话UrlCanonicalizeW是会检测的,如下所示此时绝对路径返回之后将导致路径前附加上file:,从而在之后的UrlIsW函数中返回不同的结果,进入另外的分支流程,在错误的分支流程中会判断对应的参数是否是目录,如果不是目录则不会执行(即参数的构造上不能依赖于绝对路径),但是这里需要说明的是虽然绝对路径无法使用但是子目录及目录遍历的方式是可以使用的,如..\\virus\\2.exe,virus\\2.exe都是没有问题的。

ab00c27ceebf18fd7bdeab60a2bf1044.png

    而正常传入calc.exe时,从下图可以看到UrlCanonicalizeW调用返回的pszCanonicalized参数直接被设置为calc.exe。

0f9e03dfb9c625756faa790f7fcf847c.png

    之后通过ShellExecuteExW执行URL中的内容。

09bed8af567020e78b30befc3fa897d8.png

Vcf类型的执行流程一致。

6e6422193cd6769bb71b0590f1289fc9.png

利用尝试

鱼叉邮件

    结合这个漏洞的效果,我们首先想到了通过鱼叉邮件的方式进行利用,如下所示投递一个vcf文件

649882b0e663b37b2047662a1608c4a2.png

    如果利用鱼叉邮件投递构造的恶意的VCF文件,可以看到VCF文件在不下载的情况下,点击之后如下所示,其对应的POC信息直接暴露了,且在outlook中无论如何点击都无法触发执行计算器。

c0c839b6d014b991ee0698b54229df4b.png

    若利用鱼叉邮件投递构造的.contact文件,可以看到直接点击附件中的contact文件,确认后直接打开,此时点击对应的邮箱,代码执行,且全程POC代码没有暴露,因此contact的利用似乎要比vcf效果要更为理想。

65d90b0753dbb4e94513fcacf114d375.png

但是事实并非如此,由于此处代码执行由shellexecutexw导致,shellexecutexw本身的问题在于调用系统中的exe时,并不能传入任何参数,如下所示为ipconfig /all时直接报错。

7cb74f870e76ceaf8e9eb500cf1e8f0e.png

如下所示可以看到shellexecutexw中参数和执行路径是分离的。

b7d19c4587e7cd7ef1f8aa2a71967353.png

从调试器也可以看到实际上href中的值,包括参数是可以完整传入的。

87f22756a8e6fc2720df1a2afddb10d3.png

但是这样的带参数的字符却并不复合shellexecutexw的参数要求,因此会报错。

2998aeae1a5d686bbd230dc03ad39b20.png

由于shellexecutexw本身也支持http等协议,因此我们想到是否可以远程加载恶意文件,但是这条路也是不可行的,支持http协议并不意味着可以直接代码执行,如下所示:

Ie8下。

890d795ba96948146816c88f47024724.png

Chrome下

6bf942318e75516c61e3853a1e78cf00.png

由上所诉可知,虽然我们可以调用系统中的任意程序,但是却无法向程序传递对应的参数,这就导致包括powershell在内的很多攻击方式无法奏效,如果无法传参,我们就需要考虑在目标系统上直接部署恶意代码的问题,但是这一问题却不是那么容易处理的,毕竟通过单一的鱼叉邮件很难在用户不感知的情况下进行部署。

Cpl利用方式

Cpl的利用方式来自于hyp3rlinx文章,CPL文件解释如下:

3d68b784be3e07aff025ef9414ec908e.png

即通过加载.cpl文件的方式运行恶意代码,如下图所示

  1. vcf文件中网站域被设置为http.\\test.cpl,注意http之后的冒号去掉也是可以的(UrlCanonicalizeW对于该类型的参数并不会检测)

  2. 在vcf文件当前目录创建http目录(目录名可换)

  3. 在http目录下放置编译好的恶意测试dll,dll被修改为test.cpl1    

  4. 点击恶意测试dll加载运行

6dd4d0adecc882b5e1c8f1dfed0b7f08.png

但是该方式同样面临之前提到的问题,cpl文件如何部署?

鱼叉邮件+压缩包

这里很自然的想到相关的部署方式是通过鱼叉邮件+压缩包的方式进行投递。

a6886406cce24b8f94212814e5075e14.png

但是这样的方式也是不可行的,在理想情况下受害者直接点开附件压缩包,点击联系人文件,点击对应邮箱之后漏洞无法触发,主要原因是不同于压缩包中附加exe的方式,exe在压缩包点击之后,对应压缩包文件会被解到tmp目录下,而联系人文件点击之后压缩包并不会默认解压,从而导致联系人文件中的exp无法找到对应的http目录下的载荷(当然用户直接下载,解压再运行联系人文件也是可行的,但是交互要求过高)。

96319dbf484793faafe0029b010cca59.png

Smb共享

该方式是twitter上的人提出的,但是该方式同样有问题,一般的文件共享如下所示

\\WIN-EOBT1L0G3TQ\share\1.exe.但是该路径会被函数UrlCanonicalizeW处理,因此也无法成功,同时该攻击方式是基于获取到内网一台主机权限之后的钓鱼,实在是比较鸡肋。

9adccb10e269c5bd827cb6dafc592e42.png

总结

    此报告中分析的漏洞是通过构造带有恶意代码的联系人文件(.contact或.vcf),而联系人功能是作为人与人间的社交关系和通信录使用的。

结合对漏洞利用过程的复现效果,从目前来看该漏洞的利用要求过高,主要体现在以下两方面:

  1. 启用指定程序时无法传入参数,这导致类似powershell一系列的攻击方式无法使用

  2. 在无法指定参数的情况下,类鱼叉攻击中无法通过低交互的方式部署相关的恶意软件

基于以上两点也能看出为什么微软没有对这系列的问题给出指定的cve。

参考链接

1. https://twitter.com/xxByte/status/1089214985438457865

2.http://hyp3rlinx.altervista.org/advisories/MICROSOFT-WINDOWS-VCF-FILE-INSUFFICIENT-WARNING-REMOTE-CODE-EXECUTION.txt、

3.http://hyp3rlinx.altervista.org/advisories/MICROSOFT-WINDOWS-CONTACT-FILE-HTML-INJECTION-MAILTO-LINK-ARBITRARY-CODE-EXECUTION.txt

4. https://en.wikipedia.org/wiki/Windows_Contacts

5.https://blog.csdn.net/yangyang031213/article/details/64121915

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值