ActiveX是微软公司提出,并在1996年被正式命名的组件技术。该技术提供了一种通用的开放程序接口,使用这种技术开发的ActiveX控件可以直接集成到IE浏览器或第三方应用程序中,但由于第三方编程等问题,控件的漏洞越来越多,很容易被攻击者利用进行破坏及窃取信息等活动,给个人和企业带来很大损失。本文结合H3C攻防研究团队在攻防研究过程中的经验和体会,阐述ActiveX控件漏洞产生的原理及漏洞挖掘方法。
ActiveX 控件概念
1. ActiveX产生
ActiveX是以微软COM模型(Component Object Model)为理论基础建立起来的技术,通过建立带有接口的对象,ActiveX控件能被其他COM组件或者程序调用。
ActiveX控件技术提供了一个集成平台,为开发人员、用户提供了一个快速简便的在 Internet或Intranet 程序集成的方法。传统的浏览器只能将HTML网页读出并显示,呈现给用户的是一个静止的、无变化的呆板网页。使用 ActiveX控件可以轻松方便的在 Web页中插入多媒体、交互式对象、各种文档格式以及复杂程序,使浏览器显示的网页变得“聪明活泼”,既能进行计算产生新信息,又使显示更具娱乐性。
2. ActiveX 控件基本属性
ActiveX控件由三大要素组成:属性、方法、事件。
属性:控件的基本特性,描述控件的信息。
方法:控件提供给外界的接口,ActiveX控件需要提供函数接口名称及参数,使用者可以通过这些来设置控件的某些性质、执行某项动作或者进行某些运算。
事件:控件对外部操作或内部处于某种状态时向控件所发出的操作指令,如用户鼠标点击、控件应答鼠标事件、显示特殊的多媒体文件等。
3. ActiveX控件工作原理
ActiveX控件要想正常使用,必须工作在一个名为Container(容器)的独立软件中。这种软件可以是应用软件,如迅雷、媒体播放器;也可以是浏览器,如IE;还可以是文字处理软件,如pdf、word等。ActiveX控件通过组件的方式进行工作,如果一个网页或程序中想增加一项特殊的功能,不需要重写整个程序,只要灵活地插入一个具有此项功能的ActiveX控件即可。
要调用ActiveX控件,首先要创建控件实例对象,对控件进行实例化后,才可以设置和操作ActiveX控件的属性和方法。ActiveX控件能在ASP,JSP等页面中通过<object>标签创建,<object>标签包含类id(clsid)或名称id(progid),识别需要实例化的ActiveX控件。
以IE浏览器为例,说明容器(这种情况下IE就是ActiveX控件的容器)如何调用ActiveX控件。当IE浏览器发出请求时,Web服务器向浏览器回传内嵌ActiveX控件的页面,由浏览器负责解释。在解释过程中浏览器首先用该控件在页面中注明的id值或名称在本地注册表内进行查询,若已经存在,则说明该控件已经在安装,然后通过注册表中的相关信息使用该控件;否则就要根据页面中提示的该控件所在服务器的地址,下载并完成在本地的安装注册,使该控件成为本地资源,供以后使用。
ActiveX控件漏洞的产生
目前ActiveX控件主要和IE浏览器配合使用,网站的开发者为了丰富网页的内容,使用自己或者第三方已经开发好的控件。由于控件提供方的开发水平和安全意识参差不齐,导致提供的ActiveX控件存在很大的安全隐患。
使用ActiveX控件需要下载到本地进行安装并且提供对外调用的方法。所以对于每一个ActiveX控件,可能有如下几个方面的安全漏洞:
调用的控件可以创建、修改或者删除本地文件、修改注册表等信息;
调用的控件可以获取本地信息,如某文件信息、用户名、密码、IP地址等;
调用的控件可以通过欺骗行为使用户访问恶意网页、下载恶意程序等;
调用的控件存在缓冲区或者格式化字符串漏洞导致浏览器或者系统异常。
ActiveX控件漏洞挖掘方法
目前,对于ActiveX控件的漏洞挖掘,主要有两种方式:
使用Fuzz测试工具:比较出名的有ComRaider、Axman等。由于ActiveX控件存在统一的编程接口,所以可以通过系统调用获取控件中的属性和方法,编写出自动化测试工具,根据控件的参数情况,自动填充异常数据,检验是否存在漏洞。这种方法重点测试ActiveX控件是否存在缓冲区溢出漏洞;
人工分析方法:通过控件解析器如ComRaider 、OLEView等,解析出控件的方法和属性,再根据每个方法的参数和返回值等,手工构造测试用例,依次对各个属性和方法进行异常测试,根据页面的返回情况,确定是否存在安全漏洞。这种方法重点测试ActiveX控件是否存在逻辑类漏洞。
1. 使用Fuzz测试工具挖掘ActiveX控件漏洞
Fuzz测试是一种软件测试技术,通常用来发现软件或者协议存在的安全漏洞。Fuzz测试属于黑盒测试,其测试基本思路就是给程序输入随机或者异常数据,观察程序的反应,如果程序发生异常,如异常中止,打印告警等,则说明程序可能存在安全漏洞。
在ActiveX控件漏洞挖掘中,最常用的Fuzz测试工具是ComRaider。ComRaider可以根据接口所提供的参数类型构造不同的Fuzz脚本,并且还能通过调试器来调试。可以根据参数类型的不同,构造字符串溢出漏洞、整数溢出漏洞、格式化字符串漏洞等。下面通过ComRaider自带的vuln.dll控件说明如何构造Fuzz测试用例。
首先在注册表注册vuln.dll;
运行COMRaider,选择开始并测试 vuln.dll控件(图1);
图1 启动COMRaider
使用ComRaider解析出控件的属性和方法,如图2所示,可以看到该攻击的ID,包含的方法等信息;
图2 使用COMRaider解析控件的属性和方法
选择一个方法如method1,进行Fuzz测试(图3)。在该方法上单击右键,选择“Fuzz number”后,会生成Fuzz
图3 选择控件方法产生Fuzz测试文件
点击“next”按钮,进入下个页面,准备进行Fuzz测试。图4中红框内是Fuzz测试文件(这里是字符串类型),单击右键可以查看每个Fuzz文件。每一个Fuzz文件,就是调用该控件的方法,构造存在问题的网页。Fuzz测试用例主要是构造超长字符串;
图4 选择Fuzz测试文件准备测试
点击“Begin Fuzz”按钮,ComRaider依次执行Fuzz测试脚本,检验测试脚本能否导致控件异常。如图5所示,测试结束后,如果发现异常,在测试结果result列中会显示“Caused Excepting ”。在下面一栏中,显示了异常的指令、模块等,双击该条目,会出现详细的异常信息,包括出问题的地址,各个寄存器的值,栈内存,堆内存的情况;
图5 Fuzz测试完成显示测试结果
选择某个出问题的测试例,单击右键,见图6,可以点击View File查看Fuzz测试用例脚本,或通过Lauch in Olly在Ollydbg中进行调试,查找出问题的原因;
图6 显示Fuzz测试用例及调试菜单
重复上述过程,选择组件的不同方法或者不同组件进行测试,检验组件是否存在安全漏洞。
除了ComRaider工具外,还有几款ActiveX控件fuzz测试工具,如AxMan、AxFuzz、Combust等,这些工具虽然实现、界面不相同,但是原理基本相同。
2. 人工挖掘ActiveX控件漏洞
根据前面提到的ActiveX控件可能存在的漏洞,可以将ActiveX控件漏洞分为两大类。
1) 控件的方法中存在逻辑漏洞,主要包括以下几个方面:
系统或者本地文件被覆盖,删除;
注册表表项被修改,删除;
泄漏本地文件信息或者重要系统信息;
访问恶意网页,下载恶意程序。
2) 控件的方法中存在溢出漏洞,主要包括如下几方面:
字符串缓冲区溢出漏洞;
整数溢出漏洞;
格式化字符串漏洞。
前面介绍的Fuzz测试工具,主要测试ActiveX控件的溢出类漏洞。对于控件中存在的逻辑漏洞,由于输入参数并不会对控件造成异常,所以,Fuzz工具无法判断控件是否存在漏洞。这时,可以通过人工挖掘ActiveX控件漏洞方式测试控件的逻辑类漏洞。人工挖掘ActiveX控件漏洞投入可能会比较大,不如Fuzz测试工具快捷,但是,这种测试方式准确,灵活性强,可能挖掘出工具无法发现的更深层次漏洞。
ActiveX控件逻辑漏洞产生的原因是:一般控件中提供了一些方法,主要功能包括创建文件、删除文件、下载文件、修改注册、获取系统信息等,由于没有对传入参数的内容进行检测,导致覆盖、删除本地重要文件,修改注册表,下载恶意网页,泄漏系统重要信息等。
通过工具解析出ActiveX控件的属性和方法后,根据方法名称,大致判断函数的功能,然后根据参数情况,构造相应的测试用例。可能存在漏洞的函数名称一般具有如下规律:
创建文件类:函数名如saveto、tofile、writeto、save、write等;
删除文件类:函数名如delete、deletefile等;
注册表相关类:函数名如GetRegValue、SetRegValue、SetRegdit等;
文件信息泄漏类:函数名如get、show、read、getinfo、getfile、readfile等;
访问下载恶意网页类:函数名如download、url、hostname、getfile等。
对于人工漏洞挖掘方法,一般按照如下步骤进行:
下载并安装欲测试的控件;
使用Com Explorer或者注册表查看该控件的属性,重点关注如ProgID、CLSID等;
用ComRadier查看控件中提供的变量、函数、函数参数、返回值等;
根据函数的功能,重点关注上面提到的可能存在漏洞的函数,编写漏洞利用网页,通过IE运行网页,检验控件是否存在漏洞。
对于溢出类漏洞,人工分析和使用Fuzz测试工具原理基本相同。溢出类漏洞的手动分析不需要特别关注函数的名称,可以重点关注函数中的参数,根据参数的类型,分别进行溢出测试。
综上所述,进行ActiveX控件漏洞挖掘,可以从几个步骤入手:
第一步:使用现有的Fuzz测试工具和人工测试相结合的方式,挖掘系统中的控件漏洞。可以先采用自动化的测试方式,重点关注自动化出问题的控件,再通过人工测试和调试,确定控件是否存在问题;
第二步:重点关注一些使用比较广泛的软件携带的控件,这些控件使用面广,存在漏洞的可能性及危害性更大;
第三步:随着挖掘的深入和能力的提高,可以对现有的Fuzz测试工具进行改进,实现更加智能的Fuzz测试工具,完成测试动自动化。目前的ActiveX控件Fuzz测试主要是构造溢出类漏洞。而ActiveX控件漏洞中,大部分是文件覆盖、删除、下载等漏洞,可以从这方面考虑改进Fuzz测试工具。
结束语
本文总结了ActiveX控件漏洞挖掘的理论和方法,通过这些方法,可以提高AtitvcX控件漏洞挖掘的效率和准确性。目前ActiveX控件多是第三方开发,并嵌入到IE浏览器中使用,所以,存在很多安全漏洞并广泛被黑客利用,通过跟踪挖掘常用的ActvieX控件,可以及时发现控件中存在的安全漏洞并给出防御措施,减少黑客使用存在漏洞的ActiveX控件攻击受害者。