欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[翻译]攻击互通性-以OLE为例

[翻译]攻击互通性-以OLE为例

攻击互通性:以OLE为例

翻译 by 银雁冰

 

说明:本文为Haifei Li (haifei.li@intel.com)Bing Sun (bing.sun@intel.com2015年美国黑帽大会(BlackHat)的演讲PPT。该PPT对历史Office漏洞的原因做了深度探讨,是Office漏洞分析领域的经典paper。对Office漏洞有兴趣的小伙伴可以认真读一下这篇文章。

 

原文https://www.blackhat.com/docs/us-15/materials/us-15-Li-Attacking-Interoperability-An-OLE-Edition.pdf


相关译文http://bbs.pediy.com/thread-219234.htm

声明

?span style="font-size:9px; line-height:14px; font-family:none;">  尽管我们要讨论的是OLE,代表对象链接与嵌入(Object Linking and Embedding),本次演讲我们只讨论嵌入(Embedding)

?span style="font-size:9px; line-height:14px; font-family:none;">  限于演讲时间

?span style="font-size:9px; line-height:14px; font-family:none;">  这真是个很大的领域

议题

?span style="font-size:9px; line-height:14px; font-family:none;">  什么是OLE

?span style="font-size:9px; line-height:14px; font-family:none;">  历史上与OLE相关的0day

?span style="font-size:9px; line-height:14px; font-family:none;">  深入解析OLE

?span style="font-size:9px; line-height:14px; font-family:none;">  攻击面

?span style="font-size:9px; line-height:14px; font-family:none;">  结论


什么是OLE?

?span style="font-size:9px; line-height:14px; font-family:none;">  对象链接与嵌入

?span style="font-size:9px; line-height:14px; font-family:none;">  基于组件对象模型(COM)

 

?span style="font-size:9px; line-height:14px; font-family:none;">  它服务于Office/WordPad的大部分互通性

?span style="font-size:9px; line-height:14px; font-family:none;">  与默认/第三方应用程序一起工作,以给Office/WordPad用户丰富的文档特性


我们生活中的OLE是什么样的?

?span style="font-size:9px; line-height:14px; font-family:none;">  将一个文档嵌入另一个文档

                                            

?span style="font-size:9px; line-height:14px; font-family:none;">  通过双击清单里的文档,读者将能够打开另一个文档

?span style="font-size:9px; line-height:14px; font-family:none;">  Office用户来说非常方便

 

历史上与OLE相关的0day

?span style="font-size:9px; line-height:14px; font-family:none;">  几乎所有之前的严重的Office/WordPad零日漏洞都涉及到OLE

?span style="font-size:9px; line-height:14px; font-family:none;">  CVE-2014-4114/6352(又名沙虫零日漏洞)

?span style="font-size:9px; line-height:14px; font-family:none;">  报告于201410月,非常严重的逻辑漏洞

?span style="font-size:9px; line-height:14px; font-family:none;">  在原始样本里面发现两个OLE对象

?span style="font-size:9px; line-height:14px; font-family:none;">  在对CVE-2014-4114的初次修复中,微软并没有做到有效修复(译者注:这直接导致了CVE-2014-6352的公告)


?span style="font-size:9px; line-height:14px; font-family:none;">  CVE-2014-1761

?span style="font-size:9px; line-height:14px; font-family:none;">  20143月被谷歌报告,是一起高度针对性的攻击

?span style="font-size:9px; line-height:14px; font-family:none;">  RTF文件格式解析错误,并不是一个位于OLE对象的漏洞,但是利用了OLE机制来加载一个未开启ASLR的模块”MSCOMCTL.DLL”,用来绕过ASLR

 

?span style="font-size:9px; line-height:14px; font-family:none;">  CVE-2013-3906

?span style="font-size:9px; line-height:14px; font-family:none;">  20138月被我们检测到并报告

?span style="font-size:9px; line-height:14px; font-family:none;">  微软图形组件错误,并不是一个位于OLE对象的漏洞,但是利用了ActiveX/OLE机制来进行Office中的堆喷射


?span style="font-size:9px; line-height:14px; font-family:none;">  CVE-2012-0158/CVE-2010-3333

?span style="font-size:9px; line-height:14px; font-family:none;">  位于MSCOMCTL.OCX中的多年的老漏洞(译者注:CVE-2010-3333应位于mso.dll中,这里或许CVE-2012-1856更为合适,后者是MSCOMCTL.OCX中的一个UAF漏洞)

?span style="font-size:9px; line-height:14px; font-family:none;">  经典OLE漏洞

?span style="font-size:9px; line-height:14px; font-family:none;">  到今天还可以看到野外的样本


?span style="font-size:9px; line-height:14px; font-family:none;">  补充一下:一个相似的0day攻击,也位于MSCOMCTL.OCX(CVE-2015-2424)

?span style="font-size:9px; line-height:14px; font-family:none;">  2014615日被iSight的小伙伴公布

?span style="font-size:9px; line-height:14px; font-family:none;">  http://www.isightpartners.com/2015/07/microsoft-office-zero-day-cve-2015-2424-leveraged-by-tsar-team

 

简短总结

?span style="font-size:9px; line-height:14px; font-family:none;">  OLE对象不仅制造严重的零日漏洞,也在另外的Office/WordPad漏洞利用中起到了极大的帮助作用

?span style="font-size:9px; line-height:14px; font-family:none;">  加载未开启ASLR的模块

?span style="font-size:9px; line-height:14px; font-family:none;">  Office进程中进行堆喷射

?span style="font-size:9px; line-height:14px; font-family:none;">  

?span style="font-size:9px; line-height:14px; font-family:none;">  漏洞类别覆盖从内存破坏到逻辑漏洞

 

深入解析OLE

之前的工作

?span style="font-size:9px; line-height:14px; font-family:none;">  之前几乎没有关于于OLE内部机制的研究,但是我们要提到两个:

?span style="font-size:9px; line-height:14px; font-family:none;">  “Attacking Interoperability”

?span style="font-size:9px; line-height:14px; font-family:none;">  http://hustlelabs.com/stuff/bh2009_dowd_smith_dewey.pdf

?span style="font-size:9px; line-height:14px; font-family:none;">  Mark Dowd, Ryan Smith, and David Dewey 写于2009

?span style="font-size:9px; line-height:14px; font-family:none;">  我们这次演讲的题目是为了纪念这篇paper里面的伟大工作

?span style="font-size:9px; line-height:14px; font-family:none;">  Parvez Anwar的博客上有一些与Office/OLE相关的工作

?span style="font-size:9px; line-height:14px; font-family:none;">  https://www.greyhathacker.net/

 

OLECOM的一个子集


 

深入解析OLE

?span style="font-size:9px; line-height:14px; font-family:none;">  为了解释OLE的内部原理,首先我们需要理解当一个用户打开一个含有OLE的文档时会发生什么

 

OLE初始化

?span style="font-size:9px; line-height:14px; font-family:none;">  初始化/加载一个OLE对象可以通过ole32!OleLoad()这一API来简单实现



?span style="font-size:9px; line-height:14px; font-family:none;">  我们关注两个主要步骤

?span style="font-size:9px; line-height:14px; font-family:none;">  步骤1:调用CoCreateInstance来初始化OLE对象

?span style="font-size:9px; line-height:14px; font-family:none;">  步骤2:调用IPersistStorage来初始化OLE对象的初始状态(数据)

?span style="font-size:9px; line-height:14px; font-family:none;">  接下来我们详细分析这两个步骤

 

步骤1: CoCreateInstance

ole32!wCreateObject+0x101:

75b41553 e8b387feff call ole32!CoCreateInstance (75b29d0b)

0018de38 0018de98 00000000 00000403 64c0c954

0:000> k

75b3f2af ole32!wCreateObject+0x101

75b3f1d4 ole32!OleLoadWithoutBinding+0x9c

632c4eb4 ole32!OleLoad+0x37

0:000> db poi(esp)

0018de98 02 26 02 00 00 00 00 00-c0 00 00 00 00 00 00 46

0:000> db poi(esp+4*3)

64c0c954 12 01 00 00 00 00 00 00-c0 00 00 00 00 00 00

 

 

CLSID来自哪里?

?span style="font-size:9px; line-height:14px; font-family:none;">  CLSID来自文档,指明用户想要初始化哪一个OLE对象

?span style="font-size:9px; line-height:14px; font-family:none;">  因为Office/WordPad支持一系列的文档类型,不同类型定位CLSID的方式都不一样

?span style="font-size:9px; line-height:14px; font-family:none;">  Office Open-XML格式(.docx, .xlsx, .pptx, 等等)

?span style="font-size:9px; line-height:14px; font-family:none;">  RTF(.rtf)

?span style="font-size:9px; line-height:14px; font-family:none;">  Office二进制格式(.doc, .xls, .ppt, .pps, 等等)

?span style="font-size:9px; line-height:14px; font-family:none;">  Office甚至支持HTML格式

?span style="font-size:9px; line-height:14px; font-family:none;">  我们只举例给出Open-XML格式和RTF格式里面的CLSID来源

 

Open-XML格式中的CLSID

?span style="font-size:9px; line-height:14px; font-family:none;">  对于Open-XML格式,CLSIDOLESS二进制数据文件中读入

 

RTF中的CLSID

?span style="font-size:9px; line-height:14px; font-family:none;">  RTF文档用过时的OLE1.0格式来定义一个OLE对象

?span style="font-size:9px; line-height:14px; font-family:none;">  https://msdn.microsoft.com/en-us/library/dd942402.aspx

?span style="font-size:9px; line-height:14px; font-family:none;">  指定一个CLSID是通过指定位于\objdata控制字中相应的ProgID来完成的

?span style="font-size:9px; line-height:14px; font-family:none;">  在运行时,ProgID将会通过CLSIDFromProgID被“转换”成CLSID(如果ProgID不合法,而且接下来的native数据遵循OLESS格式,CLSID将会从OLESS native数据中读取)

 

步骤2: IPersistStorage::Load

ole32!wCreateObject+0x1f9:

75b3eb41 ff5118 call dword ptr [ecx+18h]

ds:0023:6fb614a8={packager!CPackage::Load (6fb66171)}

0:000> k

75b3f2af ole32!wCreateObject+0x1f9

75b3f1d4 ole32!OleLoadWithoutBinding+0x9c

5c0e4eb4 ole32!OleLoad+0x37

 

?span style="font-size:9px; line-height:14px; font-family:none;">  容器调用OLE对象的IPersistStorage接口中的Load()方法来初始化OLE对象的初始状态


?span style="font-size:9px; line-height:14px; font-family:none;">  https://msdn.microsoft.com/en-us/library/windows/desktop/ms679731(v=vs.85).aspx

?span style="font-size:9px; line-height:14px; font-family:none;">  IID0000010a-0000-0000-C000-000000000046

 


当初始化的时候为OLE对象加载其初始“状态”

Storage Data

?span style="font-size:9px; line-height:14px; font-family:none;">  如何处理IStorage—加载它的初始状态,其实取决于OLE对象

?span style="font-size:9px; line-height:14px; font-family:none;">  因为执行IPersistStorage接口的代码位于OLE提供者(OLE对象)

?span style="font-size:9px; line-height:14px; font-family:none;">  Storage Data(” IStorage”参数提供)是存储在文档文件里的

?span style="font-size:9px; line-height:14px; font-family:none;">  ”CLSID”域一样,它也来自文档文件(这可以由攻击者提供)

?span style="font-size:9px; line-height:14px; font-family:none;">  但是两者也有一些不同

?span style="font-size:9px; line-height:14px; font-family:none;">  OLE容器(Office/WordPad)读取CLSID是为了去初始化OLE对象

?span style="font-size:9px; line-height:14px; font-family:none;">  OLE容器读取Storage Data并将它传递给OLE对象,由OLE对象负责处理读入的数据

 

Office Open-XML 格式中的Storage Data

?span style="font-size:9px; line-height:14px; font-family:none;">  OLESS数据文件提供

?span style="font-size:9px; line-height:14px; font-family:none;">  下面的例子展示了Flash Player OLE对象的Storage Data

?span style="font-size:9px; line-height:14px; font-family:none;">  D27CDB6E-AE6D-11CF-96B8-444553540000

?span style="font-size:9px; line-height:14px; font-family:none;">  OLESS数据文件(oleObject.bin)中读入Storage Data

?span style="font-size:9px; line-height:14px; font-family:none;">  ”Contents”节里面读入

 

RTF中的Storage Data

?span style="font-size:9px; line-height:14px; font-family:none;">  OLE1 Native Data提供

?span style="font-size:9px; line-height:14px; font-family:none;">  相关描述见这里:https://msdn.microsoft.com/en-us/library/dd942053.aspx

 

短暂休息

?span style="font-size:9px; line-height:14px; font-family:none;">  我们已经解释了OLE初始化过程中的两个关键步骤

?span style="font-size:9px; line-height:14px; font-family:none;">  接下来,让我们看一下”Verb”动作

 


OLE”Verb”动作

?span style="font-size:9px; line-height:14px; font-family:none;">  本质上,执行”Verb”动作其实只是调用了OLE对象的IOleObject::DoVerb方法

?span style="font-size:9px; line-height:14px; font-family:none;">  IOleObject

?span style="font-size:9px; line-height:14px; font-family:none;">  https://msdn.microsoft.com/en-us/library/windows/desktop/dd542709(v=vs.85).aspx

?span style="font-size:9px; line-height:14px; font-family:none;">  IID: 00000112-0000-0000-C000-000000000046

?span style="font-size:9px; line-height:14px; font-family:none;">  这个接口上有24个方法

?span style="font-size:9px; line-height:14px; font-family:none;">  这个IOleObject::DoVerb方法有一些参数,但是我们只需要关注其中一个,即第一个参数:”iVerb”,这个参数在特定场景下可以被攻击者控制

?span style="font-size:9px; line-height:14px; font-family:none;">  举个例子,通过提供PowerPoint放映文件(.ppsx, .pps)

IOleObject::DoVerb

packager!CPackage::DoVerb:

731e580c 8bff mov edi,edi

0:000> dd esp

0031c89c 660651c6 0054ec80 FFFFFFFD 00000000


借助文档的攻击面

?span style="font-size:9px; line-height:14px; font-family:none;">  所以,什么是攻击者可能会在一次基于文档的攻击中使用的呢?

?span style="font-size:9px; line-height:14px; font-family:none;">  我们需要理解一个攻击者可以从文档中提供什么数据

?span style="font-size:9px; line-height:14px; font-family:none;">  攻击者是否能够提供在OLE初始化过程中CoCreateInstance函数所需的CLSID

?span style="font-size:9px; line-height:14px; font-family:none;">  答案是:Yes(前面已经解释)

?span style="font-size:9px; line-height:14px; font-family:none;">  攻击者是否能够提供在OLE初始化过程中的IPersistStorage::Load所需的Storage

?span style="font-size:9px; line-height:14px; font-family:none;">  答案是:Yes(前面已经解释)

?span style="font-size:9px; line-height:14px; font-family:none;">  攻击者是否能够提供在OLE”Verb”动作执行时所需的”Verb”id

?span style="font-size:9px; line-height:14px; font-family:none;">  答案是:Yes(前面已经解释)

 

攻击面I: IPersistStorage::Load

?span style="font-size:9px; line-height:14px; font-family:none;">  这是最常见的的一种

?span style="font-size:9px; line-height:14px; font-family:none;">  你想要去解析一些数据;我给你伪造的数据

?span style="font-size:9px; line-height:14px; font-family:none;">  有时候这会导致内存破坏,有时候这可能会变成一个逻辑漏洞

?span style="font-size:9px; line-height:14px; font-family:none;">  事实上,大多数之前被公开的OLE漏洞都位于IPersistStorage::Load方法

?span style="font-size:9px; line-height:14px; font-family:none;">  让我们来给出几个例子

 

CVE-2012-0158

?span style="font-size:9px; line-height:14px; font-family:none;">  大多数之前的分析已经展现过下图了,在MSCOMCTL.OCX模块中

 [图片:628056_u1zjeosymjuytct.png]

?span style="font-size:9px; line-height:14px; font-family:none;">  但是,漏洞函数究竟来自哪里?

?span style="font-size:9px; line-height:14px; font-family:none;">  往前追踪,我们到了这里

[图片:628056_bo6i2ew0m88h5ik.png]

?span style="font-size:9px; line-height:14px; font-family:none;">  sub_276008D9函数到底是什么?

?span style="font-size:9px; line-height:14px; font-family:none;">  在一番逆向后,我们意识到这其实是IPersistStorage::Load方法


?span style="font-size:9px; line-height:14px; font-family:none;">  事实上,这个基于栈的溢出位于IPersistStorage::Load方法

 

“Package”临时文件释放

?span style="font-size:9px; line-height:14px; font-family:none;">  20147月的McAfee实验室博客上被报告

?span style="font-size:9px; line-height:14px; font-family:none;">  https://blogs.mcafee.com/mcafee-labs/dropping-files-temp-folder-raises-security-concerns

?span style="font-size:9px; line-height:14px; font-family:none;">  Demo: http://justhaifei1.blogspot.com/2014/08/demonstration-of-windowsoffice-insecure.html

?span style="font-size:9px; line-height:14px; font-family:none;">  还未被修复!

?span style="font-size:9px; line-height:14px; font-family:none;">  最近,(谷歌的)James Forshaw在他发现的一个NTLM反射权限提升漏洞中的利用中利用了这个特性:

https://code.google.com/p/google-security-research/issues/detail?id=325

?span style="font-size:9px; line-height:14px; font-family:none;">  这个问题也位于 IPersistStorage::Load方法中

 

0:000> r

packager!CPackage::EmbedReadFromStream+0x2c6:

733c404d call packager!CopyStreamToFile (733c6974)

0:000> du poi(esp+4)

04fdc008 "C:\Users\ADMINI~1\AppData\Local\"

04fdc048 "Temp\dwmapi.dll"

0:000> k

733c4aaa packager!CPackage::EmbedReadFromStream+0x2c6

733c627e packager!CPackage::PackageReadFromStream+0x6b

7749eb44 packager!CPackage::Load+0x10d

 

攻击面II: IOleObject::DoVerb

?span style="font-size:9px; line-height:14px; font-family:none;">  这是IOleObject::DoVerb”iVerb”参数


?span style="font-size:9px; line-height:14px; font-family:none;">  “iVerb”的值可以在一些攻击者可以控制的地方被定义。举个例子:PowerPoint Show

 


?span style="font-size:9px; line-height:14px; font-family:none;">  攻击者可以提供”iVerb”的值,然后自动调用” IOleObject::DoVerb”方法

?span style="font-size:9px; line-height:14px; font-family:none;">  举个例子,通过PowerPoint Show” Animations”特性

?span style="font-size:9px; line-height:14px; font-family:none;">  不同的值会导致不同的动作。举个例子:

?span style="font-size:9px; line-height:14px; font-family:none;">  你给0,它会执行预定义的动作0,可能是打开这个对象

?span style="font-size:9px; line-height:14px; font-family:none;">  你给-1,它会执行预定义的动作1,可能做一些另外的事情

?span style="font-size:9px; line-height:14px; font-family:none;">  OLE对象可以选择不去执行他们的IOleObject而使用默认/标准接口

?span style="font-size:9px; line-height:14px; font-family:none;">  这导致了一些标准的”verb”动作

?span style="font-size:9px; line-height:14px; font-family:none;">  看接下来的分析

?span style="font-size:9px; line-height:14px; font-family:none;">  然而,也有一些OLE对象选择去执行它们自己的IOleObject

?span style="font-size:9px; line-height:14px; font-family:none;">  一个开发者实现的操作,但是可能被坏人滥用

?span style="font-size:9px; line-height:14px; font-family:none;">  通常是逻辑问题

 

标准的”Verb”动作

?span style="font-size:9px; line-height:14px; font-family:none;">  https://msdn.microsoft.com/en-us/library/windows/hardware/z326sbae(v=vs.71).aspx

 


沙虫零日漏洞

?span style="font-size:9px; line-height:14px; font-family:none;">  “沙虫”零日攻击(CVE-2014-4114)第一个针对 IOleObject::DoVerb攻击载体的利用


 

?span style="font-size:9px; line-height:14px; font-family:none;">  ”verb”3时,执行右键菜单动作!

 

?span style="font-size:9px; line-height:14px; font-family:none;">  哪里错了?

?span style="font-size:9px; line-height:14px; font-family:none;">  不同文件类型的右键菜单选项是不一样的

?span style="font-size:9px; line-height:14px; font-family:none;">  文件内容和文件名(文件类型)IOleObject::DoVerb进行控制

?span style="font-size:9px; line-height:14px; font-family:none;">  记得我们的”Package”临时文件释放案例的研究吗?它们是一样的!

?span style="font-size:9px; line-height:14px; font-family:none;">  所以,这个整洁的零日漏洞事实上利用了两个攻击载体

?span style="font-size:9px; line-height:14px; font-family:none;">  举个例子,安装一个.inf文件

?span style="font-size:9px; line-height:14px; font-family:none;">  Pwned!逻辑漏洞!

         

攻击面III: CLSID相关联的DLL加载

?span style="font-size:9px; line-height:14px; font-family:none;">  到此,我们已经讨论了OLE的两个重要的攻击载体:IPersistStorage::LoadIOleObject::DoVerb

?span style="font-size:9px; line-height:14px; font-family:none;">  还有其他的吗?

?span style="font-size:9px; line-height:14px; font-family:none;">  当然

?span style="font-size:9px; line-height:14px; font-family:none;">  让我们来回顾一下加载一个OLE对象的最前面几个步骤

?span style="font-size:9px; line-height:14px; font-family:none;">  调用CoCreateInstance尝试去初始化OLE对象,OLE对象由CLSID指定,CLSID在文件文件中提供

?span style="font-size:9px; line-height:14px; font-family:none;">  CoCreateInstance干了些什么?如下:

        CoGetClassObject(rclsid, dwClsContext, NULL, IID_IClassFactory, &pCF);

        hresult = pCF->CreateInstance(pUnkOuter, riid, ppvObj)

        pCF->Release();

 

?span style="font-size:9px; line-height:14px; font-family:none;">  CoCreateInstance需要首先加载与CLSID相关联的DLL到进程

 

什么是“CLSID相关联的”DLL

?span style="font-size:9px; line-height:14px; font-family:none;">  在你的注册表里面,一个DLL有一个相关联的CLSID

?span style="font-size:9px; line-height:14px; font-family:none;">  HKEY_CLASSES_ROOT\CLSID

?span style="font-size:9px; line-height:14px; font-family:none;">  InprocServer32键指定了当前CLSID对应的DLL(“server”)位于哪儿

 

?span style="font-size:9px; line-height:14px; font-family:none;">  这里能出什么问题?

?span style="font-size:9px; line-height:14px; font-family:none;">  从一个攻击者的角度?

?span style="font-size:9px; line-height:14px; font-family:none;">  正如我们讨论过的那样,OLE对象是COM对象的一个子集,而COM对象又是CLSID相关联的对象的子集

?span style="font-size:9px; line-height:14px; font-family:none;">  许多注册在操作系统中的COM对象并不是OLE对象

?span style="font-size:9px; line-height:14px; font-family:none;">  几百个 v.s. 几千个

?span style="font-size:9px; line-height:14px; font-family:none;">  有时候甚至一个在注册表中有CLSID相关联的DLL并不是一个COM

?span style="font-size:9px; line-height:14px; font-family:none;">  但是,CoCreateInstance将仍然加载CLSID相关联的DLL到进程

?span style="font-size:9px; line-height:14px; font-family:none;">  不管这个DLL是否是一个”OLE DLL”

?span style="font-size:9px; line-height:14px; font-family:none;">  被加载的DLL不会被卸载,即使它在后面被发现不是一个”OLE DLL”

?span style="font-size:9px; line-height:14px; font-family:none;">  在我们看来,这是Windows初始化OLE对象过程中的一个*设计*问题

?span style="font-size:9px; line-height:14px; font-family:none;">  没有加载DLL之前,你无从知道是否COM暴露了你想要的接口!

?span style="font-size:9px; line-height:14px; font-family:none;">  让我们来将其与它著名的“姐妹”特性比较一下:IE浏览器中的ActiveX控件

?span style="font-size:9px; line-height:14px; font-family:none;">  不像OLEIE11加载一个ActiveX控件时会首先检查白名单列表

?span style="font-size:9px; line-height:14px; font-family:none;">  HKLM\Software\Microsoft\Windows\CurrentVersion\Ext\PreApproved

?span style="font-size:9px; line-height:14px; font-family:none;">  所以,如果当前的ActiveX CLSID不在列表里面,相关联的DLL不会被加载到IE进程

?span style="font-size:9px; line-height:14px; font-family:none;">  IE进程里面的ActiveX是没有问题的

 

后果

?span style="font-size:9px; line-height:14px; font-family:none;">  我们讨论的这个问题会导致怎样的坏结果?

?span style="font-size:9px; line-height:14px; font-family:none;">  我们可以加载任何DLL到进程,只要这个DLL有其相关联的CLSID

?span style="font-size:9px; line-height:14px; font-family:none;">  考虑到攻击通过文档来启动

?span style="font-size:9px; line-height:14px; font-family:none;">  有一些这样的例子

?span style="font-size:9px; line-height:14px; font-family:none;">  注意:加载OLE DLL可能也会有相同的问题。但是,能够加载每一个CLSID相关联的DLL *显著地* 增大了攻击载体

 

后果1: 加载未开启ASLR的DLL

?span style="font-size:9px; line-height:14px; font-family:none;">  在容器进程中加载一个未开启ASLRDLL

?span style="font-size:9px; line-height:14px; font-family:none;">  也就是说,WordPowerPointExcelWordPad

?span style="font-size:9px; line-height:14px; font-family:none;">  然后可以在利用时被用来绕过ASLR

?span style="font-size:9px; line-height:14px; font-family:none;">  注意,不仅是CLSID相关联的DLL会有未开启ASLR的情况,有时候CLSID相关的DLL也可以链接到另一些未开启ASLRDlls(所以这些DLL也会被加载)

?span style="font-size:9px; line-height:14px; font-family:none;">  这一攻击面在Office 2013及以后版本无效,因为它们开启了强制ASLR”

?span style="font-size:9px; line-height:14px; font-family:none;">  http://blogs.technet.com/b/srd/archive/2013/12/11/software-defense-mitigating-common-exploitation-techniques.aspx

?span style="font-size:9px; line-height:14px; font-family:none;">  不过仍然可以工作在Office<=2010< span="">WordPad上面

 

案例1otkloadr.WRAssembly.1

?span style="font-size:9px; line-height:14px; font-family:none;">  尝试去加载被ProID定义的“COM对象”:otkloadr.WRAssembly.1

 

?span style="font-size:9px; line-height:14px; font-family:none;">  这甚至不是一个COM

?span style="font-size:9px; line-height:14px; font-family:none;">  将会加载C:\Program Files\Microsoft Office\Office14\ADDINS\OTKLOADR.DLL,这会导致加载其链接的一个,位于同一目录下的未开启ASLR的模块:MSVCR71.DLL

?span style="font-size:9px; line-height:14px; font-family:none;">  20146月被Parvez Anwar公开http://www.greyhathacker.net/?p=770 ,已经被微软修复

 

案例2mscormmc.dll

?span style="font-size:9px; line-height:14px; font-family:none;">  这个未开启ASLRDLL在默认的Windows 7

?span style="font-size:9px; line-height:14px; font-family:none;">  C:\Windows\Microsoft.NET\Framework\v1.0.3705\mscormmc.dll

?span style="font-size:9px; line-height:14px; font-family:none;">  有好些CLSIDs与这个DLL相关联,举个例子:

?span style="font-size:9px; line-height:14px; font-family:none;">  {18BA7139-D98B-43C2-94DA-2604E34E175D}

?span style="font-size:9px; line-height:14px; font-family:none;">  构造一个带有这个CLSID的含OLE对象的OfficeRTF文档,你就可以加载这个未开启ASLRDLL到进程

?span style="font-size:9px; line-height:14px; font-family:none;">  到现在还是管用的!找到一个未开启ASLRDLL比较简单,找到它只花了几分钟的时间

 

后果2: 内存破坏

?span style="font-size:9px; line-height:14px; font-family:none;">  有些时候,加载一个“未准备好的”DLL足够触发内存破坏了

?span style="font-size:9px; line-height:14px; font-family:none;">  例子:微软Office内存未初始化漏洞 (CVE-2015-1770)

?span style="font-size:9px; line-height:14px; font-family:none;">  CLSID: CDDBCC7C-BE18-4A58-9CBF-D62A012272CE

?span style="font-size:9px; line-height:14px; font-family:none;">  相关联的DLL: C:\Program Files\Microsoft Office\Office15\OSF.DLL

?span style="font-size:9px; line-height:14px; font-family:none;">  只要尝试加载与上面的CLSID相关联的DLL就会给你一个crash(可利用)

?span style="font-size:9px; line-height:14px; font-family:none;">  OSF.DLL当然不是被设计用来给你作为一个OLE或者ActiveX对象加载的

?span style="font-size:9px; line-height:14px; font-family:none;">  MWR实验室的Yong Chuan Koh发现,更多细节请看:

https://labs.mwrinfosecurity.com/system/assets/987/original/mwri_advisory_cve-2015-1770.pdf

 

后果3: DLL劫持

?span style="font-size:9px; line-height:14px; font-family:none;">  还有一种藏在深处的攻击场景

?span style="font-size:9px; line-height:14px; font-family:none;">  注意,这是关于基于文档的攻击

?span style="font-size:9px; line-height:14px; font-family:none;">  当前工作目录是攻击者可以控制的

?span style="font-size:9px; line-height:14px; font-family:none;">  我其实不应当去解释一个DLL劫持攻击


?span style="font-size:9px; line-height:14px; font-family:none;">  CVE-2015-2369是我们报告的一个很好的例子,在不久前的6月补丁日刚被修复

?span style="font-size:9px; line-height:14px; font-family:none;">  最小的POC甚至不到一条twitter的长度(140字节)

        {\rt\object\objocx{\objdata 010500000200000014000000574D444D434553502E574D444D434553502E3100000000000000000001000000410105000000000000}}

?span style="font-size:9px; line-height:14px; font-family:none;">  CLSID相关联的DLL

?span style="font-size:9px; line-height:14px; font-family:none;">  ProgID: WMDMCESP.WMDMCESP.1

?span style="font-size:9px; line-height:14px; font-family:none;">  CLSID: {067B4B81-B1EC-489f-B111-940EBDC44EBE}

?span style="font-size:9px; line-height:14px; font-family:none;">  DLL: %systemroot%\System32\cewmdm.dll

?span style="font-size:9px; line-height:14px; font-family:none;">  将会导致从当前目录加载一个叫做”rapi.dll”DLL

?span style="font-size:9px; line-height:14px; font-family:none;">  演示!(译者注:略)

 

对攻击载体的总结

?span style="font-size:9px; line-height:14px; font-family:none;">  基于受害者打开文档的时间流,这些攻击载体是:

?span style="font-size:9px; line-height:14px; font-family:none;">  许多类型的攻击可能发生在CLSID相关联的DLL加载过程中—“OLE对象初始化最开始的步骤

l  加载未开启ASLRDLL

l  内存破坏

l  DLL劫持

l  

?span style="font-size:9px; line-height:14px; font-family:none;">  许多类型的漏洞可能存在于 IPersistStorage::Load例程,”OLE对象初始化的另一个步骤

?span style="font-size:9px; line-height:14px; font-family:none;">  通过IOleObject::DoVerb“Verb”动作的攻击

l  通常为逻辑漏洞,更加危险

 

每一步都被攻击了


对攻击面的总结

?span style="font-size:9px; line-height:14px; font-family:none;">  OLE机制提供了巨大的攻击面

?span style="font-size:9px; line-height:14px; font-family:none;">  不像ActiveX,一个OLE对象没有被像“白名单列表”,“脚本安全(SFS)”,“初始化安全(SFI)”这样的安全加固特性的严格限制

?span style="font-size:9px; line-height:14px; font-family:none;">  能够加载任何CLSID相关的DLL使得攻击面变得更大

?span style="font-size:9px; line-height:14px; font-family:none;">  默认Windows上有几百个OLE对象

?span style="font-size:9px; line-height:14px; font-family:none;">  默认Windows上有几千个CLSID相关联的DLL

?span style="font-size:9px; line-height:14px; font-family:none;">  不要忘记这是一个开放领域

?span style="font-size:9px; line-height:14px; font-family:none;">  app装的越多,攻击面就变得越大

?span style="font-size:9px; line-height:14px; font-family:none;">  有一天我们会看到基于文档的,针对系统上装有特定软件的特定用户的攻击

*注意OLE加载过程会查询IE/Office Killbit,所以如果一个CLSIDKillbited了,相关联的DLL将不会被加载。

 

结论

?span style="font-size:9px; line-height:14px; font-family:none;">  OLE机制服务于大多数微软的文档与其他组件的互通性

?span style="font-size:9px; line-height:14px; font-family:none;">  提供了一个巨大的攻击面

?span style="font-size:9px; line-height:14px; font-family:none;">  又一个ActiveX

?span style="font-size:9px; line-height:14px; font-family:none;">  即使它不具有脚本特性,它可以做比我们预想中多得多的事

?span style="font-size:9px; line-height:14px; font-family:none;">  在这次演讲之后可以预期到什么?

?span style="font-size:9px; line-height:14px; font-family:none;">  可能会有更多OLE相关的漏洞会被发现

?span style="font-size:9px; line-height:14px; font-family:none;">  可能会出现更多针对Office/WordPad的攻击

?span style="font-size:9px; line-height:14px; font-family:none;">  沙箱和静态方式的检测和防御都需要被改进

?span style="font-size:9px; line-height:14px; font-family:none;">  一个OLE特定的检测方法正在路上

*最近我们已经报告了一些新的逃逸技巧(https://blogs.mcafee.com/mcafee-labs/threat-actors-use-encrypted-office-binary-format-evade-detection),提示(大家)正确检出基于Office的攻击的困难性。

 

?span style="font-size:9px; line-height:14px; font-family:none;">  致厂商(微软)

?span style="font-size:9px; line-height:14px; font-family:none;">  这个很有问题的”OLE加载机制需要被重新审视,或许需要重新设计

?span style="font-size:9px; line-height:14px; font-family:none;">  你不能只仅仅加载每一个CLSID相关联的DLLOffice/WordPad进程

?span style="font-size:9px; line-height:14px; font-family:none;">  需要在默认操作系统内部进行大规模的渗透测试

?span style="font-size:9px; line-height:14px; font-family:none;">  新的攻击载体制造了许多新的漏洞

?span style="font-size:9px; line-height:14px; font-family:none;">  训练第三方厂商

?span style="font-size:9px; line-height:14px; font-family:none;">  就像你们之前对ActiveX的做法那样

 

主要引用

[1] Mark Dowd, Ryan Smith and David Dewey. “Attacking Interoperability”. [Online] http://hustlelabs.com/stuff/bh2009_dowd_smith_dewey.pdf

[2] Don Box. “Essential COM”. [Book] https://books.google.com/books/about/Essential_COM.html

[3] WikipediA. “Object Linking and Embedding”. [Online] https://en.wikipedia.org/wiki/Object_Linking_and_Embedding

[4] Haifei Li. “Bypassing Microsoft’s Patch for the Sandworm Zero Day: a Detailed Look at the Root Cause” [Online] https://blogs.mcafee.com/mcafee-labs/bypassing-microsofts-patch-sandworm-zero-day-root-cause

[5] Haifei Li. “Bypassing Microsoft’s Patch for the Sandworm Zero Day: Even ‘Editing’ Can Cause Harm”. [Online] https://blogs.mcafee.com/mcafee-labs/bypassing-microsofts-patch-for-the-sandworm-zero-day-even-editing-can-cause-harm

[6] Haifei Li. “A Close Look at RTF Zero-Day Attack CVE-2014-1761 Shows Sophistication of Attackers”. [Online] https://blogs.mcafee.com/mcafee-labs/close-look-rtf-zero-day-attack-cve-2014-1761-shows-sophistication-attackers

[7] Haifei Li. “McAfee Labs Detects Zero-Day Exploit Targeting Microsoft Office”. [Online] https://blogs.mcafee.com/mcafee-labs/mcafee-labs-detects-zero-day-exploit-targeting-microsoft-office-2

[8] venustech. “CVE-2012-0158 Analysis Report”. [Online] http://www.venustech.com.cn/NewsInfo/449/13620.Html

[9] Jonathan Leathery. “Microsoft Office Zero-Day CVE-2015-2424 Leveraged By Tsar Team”. [Online] http://www.isightpartners.com/2015/07/microsoft-office-zero-day-cve-2015-2424-leveraged-by-tsar-team

[10] Haifei Li. “Dropping Files Into Temp Folder Raises Security Concerns”. [Online] https://blogs.mcafee.com/mcafee-labs/dropping-files-temp-folder-raises-security-concerns

[11] Parvez Anwar. “Bypassing Windows ASLR in Microsoft Word using Component Object Model (COM) objects”. [Online] http://www.greyhathacker.net/?p=770

[12] Yong Chuan Koh. “Microsoft Office Uninitialised Memory Use Vulnerability”. [Online] https://labs.mwrinfosecurity.com/system/assets/987/original/mwri_advisory_cve-2015-1770.pdf

 


上传的附件 us-15-Li-Attacking-Interoperability-An-OLE-Edition.pdf
攻击互通性-以OLE为例.pdf

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功