OLE 全称是 对象链接和嵌入,
OLE 漏洞的产生一般也来自 链接对象 和 嵌入对象 两个方面,
谈 OLE 漏洞可以从 OLE文档的加载过程开始讲:
比如你打开一个 OLE文档,那么其加载过程分为两步,
① 初始化 OLE 对象(包括两个攻击面)
② 执行 Verb 动作(包括一个攻击面)
两个步骤中共包括了三个攻击面(如上三个步骤都可以被攻击):
第一步:初始化 OLE对象:
如何初始化 OLE 对象呢,
是通过 OLE32 这个 DLL 中的 OleLoad() 函数实现的(自己看下导出表)
该函数的执行包含6个步骤,
其中有两步分别调用了 CoCreateInstance() 和 IpersistStorage::Load 方法
CoCreateInstance() 函数(攻击点一):
第一个参数是 CLSID,指定了具体是哪一个 OLE 对象,
这个 CLSID 可以首先在文档的二进制数据中读取到一个 ProgID,
然后将 ProgID 转换成 CLSID,具体转换方法是通过两个函数 ProgIDFromCLSID CLSIDFromProgID,
也可以在注册表中直接搜索 ProgID : Package或者OLE2Link ,
可以很快定位到ProgID是 Package或OLE2Link 的 CLSID,
这样 CocreateInstance() 函数就获取到了 CLSID,
可以创建一个用来初始化该 OLE 对象的处理器handler,
CoCreateInstance() 的作用和结果就是加载了与 CLSID 相关联的 DLL 到进程中,
这也是很多 OLE 漏洞产生的原因,
只要给这个函数一个 CLSID,那么它就会无脑加载该 CLSID 所属的DLL到进程空间中,
后果就是攻击者完全可以修改二进制数据中的ProgID 值,
以加载任何 DLL,只要这个DLL有关联的 CLSID 在注册表中,
这就大大增加了攻击面,许多攻击手段发生在“加载CLSID相关联的DLL到进程中这一步”
比如说有这么几种利用手段:
1) 可以加载未开启 ASLR 的 DLL 到 WOrd Excel PPT 的进程中,
配合堆栈溢出等漏洞进行攻击
这里需要注意的一点是:不光 CLSID关联的 DLL会被加载进程中,
加载的 DLL 相关联的 未开启ASLR的DLL也可以被自动加载到进程中
不过从 Office2013 开始强制开启了 ASLR,这种利用手段就失效了
举例:mscormmc.dll
这个 Win7 上的 DLL 默认没有开启 ASLR,
但是有很多 CLSID 与这个 DLL关联,
构造一个带有其中 CLSID 的含有 OLE对象的Office或者 RTF文档,
就可以加载这个未开启 ASLR 的 DLL 到进程当中
2) 可以造成 内存破坏
3) 可以进行 DLL劫持
IpersistStorage::Load() 函数(攻击点二):
当 OLE 对象被确定之后,
也就是找到了对应的 CLISD,加载了 CLSID关联的DLL到进程中,
OLE对象的 IPersistStorage 接口中的 Load() 函数被调用,
用来初始化 OLE 对象的初始状态
这个“初始化”在我理解就是将序列化的 Storage Data进行分片读取,获取具体字段的值
第二步:执行“Verb”动作(攻击点三):
触发“Verb”动作有两种方法:
① 用户点击、双击插入的 OLE 对象,比如图片、链接等
② “Verb”自动执行,比如 PPT中的某些动画事件,又比如PPSX文档一打开就是自动执行
这一步通常为逻辑漏洞,
Verb 动作本质上是调用 IOleObject::DoVerb 方法完成的
IOleObject的 CLSID为:00000112-0000-0000-C000-000000000046
可以在注册表中搜索到,其实这可以被当做一个接口,
IOleObject 这个接口提供了24个方法,DoVerb只是其中一个方法。
容易受到攻击的是DoVerb() 方法的第一个参数 iVerb,
iVerb的值可以在一些攻击者可以控制的地方被定义,比如 PowerPoing Show 的 Animations 字段。
参考:
https://bbs.pediy.com/thread-219234.htm
https://bbs.pediy.com/thread-218941.htm