前言
Office办公软件内有一个名为“EQNEDT32.EXE”的公式编辑器组件,该组件存在多个隐藏了17年之久的远程代码执行漏洞,黑客可以在office文档中嵌入恶意的公式数据发起攻击,用户打开恶意文档就会中招,因此我们将该系列安全漏洞命名为“噩梦公式”漏洞。360核心安全事业部高级威胁应对团队持续跟踪和关注该漏洞的进展,在全球范围内率先截获了“噩梦公式”0day漏洞的在野攻击,并向微软报告了漏洞细节,助力微软修复该漏洞,同时为网民全面拦截利用该漏洞的攻击。在“噩梦公式”漏洞爆发后,我们对黑客攻击的样本进行了持续的监控,发现该攻击在全球范围内呈爆发性增长,本文将对目前流行的Office“噩梦公式”漏洞利用样本进行了整理分析,让各安全厂商和相关用户了解该漏洞在野攻击的真实情况。
在野样本首次捕获时间
目前,在野利用的“噩梦公式”漏洞主要是CVE-2017-11882、CVE-2018-0802和CVE-2018-0789三个漏洞,样本的首次捕获时间线大致如下:
- 2017年11月21日,在漏洞细节曝光后,捕获首例在野利用的CVE-2017-11882样本
- 2017年12月14日,开始出现绕过ASLR地址随机化的0day样本,捕获的样本使用了CVE-2017-11882/CVE-2018-0802组合漏洞
- 2017年12月19日,捕获了另一例在野攻击的CVE-2018-0802样本,该样本只用了CVE-2018-0802单个漏洞
- 2018年1月16日,开始出现利用CVE-2018-0798漏洞的变种,并捕获一例CVE-2018-0798的测试样本
- 2018年1月19日,捕获两例CVE-2018-0798的在野攻击真实样本,经确认shellcode主体部分和1月16日捕获的测试样本完全一致
代表性样本简要分析
下面我们依次对连续捕获多例利用公式编辑器的代表性样本进行简要分析:
CVE-2017-11882/CVE-2018-0802
2018年1月18日,我们捕获了2个文档诱饵内容包含中国韩国商会的攻击样本,这两个样本分别独立利用CVE-2017-11882和CVE-2018-0802,内容完全一致:
由于网上已有许多对于CVE-2017-11882和CVE-2018-0802漏洞的分析,所以本文不对这两个漏洞的原理进行阐述。如需了解CVE-2018-0802漏洞的具体细节可以参考我们团队之前写的文章(http://www.freebuf.com/vuls/159789.html)。
该漏洞触发后的payload部分比较简单,只是简单启动一个叫做v3ah.exe的进程,因此shellcode部分无需详细展示。本文不对payload部分作详细讨论。该样本在我们的平台跑出的进程链如下:
2018年1月22日,我们又捕获2个诱饵内容包含比特币主题的韩文漏洞文档,诱饵及payload完全相同,但分别独立利用CVE-2017-11882和CVE-2018-0802漏洞进行攻击:
这两个样本在我们的平台跑出的进程树如下,可以看到payload名称与1月18日捕获到的样本一致(但md5不同):
CVE-2018-0802
2018年1月19日,我们捕获一个诱饵内容为关于智能手机用户的安全建议的漏洞文档,该样本单独利用CVE-2018-0802:
该样本在我们的平台跑出的进程树如下:
CVE-2018-0798
2018年1月19日,我们捕获一个CVE-2018-0798漏洞的在野利用样本,内容为关于海洋监视网络的调查问卷。
该样本在我们的平台跑出的进程树如下:
有趣的是,在这之前的1月16日,我们已捕获过一个CVE-2018-0798的在野测试样本。下面我们结合修改过的测试样本对CVE-2018-0798漏洞进行简要分析。
CVE-2018-0798漏洞正是国外安全厂商checkpoint在本月公开的另一个“CVE-2018-0802”漏洞,经确认,checkpoint文章中所谓的“CVE-2018-0802”其实是CVE-2018-0798。由于微软的工作失误,把checkpoint提交的CVE-2018-0798错误归类到了CVE-2018-0802,引起了国内外分析人员的广泛讨论。
CVE-2018-0798的根本原因是office公式编辑器在解析Matrix Record(0x05)的内容时,解析到rows与cols成员时没有进行额外的长度校验,通过构造恶意数据,可以任意指定后面读入的row_parts和col_parts长度,从而导致栈溢出(如下图所示):
相关调用点位于ParseMatrixRecord(sub_443E34)函数内,其中发生溢出的是高亮的ReadPartLineTypes(sub_443f6c)函数
由于在拷贝数据到栈上时没有对v4进行长度校验,导致v2为null时才会停止拷贝,通过精心构造数据,就可导致栈溢出,从而覆盖eip,控制执行流。
我们捕获的原测试样本在触发漏洞后,会启动PowerShell远程下载一个正常的notepad.exe并启动,虽然由于测试者写的代码有问题,最终notepad.exe并没有下载下来,启动的是系统自带的notepad.exe。这是攻击者的测试样本在我们平台上跑出的进程树:
分析时我们略微改造了这个样本的shellcode,使之启动一个计算器。下面结合改造过的样本对其shellcode进行分析。
触发CVE-2018-0798的关键部分如下图蓝色高亮部分所示:
对上图中的字节码逐一进行解释:
这段shellcode比较有意思的一点是直接定位到了读入OLE数据的全局堆数据,整个执行流程为:漏洞触发->栈上的shellcode ->堆上的shellcode->启动恶意进程。
显然,如此精妙的shellcode肯定是被精心设计的,所以自从捕获测试样本后,我们也一直在等待攻击样本的出现,在1月19日,我们果然捕获两个利用CVE-2018-0798的攻击样本。
从下图的对比可以看到,攻击样本和测试样本除了命令行参数不同外,其余字节完全相同,明显是同一团伙所为(上半部分为1月19日的攻击样本,下半部分为1月16日的测试样本):
不过,需要指出的是,我们捕获的在野CVE-2018-0798样本都只针对未开启ASLR的公式编辑器版本,目前我们尚未发现能绕过ASLR的该漏洞在野样本。
攻击利用手法演进分析
在观察到的形形色色的利用公式编辑器进行攻击的样本中,我们还观察到一些高级技巧,在这里我们也一并总结一下。
1. Mshta远程执行代码利用
利用mshta去启动远程hta文件其实已司空见惯,之前的CVE-2017-0199和CVE-2017-8759已经将这一技巧用烂。
我们的平台于2018年1月18日捕获一个日文诱饵内容的样本,该样本同时利用了CVE-2017-11882和CVE-2018-0802漏洞。样本标题为“必要部数的调查”,打开后界面如下:
该样本为docx格式,组织相对简单,在\word\embeddings下含两个ole对象:一个利用CVE-2017-11882,一个利用CVE-2018-0802。
两个ole的shellcode部分基本一致,也相当简单,获取WinExec地址后,传入参数去启动一个远程的hta文件,如下所示:
2. PowerShell远程执行代码利用
利用powershell去下载、启动远程文件也已经很常见了,现在已经开始有样本在尝试文件不落地。这里介绍2个我们捕获到的,攻击我国一些商业公司的样本。两个样本都只利用了CVE-2017-11882。
第一个样本为2018年1月3日捕获,邮件信息如下:
可以看到该邮件的原始发送日期为2017年11月30日,主题为“财务报销注意事项”,附件打开后并没有什么引人关注的诱饵,引起我们注意的是它的powershell命令。首先,该样本的进程树如下:
我们很好奇这段加密的base64代表什么?于是尝试手动解码。解码完如下:
看来还有一层base64加密,依据代码看解码完是一个gzip文件。再解码之并保存成gzip文件,从压缩包里面提取出文件,打开后如下:
可以看到里面还有第3层base64加密,解密后的数据会被直接加载进内存,然后将内存起始地址直接传给新创建的一个线程,我们将上图中的base64进行解码,保存成二进制文件后用模拟器执行,得到如下结果:
不幸的是,我们分析时服务器已经无法连接,所以我们无从知道后面的流程是什么。
我们在2018年1月17日捕获一个以商业合作模板为诱饵的中文样本,该样本只利用了CVE-2017-11882漏洞,打开后界面如下:
这个样本在我们的平台中跑出的进程树如下:
3. 利用office插件实现驻留
我们在2017年9月抓到CVE-2017-11826在野0day时首次观察到这一技巧,在捕获这次CVE-2018-0802在野0day时再一次观察到这种用法。除了已被我们和其他厂商公开的一些个子外,我们再披露2个利用这一技巧的样本,两个样本均为俄语。
其中一个为我们在2018年1年9日捕获:
另一个在2018年1月12日捕获:
两个样本都会先释放setup.zip文件到temp目录,在触发漏洞后将setup.zip文件拷贝到Word插件目录,这样一来,下次Word启动时payload就会自动执行,具体细节我们已经在之前对CVE-2018-0802的分析中做详细说明。
4. 利用msxsl.exe绕过AppLocker
我们在2018年1月22日捕获到一个诱饵内容是与薪水相关的印度尼西亚文样本,该样本同时内嵌CVE-2017-11882和CVE-2018-0802两个漏洞的利用模块。
该样本为docx格式,打开后需要点击一次对话框才能触发:
将其保存为zip格式,可以看到\word\embeddings目录下内嵌了多个ole对象,具体情况如下图所示:
两个漏洞对应的4个ole的shellcode目的均一致,漏洞触发后首先搜索获取相关函数,拷贝文件到指定目录:
然后展开短路径,接着启动EXCEL.exe进程并传入参数,启动进程后马上退出公式编辑器进程。
所谓的EXCEL.exe其实是微软的msxsl.exe文件,该文件的数字签名已过时。用msxsl.exe配合xml去启动xsl文件的套路并不新颖,网上已有相关分析文章(https://evi1cg.me/archives/AppLocker_Bypass_MSXSL.html ),此处不过多展开。
xsl文件的部分内容如下,代码大体上套用了https://raw.githubusercontent.com/3gstudent/test/master/4.wsc。
令我们感到费解的是,攻击者在1.xml文件中指定的内容xsl文件名为script.xsl,然而从上面的图片中我们看到攻击者的第2参数指定的文件名为1.xsl,这样貌似并不能使xsl文件正确加载起来。
如果文件名正确指定,则1.xsl中的base64加密部分会被解码后以二进制形式直接加载进内存,可以看到解码后里面含有一个PE文件,通过阅读上述xsl代码,可以看到最终会启动MSFShellCodeLoader2函数,函数名已经清楚地解释了它的作用。整个过程文件不会落地。
这个样本释放的另外两个文件:spoolsv.exe和mpsvc.dll,属于白利用。spoolsv.ex是微软打印机相关的一个正常程序,带有合法数字签名,正常启动时它会加载一个正常的mpsvc.dll。而释放的mpsvc.dll为恶意程序,它利用dll路径搜索顺序的先后关系,使之被spoolsv.exe加载,从而实现偷天换日。
不过,在这个样本中,我们没有显式看到这对白利用被加载,但在其他的一些样本,如下面这个我们2017年12月22日捕获的样本中,我们观察到了类似的白利用被加载(spoolsv.exe+vsodscpl.dll)。该样本利用了CVE-2017-11882,主题为面向应用物理学家的调查问卷,打开后界面如下:
该样本在我们平台跑出的进程树如下:
可以看到spoolsv.exe程序被启动,在它的dll加载列表中,就有恶意的vsodscpl.dll:
我们还于2018年1月11日捕获另一个样本,该样本利用了CVE-2018-0802漏洞,诱饵主题是马来西亚时事:
该样本所用手法和上文中印度尼西亚相关样本的手法完全相同,此处不作过多说明。
5. 利用msiexec.exe绕过AppLocker
我们在2018年1月22日捕获的一个样本中观察到了这种技巧。这种技巧在此文(https://pentestlab.blog/2017/06/16/applocker-bypass-msiexec/)中有描述。
该邮件基本信息如下,附件利用了CVE-2017-11882,诱饵内容为贸易相关的俄文样本。
该样本在我们的平台跑出的进程树如下,不过这貌似是个测试。
不过,我们在2018年1月24日又捕获两个利用msiexec.exe的CVE-2017-11882样本,两个样本的诱饵内容都只有寥寥几句话,一个写的是订单事宜,一个写的是银行事宜。这次终于不是测试了,两个样本跑出的行为完全相同,如下,可以看到之前原来测试语句的地方现在已经被远程msi文件所替换。
6. certutil.exe远程执行代码利用
这种方法在这篇文章中有描述(https://evi1cg.me/archives/remote_exec.html ),由上面的分析可以看到,在用CVE-2018-0798 相关样本中用到了这种技巧。同一天我们还抓到另一个利用CVE-2018-0798进行攻击的样本也利用了certutil.exe,第二个样本的进程树如下:
7. 计划任务执行代码
我们在2018年1月16日捕获2个利用计划任务执行代码的公式编辑器攻击样本。
其中一个诱饵内容主题是报告的俄文样本,利用漏洞为CVE-2017-11882,不过文档打开后并没有什么吸引人的画面:
首先,这个样本也在Word插件目录下放置了一个a.wll文件,不过引起我们注意的是它进程链里面创建的计划任务:
用来执行计划任务的js文件使用了混淆代码,截取部分如下。js的具体执行细节这里不做展开。
第二个样本利用的漏洞为CVE-2017-11882,诱饵内容为2018年假期日历:
这个样本的进程树如下所示,红框圈出部分为其创建的计划任务
我们在2018年1月18日又捕获一个利用CVE-2018-0802的样本,主题涉及我国某地方自治区:
该样本的进程树如下,可以看到样本为一个powershell脚本创建了计划任务:
233.ps1文件里面是反弹shell相关语句:
8. 使用bitsadmin进行驻留
2018年1月23日,我们捕获一个同时利用CVE-2017-11882和CVE-2018-0802的样本:
该样本同时利用office插件、bitsadmin两种方式实现驻留,不理解bitsadmin实现驻留方式的可参考这里(https://github.com/3gstudent/bitsadminexec), 并且尝试使用一个老的dll劫持漏洞来实现白利用——CVE-2010-3143(参见这里:https://www.exploit-db.com/exploits/14733/)。
该样本在我们的平台上跑出的进程树如下,可以看到它也同时利用了regsvr32和rundll32作为辅助手段:
总结
黑客利用Office办公软件漏洞实施的网络攻击目前呈爆发性增长,相关攻击的热度将在2018年一直延续。360高级威胁应对团队自公式编辑器相关漏洞出现伊始就对相关样本进行监控。在最近的两个月里,我们不断观察到攻击者在利用公式编辑器系列漏洞进行攻击时演化出来的新技巧和新手法,包括攻击载体的的变化,攻击漏洞的延伸和利用手法的演化。请相关单位和企业加强对该类型攻击的防范,个人用户请安装360安全卫士并及时修复相关漏洞,确保电脑得到有效防护。