【原创】ActiveX 控件漏洞挖掘入门
http://hi.baidu.com/bybabbitt/blog/item/ee5aedbfb73ff90d19d81fac.html
标 题: ActiveX控件漏洞挖掘入门
作 者: k7zj
时 间: 2008-03-27,14:52
--------------------------------------------------------------------------------
【文章标题】: ActiveX控件漏洞挖掘入门
【文章作者】: k7zj
【作者邮箱】: k7zjmost@21cn.com
【编写语言】: html etc.
【使用工具】: COMRaider
【操作平台】: WINXP SP2
【作者声明】: 其实是看了一篇文章《ActiveX-ActiveExploitation》以及一些常见的ActiveX漏洞挖掘过程,想对这方面的东西做点小小的总结,权当作入门的东西,勉强算是原创吧。。。
【基础介绍】
ActiveX是微软在1996年引入,是基于COM组件和OLE的。COM组件开发的目的是为了简化代码的重用,通过建立带有接口的对象,它们能被其他 COM足见以及程序调用,IE里面经常用到这样的技术。因此COM组件被广泛用于开发浏览器的第三方应用程序,其实也就是插件。但由于现在有的第三方开发人员编程方面的原因,控件出现越来越多的漏洞能被恶意的网站来利用,通过溢出或者是功能代码的注入来侵害个人电脑。
ActiveX控件被利用多出现在2个方面:第一就是其导出函数可能具有的隐蔽的功能,比如操作注册表,读写文件等等,还有就是控件本身一些函数在处理参数的时候出现了参数长度未检查造成溢出的情况。恶意的网站如果在网站上安装了有漏洞的COM组件,而用户毫不知情的情况下访问很容易被入侵。
ActiveX控件被浏览器调用实例化的条件是:它是被标记了可安全执行脚本(as safe for scripting)。要判断其是否为可安全执行脚本,只需在注册表中对应的CLSID项下查看是否有Implemented Categories此项即可。
【FUZZ工具介绍】
目前FUZZ ActiveX控件比较好的工具是COMRaider.
【如何跟踪COM组件的接口】
首先来讲些基础知识:
IDispatch接口如下:
interface IDispatch:IUnknow
{
virtual HRESULT GetTypeInfoCount(UINT *pctinfo) = 0;
virtual HRESULT GetTypeInfo(UINT itinfo,LCID lcid,ITypeInfo **pptinfo) = 0;
virtual HRESULT GetIDsOfNames (
REFIID riid,
LPOLESTR* rgszNames,
UINT cNames,
LCID lcid,
DISPID* rgdispid) = 0;
virtual HRESULT Invoke(
DISPID dispidMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARMS* pdispparams,
VARIANT* pvarResult,
EXCEPINFO* pexcepinfo,
UINT* puArgErr) = 0;
}
1.GetTypeInfoConut(): 用于获取自动化组件支持的ITypeInfo接口的数目。
2.GetTypeInfo(): 用于获取指针ITypeInfo接口的指针,通过该指针将能够判断自动化服务程序所提供的自动化支持。
3.GetIdsofNames(): 读取一个函数的名称并返回其调度ID(DISPID).
DISPID *rgdispid是一个long类型的数据,对于IDispatch的一个特定实现,此DISPID值应该是唯一的。REFIID riid:为保留参数,不许设置为IID_NULL,在rgszNames中指定了成员函数名及其参数,由cNames标识了名字的个数,lcid参数用于指定本地化标识,得到的DISPID将保存到rgdispid中。
4.Invoke(): 提供了访问自动化对象暴露出来的方法和属性的方法。
将DISPID作为函数指针数组的索引传入dispidMember参数,Invoke()将实现一组按此索引来访问的函数。riid和lcid的含义与在GetIDsOfNames()中的定义相同,分别为保留参数和本地化标识。
WORD wFlags: 指定了要访问的是接口的属性还是方法
DISPPARMS* pdispparams:包括了方法和属性调用的参数数组、DISPID数组以及数组中参数个数等信息。
VARIANT* pvarResult: 保存返回值信息。
EXCEPINFO* pexcepinfo: 指向一个有效的异常信息结构。
UINT * PuArgErr: 包含了第一个产生错误的参数指针。
综合以上,可以了解到:通过GetIDsOfNames()和Invoke()的结合使用,将可以根据函数名称对方法和属性进行调用。这样,函数地址、AddRef()、Release()以及接口指针等细节问题将无需考虑。
基于以上的分析,对于COM里面某个函数的定位思路是:由于在调用COM里面某个函数时,会去分发,然后再调用COM里面的函数,那么,我们就在它分发的时候先把它拦截下来,之后再单步跟入某个函数。
关键函数:DispCallFunc,位于OLEAUT32.dll。在DispCallFunc函数一直“步过”,直到见到Call ecx时,我们就来到了进入COM里面某个函数的边缘了!就差一步“步进”,就来到了COM里面的某个函数的入口点了。
【如何跟踪COM组件的接口--示例】
使用工具: COMRaider
目标: COMRaider里含有的vuln.dll
1. 首先注册vuln.dll
如图(点击放大):
2.运行COMRaider,选择开始并直接fuzz vuln.dll
如图(点击放大):
3.选择Method3开始“Fuzz member”
如图(点击放大):
4.点击Next后出现了很多文件,随便选择一个点右键“Launch in Olly”
如图(点击放大):
5.被ollydbg加载后出现在入口点。首先查看可执行模块,因为前面说过DispCallFunc位于OLEAUT32.dll,所以直接查看 OLEAUT32.dll,双击OLEAUT32那条,然后ctrl+n,在DispCallFun下断点即可。
如图(点击放大):
6.下好断点以后F9运行,会停在DispCallFunc这里,然后单步走。
如图(点击放大):
7.F8单步,直到看见Call ecx的时候单步步入,就到了被分发函数的入口了。
如图(点击放大):
这样就找了调试那个函数的入口,就可以自己调试了。
【再一个示例】
这次使用method1的函数,可以观察由COMRaider生成的fuzz文件(我的是在跟com-dll一个目录下)。
注意红色部分,表示填充的参数为3092个,该脚本通过调用mehod1来弹出一个显示3092个A的对话框,但是由于参数太多,导致溢出。双击文件可见结果如下:
可见是被A字符串所溢出。
【该部分小结】
COMRaider的目的就可以根据接口所提供的参数类型构造不同的FUZZ脚本,比如说method1的参数是string,则COMRaider就构造超长字符串的参数的脚本来fuzz,并且还能通过调试器来调试。
【其他类型的漏洞】
ActiveX控件提供了丰富的接口来操作,但是有的接口可能会被不法的人来利用干坏事。下面就举一个例子来演示ActiveX在这方面的破坏性。
这是一个2007年9月报出的漏洞。
QRcode ActiveX中的SaveAsBMW () 和 SaveAsWMF()可以储存任何文件类型的文件。那意味着它可以修改系统的配置文件以及做很多坏事。
还是先用COMRaider来看看。
选择MW6QRCode.dll,查看
这2个函数存在。
其实如何找到这2个函数有漏洞存在还是需要尝试去调用。这里过程是艰巨的,我还是直接给出EXP,是在www.milW0rm.org上找的。
是个网页形式的,上面有说明,点击以后会在系统目录下生成system_.ini文件,如果别有用意的人可能会写点可执行程序等等,病毒啊,木马啊甚至rootkit....那到时候就不堪设想了。
【总结】
可见挖掘软件漏洞是个非常困难的工程,要求掌握很多的知识,对于挖掘ActiveX的漏洞我之前并没有太多的认识。这篇算勉强算是ActiveX漏洞发掘的入门篇吧,说白了就是一些总结,因为好多东西都是在网上找的,所以有什么不对的地方,还希望能够多多指出。希望大家一起交流。
参考文献: 《 ActiveX-ActiveExploitation》
Milw0rm: http://www.milw0rm.com/exploits/4420
Acronis Cyber Protect/Backup Remote Code Execution
-
The Acronis Cyber Protect appliance, in its default configuration, allows
the anonymous registration of new protect/backup agents on new endpoints.
This AP...
1 年前
没有评论:
发表评论