某黑产活动使用的沙虫补丁绕过样本

  样本“MONEY GRAM ACTION PLAN FOR OCTOBER- DECEMBER 2018.ppsx”由钓鱼邮件投递,利用了著名的“沙虫”(SandWorm)漏洞补丁的绕过漏洞CVE-2014-6352。沙虫漏洞是OLE包管理INF任意代码执行漏洞,存在于Microsoft Windows服务器上的OLE包管理器,该漏洞影响Win Vista、Win7等以上操作系统,攻击者使用PowerPoint作为攻击载体。通过利用该漏洞可以在OLE打包文件(packer.dll)中下载并执行类似的INF外部文件,从而达到攻击者执行任意命令的目的。微软为沙虫漏洞发布了MS14-060补丁,但通过构造特殊的CLSID和Verb动作,该补丁可以被漏洞CVE-2014-6352绕过。之后微软再次发布MS14-064补丁针对CVE-2014-6352进行了修补。

图 1.1 “CTL+O”打开PPSX漏洞攻击文档后的内容,不会触发Verb播放动作

  解压PPSX文档可以找到“\ppt\slides\ slide1.xml”指定了嵌入OLE对象的id为rId3:

  文档“\ppt\slides_rels\ slide1.xml.rels”指定了rId3对应目录“\ppt\embeddings\”下的oleObject1.bin

  文件“\ppt\embeddings\oleObject1.bin”为嵌入了PE可执行程序的OLE Package对象:

图 1.2 样本嵌入了包含PE的OLE对象

  OLE Package对象的“Olen0Native”流包含了一个完整的PE文件,流开头字符串能看出PE文件在攻击者机器上的原始保存路径“C:\Users\Analiz\Desktop\Target.scr”以及释放的路径“%TEMP%\Target.scr”:

图 1.3 OLE对象包含了完整的PE数据“Target.scr”和原始保存路径信息

  模块packager.dll调用CPackage::Load读入该OLE Package对象时,首先调用ReadClassStg获取OLE复合文档的CLSID判断文件类型,而该样本OLE对象的CLSID: {0003000c-0000-0000-c000-000000000046} :

  CLSID对应着OldPackage类型,因此接着依次调用CPackage::PackageReadFromStream –> CPackage::EmbedReadFromStream –> CopyStreamToFile将流数据拷贝至临时目录具体文件:

图 1.4 OLE对象被判断为OldPackage类型,流数据被读入

图 1.5 OLE对象流数据被写入临时文件“%TEMP%\Target.scr”

  微软为了修补臭名昭著的沙虫漏洞CVE-2014-4114,发布了补丁MS14-060[1],在CopyStreamToFile之后增添了MarkFileUnsafe函数将该临时文件进行MOTW处理[2],将其Security Zone标记为不可信来源,尝试安装运行时会弹出UAC安全警告窗口[3]

图 1.6 方法CPackage::EmbedReadFromStream增添了MarkFileUnsafe标记

图 1.7 “%TEMP%\Target.scr”被标记为不可信

  现在“%TEMP%\Target.scr”已经被释放在临时目录,如果此时我们以双击的方式打开该PPSX样本,自动播放模式将会开启,模块packager.dll的CPackage::DoVerb方法将检查样本指定Verb动作“cmd”的值,将其赋给变量nVerb和nTrueVerb,来决定如何处理嵌入文件“Target.scr”。
  这里常见的利用手法是构造“cmd”值为3,这样就能模拟popup菜单操作执行右键菜单的第二项 “以管理员权限运行”[4],最终调用SHELL32!CDefFolderMenu::InvokeCommand方法执行“Target.scr”。
  然而这里样本“\ppt\slides\ slide1.xml”指定的Verb动作“cmd=0”,独辟蹊径采用了另一条流程:


  调试器中我们也看到此时nTureVerb已被赋值为0,开始执行函数CPackage::_ExecuteAttachment:

  进入CPackage::_ExecuteAttachment我们看到它调用了危险的CPackage::_ActivateEmbeddedFile方法,内部继续调用shdocvw!CAttachmentServices::Execute方法:

图 1.8 “cmd=0”时调用了危险的CPackage::_ActivateEmbeddedFile方法

  shdocvw!CAttachmentServices::Execute调用_OpZoneCheck检查“%TEMP%\Target.scr”的Security Zone标记,最后调用_OpUserTrust弹出UAC安全警告窗口提醒用户选择是否执行“%TEMP%\Target.scr”:

图 1.9 启动Security Zone标记检查,PPT页面弹出UAC安全警告窗口

  由于沙虫系列漏洞是一个链接执行漏洞,而非常见的格式文档溢出漏洞,DEP等内存安全防御机制对其无效,调高UAC的级别对类似漏洞有一定的防御效果。如果此时被攻击者选择了继续运行“Target.scr”,恶意代码将被执行。而如果被攻击者的系统关闭了UAC控制或在获取了管理员权限的情况下,该安全警告窗口将不会弹出,“Target.scr”会被静默无警告地执行。
  关于沙虫漏洞和其绕过漏洞CVE-2014-6352更多细节可以参考安天实验室[4]和360天眼实验室[5]及Macfee[6]的分析文章。