毕业论文范文——Peach框架的研究与改进_第1页
毕业论文范文——Peach框架的研究与改进_第2页
毕业论文范文——Peach框架的研究与改进_第3页
毕业论文范文——Peach框架的研究与改进_第4页
毕业论文范文——Peach框架的研究与改进_第5页
免费预览已结束,剩余32页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

北京邮电大学本科毕业设计(论文)Peach框架的研究与改进摘 要如今网络和软件安全已成为一个热门的话题,越来越多的人正在投入到这项新兴计算机方向学科的研究中。事实上,任何复杂的应用软件或者网络协议都会存在大量的安全漏洞。我们需要将软件安全测试补充到软件开发的过程中,尽可能地减少漏洞,使得软件产品越来越安全。软件安全测试已经成为软件测试的核心测试。Fuzzing(模糊测试)技术是近些年流行起来的一种安全漏洞挖掘技术,由于其在漏洞挖掘方面智能、高效的表现,使得这项技术在安全测试领域变得越来越重要。这篇论文首先介绍了三种比较传统的基本安全测试技术,随后谈到了Fuzzing技术的发展历史,Fuzzing技术的基本原理,以及当下几款比较主流的Fuzzing软件,分析了他们之间各自的优缺,最后针对其中一款Fuzzing软件Peach框架,详细说明了该软件使用方法和工作特性,通过分析Peach工程的类图和数据流图来剖析其核心Fuzzing原理,并针对Community版本的Peach框架提出了几点改进意见和方案。关键词 网络安全 软件安全 软件安全测试 模糊测试 PeachResearch and improvement of Peach frameworkABSTRACTToday, network and software security has become a hot topic , more and more people are engaged in the emerging research in computer science. In fact, any complex application software or network protocols will exist a large number of security vulnerabilities. We need to minimize vulnerabilities by using software security testing in the process of software development, it will guarantee software security. Software security testing has become the core of the software testing. In recent years Fuzzing as a security vulnerability mining technology is becoming increasingly popular. The smart and efficient performance of finding software vulnerabilities make it more and more important in the field of security testing . This paper first introduces the three basic security testing techniques , then talked about the history of Fuzzing technology, the basic theory of Fuzzing techniques , and several commonly used Fuzzing software. We analyzed their advantages and disadvantages, and chosed Peach framework, a Fuzzing software, to give a detailed description of the software instructions and working performance. We studied Peachs works by analyzing its class diagrams and data flow diagrams and made several improvements and solutions to the community version of the Peach.KEY WORDS NetworkSecurity SoftwareSecurity SoftwareSecurity Fuzzing Peach目 录第一章软件安全测试11.1 为什么需要软件测试11.2 安全漏洞的发现11.2.1 白盒测试21.2.2 黑盒测试21.2.3 灰盒测试3第二章Fuzzing(模糊测试)32.1 初看Fuzzing32.1.1 定义32.1.2 发展历史42.2 深入Fuzzing52.2.1 Fuzzing步骤52.2.2 Fuzzing方法62.2.3 Fuzzer种类7第三章Peach框架113.1 认识Peach 3113.2 使用Peach 3123.2.1 Peach pits的设计规则123.2.2 Peach pits实例133.3 Peach 3架构分析163.3.1 Peach 3 开发环境的搭建163.3.2 代码框架173.3.3 运行原理193.4针对Peach 3的改进方案233.4.1 开发Fuzzing Target监控程序233.4.2 针对协议测试的Monitor改进233.4.3 Fuzzing结果输出优化243.4.4 MutationStrategies的丰富和完善243.4.5 Mutator样本的优化24第四章总结与展望25致 谢26II第一章 软件安全测试1.1 为什么需要软件测试 随着科技的发展,人们的日常工作和生活越来越依赖于计算机系统,同时针对计算机系统的安全威胁却又在不断增长。软件安全性问题已经变得越来越关键,传统的仅由组织内的少数安全专家负责安全的模式正受到越来越多的挑战。很多组织和机构都在寻找一些解决方案,以消除或者减少来自计算机系统的安全漏洞,保护品牌资产价值和消费者信心。软件安全测试能够反映真实的攻击情形,从而产生客观的,可量化的结果,并能演示真实的漏洞利用情况。及早开展安全测试,有助于在很大范围内阻止来自现在和未来的威胁。如果安全测试不能贯彻到整个开发的生命周期,软件将不可避免出现安全问题,这些问题将可能导致财务信息被窃,数据丢失,性能下降等等。将软件安全测试补充到软件开发的过程中,尽可能减少更多漏洞,使得软件产品越来越安全。软件安全测试已经成为软件测试中的核心环节,是实现软件安全的基础和关键。1.2 安全漏洞的发现在了解了软件安全测试的概念后,我们需要探讨软件安全测试的意义,以及如何分辨和发掘软件安全漏洞。首先,我们把能够引起软件做一些“超出设计范围的事情”的Bug称为漏洞,这里面又细分为:1.功能性逻辑缺陷:影响软件正常工作,例如,执行结果错误、图标显示错误等。远程Fuzzer以侦听一个网络接口的软件为测试目标。基于网络的应用程序很可能是模糊测试最重要的测试目标。随着Ineternet的发展,几乎所有的公司现在都会公开发布一些可被访问的服务器来提供Web页、E-mail、域名系统(DNS)解析服务,等等。这类软件中的漏洞为攻击者提供了访问敏感数据或对更可信的服务器发起攻击的机会。2.安全性逻辑缺陷:通常情况下不影响软件的正常功能,但被攻击者成功利用后,有可能引起软件区执行额外的恶意代码。常见的漏洞包括软件中的缓冲区溢出漏洞、网站中的跨站脚本漏洞(XSS)、SQL注入漏洞等。在软件安全测试领域中,发现安全漏洞的方法多种多样,每种方法都有各自的优点和缺点,唯一的共同点是:只能找出一个软件或者协议中的一部分漏洞。因此,既没有绝对正确的方法,也没有任何一种单一方法可以发现特定目标的所有安全漏洞。但是,这并不意味着安全测试是一门零散、杂乱无章的学科,恰恰相反,安全测试是一项严谨、讲究方法论的科学。从大体上来说,用于发现安全漏洞的技术基本分为白盒测试、黑盒测试和灰盒测试三种基本方法。白盒测试要求测试者能够访问到被测系统中的全部资源(源代码、数据、设计文档、设计人员);黑盒测试则无视被测系统的内部结构原理和相关资源,对被测系统进行“盲测”;而灰盒测试则是前面二者的折中,在对被测系统有一定的了解基础上,对被测系统进行针对性、系统性的试探和测试。后面本文会分别探讨各种白盒、黑盒和灰盒测试技术。在阐述每种方法的优缺点的同时,为后续的Fuzzing(模糊测试)技术的介绍和讨论准备必要的背景知识。1.2.1 白盒测试虽然Fuzzing技术主要归属于黑盒和灰盒测试的领域范围内,但这里我仍给予白盒测试足够的篇幅来阐述,一方面作为一种被开发工程师广泛采用的安全漏洞发现方法,在安全测试领域是不可忽视的一股力量;另一方面,Fuzzing技术也从白盒测试的思想中借鉴了许多宝贵经验知识。白盒测试的核心是基于对源代码的评审,这里代码评审既可以用手工方式,也可以用自动化工具来实现。自动化代码评审工具在完成某些比较简单而又枯燥的代码阅读工作时往往功效卓著,但只能用于发现可能存在的漏洞和可疑的代码片段,若要真正发现代码问题,仍需要人工进行判断。同时这些源代码分析工具需要解决很多问题才能产生有价值的分析结果。因此很多时候,白盒测试并不是软件测试工程师的首选方案。在过去,人们往往假设白盒测试在安全漏洞发现方面比黑盒测试的效率更高,但这种假设是不正确的。虽然没有什么东西比软件源代码本身更能全面地展示软件,但是希望在看到的软件功能和该软件的源代码之间建立严格的对应关系是几乎不可能的事情,追其根本原因,是因为软件在构建过程时,源代码会编译成机器指令,这时机器指令的执行流程和我们的设计初衷之间往往会存在巨大的变化。这也是为什么没有一种绝对好的软件安全测试方法,若需要实现充分的覆盖,我们就需要混合应用多种软件测试方法。因此单一的白盒测试,是不能真正实现对一款软件或协议的安全测试,总结其缺点,白盒测试中代码分析方法总是存在着:分析过程过于复杂和使用局限等问题。再来谈论白盒测试的优点。刚刚说Fuzzing技术也从白盒测试中汲取了不少可用的经验知识。如上文所述,代码评审是针对所有源代码进行的,因此代码评审几乎可以达到所有情况的完全覆盖,这完全得益于我们在测试时对代码内部结果有着一个清晰的认识和把控。1.2.2 黑盒测试黑盒测试意味着仅仅通过外部输入,观察其系统反馈来测试系统,而并不用知道这个系统内部是如何工作的。很重要的地方是,在Fuzzing技术发展初期,这项技术还只是一种黑盒测试技术。早在1989年,Barton Miller教授在他的高级操作系统课上开发了一种原始的Fuzzer(模糊测试器),用来测试UNIX应用程序的健壮性。当时测试的关注点并不是评价系统的安全性,而是验证全部代码的质量和可靠性。黑盒测试的效果很大程度上取决于用于系统的测试用例的数量和质量,因此,测试用例的设计是黑盒测试的核心和最重要的内容。黑盒测试用例设计主要有等价类的划分法、边界值分析法、因果图法、正交表测试法、判定表法等。简单的说,这些设计方法的目的大致都可以归纳为:尽量覆盖到软件的各种情况。这正是因为黑盒测试存在一大软肋:不够“聪明”。由于不清楚软件内部结构,如果随机给出测试用例,那么将存在一个严峻的挑战:何时停止测试,才能保证找到大部分漏洞?而黑盒的优势则主要体现在:高可用性(虽然黑盒测试并不总是最佳选择,但在任何情况下它都不失为一种选择)、高可重用性(不对被测系统进行任何假设)、简单。1.2.3 灰盒测试灰盒测试总是介于白盒和黑盒测试之间,有种定义是:灰盒测试包括黑盒测试,再加上通过逆向工程(Reverse Engineering ,RE)获得的系统内部知识(逆向工程有时也称作逆向代码工程,Reverse Code Engineering ,RCE) Michael Sutton/Adam Greene/Pedram Amini. 模糊测试-强制发掘安全漏洞的利器. 电子工业出版社. 2013:Page 15。源代码是珍贵的资源,它易于阅读,并且提供了关于特定功能是如何实现的细节,以及还提供了特定功能需要的输入以及该功能与其产生输出的信息。但是,这并不意味着没有源代码就不能进行上面所述的这些分析工作,对编译后得到的汇编代码进行分析也能达到类似的效果。这就是我们所说的“二进制审计”在汇编级别而不是源代码级别进行安全评估。这种“混合”测试方法综合了前面二者的优点:较好的可用性和较高的覆盖率(我们可以给代码结构透明度和覆盖率划上约等于号)。当然我们不能否认这其中的困难在于如何进行逆向代码工程,作为一项专门技能,并不是人人都能掌握的。第二章 Fuzzing(模糊测试)2.1 初看Fuzzing2.1.1 定义Fuzzing(模糊测试)这个计算机术语在主流字典中根本就没有对应的解释。作为一个近些年出现的“新”技术,Fuzzing是一个比较宽泛的研究领域,在软件安全分析方向上是一种令人激动的技术,一经出现便大放异彩。在一款现今主流的开源FuzzerPeach的官网上有这样一句介绍:安全模糊测试(Security Fuzz Testing or Fuzzing)即运用数据变异(data mutation)的技术手段来软件(或协议)发现缺陷(flaws)和漏洞(vulnerabilities),黑客们通常利用Fuzzing技术去发现系统中的缺陷,从而发动0 Day(0 day是网络安全技术术语,特质被攻击者掌握却未被软件厂商修复的系统漏洞)攻击。 Peach Fuzzer Overview Datasheet : Security Fuzz Testing (Fuzzing) is used to find flaws and vulnerabilities in technology solutions through data mutation. Attackers use Fuzzing to discover system vulnerabilities that can lead to zero-day attacks.Fuzzing这个词最早出现在Wisconsin-Madison大学的一个研究项目中,此后该术语被用来描述软件测试的一个方法体系。 /wiki/Boundary_value_analysis现代Fuzzing,基本上指的是:通过向应用程序提供非预期的输入并监控输出中的异常来发现软件中的故障的方法。 Michael Sutton/Adam Greene/Pedram Amini. 模糊测试-强制发掘安全漏洞的利器. 电子工业出版社. 2013:Page 18典型的例子是Fuzzing利用自动化或半自动化的方法重复地向应用提供输入。Fuzzing不同于白盒测试那般大费周章的静态分析,逐行代码排查,也并非黑盒测试那样毫无目的性的“盲目”打探。用个形象的例子来说,模糊测试是一个强大测试“武器”,只用开启开关,整个测试过程完全自动化执行,所有漏洞都会乖乖的“束手就擒”,这就是Fuzzing的威力所在。用于Fuzzing的Fuzzer(模糊测试器)大体分为两类:一类是基于变异(Mutation-based)的模糊测试器,这一类测试器通过对已有的数据样本进行变异来创建测试用例;另一类是基于生成(Generation-based)的模糊测试器,该类测试器为被测系统使用的协议或是文件格式建模,基于模型生成输入并据此创建测试用例。2.1.2 发展历史最早的Fuzzing技术可以追溯到1989年,Barton Miller教授在他的高级操作系统课上开发了一个原始的模糊器,用来测试UNIX应用程序的健壮性。测试的关注点并不是评价系统的安全性,而是验证全部代码的质量和可靠性。尽管在该项研究的过程中,涉及到安全性问题,但是在对Setuid应用程序的测试中,并没有取得很大的进展。1995年,研究发现使用Fuzz测试,Setuid应用程序的可靠性得到改进,但该应用程序仍然具有“较高的失效概率。1999年,Oulu大学开始PROTOS测试集的开发工作。这项工作首先分析协议规约,再产生反规约或很有可能让协议无法正确处理的报文,开发出各种测试集。使用白盒和黑盒的混合测试方法,标志着Fuzzing技术的发展取得一个重要的里程碑,后来的工作中使用这样的方法发现了大量的故障。2002年,Dave Aitelt发布了一个开放源代码SPIKE5,采用GNU的许可(GPL)。Aitel模糊处理器实现一种基于块的方法,用于测试基于网络的应用程序。SPIKE2 Fuzz安全测试技术研究采用一种比Miller的Fuzzer更高级的方法,它的最显著的特征是包括可变长数据块。2004年,File Fuzz测试开始出现。接着Microsoft公司发布了MS04-28安全公告,详细描述了处理JPEG文件引擎中的一个缓冲区溢出漏洞。同年,MuSecurity公司开始开发一种硬件模糊装置,其目的是让网络中传输的协议数据发生变异。这个商业产品供应商的出现,恰好吻合当前人们关注Fuzzing技术的潮流。大量的开发者和安全领域的研究人员开始对Fuzzing技术感兴趣。2006年,ActiveX Fuzz测试开始流行,David Zimmer发布了COMRaider,HDMoore发布了AxManl6。这两个工具关注访问Intemet Exploer浏览器时能被Web应用程序实例化的ActiveX控件。ActiveX控件是优秀的Fuzzing目标,其中包括接口、函数原型和实际的控制逻辑,从而允许对其实施自动化的智能测试。 章烨. Fuzz安全测试技术研究. 西安电子科技大学. 2010. Page 52.2 深入Fuzzing可以这么说,Fuzzing技术的根本原理其实很简单,基本的思想是将随机数据作为程序的输入,并监视程序执行过程中产生的任何异常,记录下导致异常的输人数据,从而定位软件中缺陷的位置。因此,正如上文所介绍的Barton Miller教授的方法,真正的Fuzzing技术仅仅是一种简单的随机测试技术,但却能有效地发现许多程序中的错误。然而,当时早期的“Fuzzing技术”不可避免地带有随机测试产生的测试时间长,大量冗余测试输入,覆盖率低等缺点,并且这种模糊测试只能测试程序的初始状态,而很多程序特别是网络协议程序的很多错误是隐藏在程序的后序状态中的。2.2.1 Fuzzing步骤现代Fuzzing技术已经衍生出了很多分支方向,不同的Fuzzing方法应用于不同情况下的被测对象。可以说,没有所谓的一定正确的模糊测试方法,只有适合于某被测对象的模糊测试方法。但是,可以肯定的是,不论面对什么样的被测对象,其模糊测试过程一定有这么几个关键的步骤,这些步骤构成了模糊测试的核心特征:1.确定被测目标:被测目标不要局限于需要测试的目标应用,一款工程级别甚至是航天级别的应用,一般不会仅仅只包括应用程序,可能还会包括涉及的特定文件、库文件。这些并不起眼的包含文件,往往会成为决定应用安全的“命脉”。因为如果这些共享的二进制代码中存在安全漏洞,那么将会有更多的用户受到威胁。2.确定输入向量:从以往的经验来看,几乎绝大多数的安全漏洞都是由应用没有对用户的输入进行校验或进行必要的非法输入处理造成的。如果能准确的找到包括绝大多数情况的输入向量将会决定最后的模糊测试结果质量。这里提到的输入向量并非是具体的一个个输入实例,而是这些实例中包含的“元素”,例如:协议中包的头、请求中包含的文件名、环境变量等等。凡是用户可能发送的东西都应该视为潜在的模糊测试变量。3.生成模糊测试数据:有了需要输入的“元素”,即知道了需要输入哪些东西,就可以根据输入向量产生具体的输入实例,亦即这里的模糊测试数据。产生模糊测试数据的方法多种多样,例如最简单的预先设定好固定的值、基于存在数据变异产生的值、或是根据被测应用数据格式动态生成的值。需要注意的是,不论哪种方法,这个过程一定是自动化的,使用预先确定好的算法,因为这个阶段是一个冗繁和耗时的过程。4.执行模糊测试数据:从这个地方开始,模糊测试才真正进行,模糊测试工具会自动向被测目标发送之前生成好的模糊测试数据,直到应用崩溃或者人为、算法迫使其停止。5.监视异常:没有这个步骤,之前所有的努力都付诸东流,在测试的同时捕捉应用的输出变化与运行状态,一旦被测对象发生崩溃或者输出结果与预期结果不一致,这个时候造成这个结果的模糊测试数据就是我们最后得到的“结晶”。通过对这些模糊测试数据进行分析研究,就可以发现被测对象的安全漏洞。2.2.2 Fuzzing方法上文中我曾提到Fuzzer可以大致分为:“基于变异”和“基于生成”两个类别。其中,“基于变异”的Fuzzer是通过在已有的数据样本上产生变异来产生实际测试用例;“基于生成”的Fuzzer则是根据被测对象的格式和规则进行数学建模,通过算法来产生测试用例。在完成此篇论文前我仔细拜读了Michael Sutton的有关Fuzzing的著作模糊测试-强制发掘安全漏洞的利器,作为第一本Fuzzing方向上的专著,作者将Fuzzing方法科学地分为了五个大类:1.预生成测试用例:该方法首先需要深入研究被测对象,掌握被测对象支持的数据结构和合法输入值的要求、范围,根据这些知识性内容预先深层用于测试边界条件或违反规则的测试用例,利用这些测试用例对被测对象进行安全测试。该方法存在的最大问题就是预先设计这些测试用例成本高,并且重用性高、灵活性低。由于测试用例有限,一旦测试用例全部测试完毕,则整个测试过程也就结束了。2.随机生成输入:望文生义,这种方法最大的特点就是以一种完全随机的方式生成测试用例,虽然随机方法是最低效的方法,但这种方式却可以用来快速地识别被测对象中是否有非常糟糕的代码或者十分明显的漏洞。3.手工协议变异测试这种方法十分类似于介绍的第一个方法,但是,从“表面”上却比第一种方法要更低级,该方法不需要自动化工具,仅仅是通过测试人员自己去模拟Fuzzer,测试者不断输入不正确的数据,试图使被测目标崩溃,或是诱发其不正常行为。看似十分“原始”的方法,但在过去的一些经验中被证明是有效的,因为分析者能在安全审计中充分发挥自己过去的经验和“直觉”。这类测试方法也常用于Web应用的安全测试过程中。4.变异或强制性测试:该方法指的是Fuzzer从一个有效的协议样本或者数据格式样本开始,持续不断的打乱数据包或者文件中的每一个字节、字、双字、字符串。这是一种早期的Fuzzing技术,其优点在于不用对被测对象进行任何研究,并且实现一个基础的强制性Fuzzer也比较直接,只用修改数据并发送给被测对象即可。5.自动协议生成测试:自动协议生成测试是一种更加高级的强制性Fuzzing方法。这种方法需要对被测对象进行研究,掌握其协议规定或者数据定义,然后创建一个描述协议规定的文法,而不是直接生成测试用例,根据文法,Fuzzer可以动态分析包含了静态和动态部分的模板,生成模糊测试数据,将生成结果发送给被测对象。2.2.3 Fuzzer种类在探讨过了Fuzzing的不同方法后,本文这里在进一步对使用这些Fuzzing的Fuzzer进行分类和说明,因为在安全测试中,不同的被测对象不仅需要选择合适的Fuzzing技术,也需要选择对应的Fuzzer,才能达到理想的测试效果。1.本地Fuzzer:在UNIX世界中,Setuid应用程序允许一个普通用户临时获得更高的权限。这一功能使该应用程序成为一个显然的Fuzzing目标,因为Setuid应用程序中的任何漏洞都将使一个用户永久提升权限并执行他或他自己选择的程序。对Setuid进行Fuzzing有两个不同的被测目标。第一个目标是命令行参数的Fuzzing,关注的是在命令行中如何向Setuid传递变形的参数。第二个目标也是传递变形的参数,不过采用不同的方式。第二种目标下的变形参数是通过UNIX Shell环境传递的。下面我会分别介绍命令行和环境变量的Fuzzer。命令行Fuzzer:当一个应用程序开始运行时,通常要处理用户传递给它的命令行参数。现在来看下面的例子,该例子说明了命令行参数栈溢出的最简单形式:#includeint main(int argc,char *argv)char buffer10;strcpy(buffer,argv1);如果这个程序真的是Setuid,可以用本地Fuzzer对其测试。这里的问题是在源代码不可获得的情况下安全研究者如何才能在Setuid应用程序中找到更难以发现的Bug。这个时候最简单的解决方法就是使用Fuzzing。下面是一些有用的命令行Fuzzer:Warlock的clfuzz /cb/clfuzz.tar.gz:该工具是一个命令行Fuzzer,可用于测试应用程序中的格式字符串和缓冲区溢出漏洞。Adam Greene的iFUZZ http:/F:该工具也是一个命令行Fuzzer,同样可用于测试应用程序中的格式字符串和缓冲区溢出漏洞。包括对若干个不同参数的Fuzzing选项,并可根据应用程序的使用帮助信息智能地产生模糊测试数据从而对应用程序执行测试。环境变量Fuzzer:另一类本地Fuzzer涉及到环境变量向量,它也以Setuid应用程序为目标。考虑下面的应用程序,该程序不安全地使用了来自用户环境中的值:#includeint main(int argc,char *argv)char buffer10;strcpy(buffer,getenv(”home”);有好几种有效的方式可以对一个应用程序中的环境变量的使用进行Fuzzing,但是并没有多少自动化的支持工具存在,尽管这个过程很简单。许多安全研究者试图自行编写脚本来完成这任务,这也是公开发布的支持工具较少的部分原因。绝大多数情况下,本地环境变量Fuzzer并不是复杂到难以开发,因此许多这样的工具被开发并公开发行。下面是一些有用的环境变量Fuzzer:Dave Aitel的Sharefuzz /resources-freesoftware.shtml:这是第一个公开发布的可用的环境变量Fuzzer,它中途拦截对getenv函数的调用消息并且返回恶意数据。Adam Greene的iFUZZ http:/F:尽管它主要是一个命令行Fuzzer,iFUZZ软件包还包括了基本的环境变量模糊能力。iFUZZ使用与Sharefuzz相同的方法,并且比后者在使用过程中更容易被定制。文件格式Fuzzer:大量的应用程序必须在某个时间点处理文件的输入输出,不论是客户端还是服务器端都是如此。例如,反病毒网关通常需要解析压缩了的文件以诊断其中包含的内容。另一个例子是Office Productivity软件套件,它需要打开文档。当这些类型的应用程解析到恶意编撰的文件时,就有理由怀疑被分析的软件存在安全漏洞。文件格式Fuzzing的目的即在于此:文件格式Fuzzer动态创建变形了的文件,然后利用目标应用程序发起和处理这些文件。尽管文件模糊测试的具体方法严格讲与其它类型的Fuzzer存在不同,但是它们的总体思路是一致的。一些有用的文件格式模糊测试工具包括:Michael Sutton的FileFuzz http:/F:一个基于Windows图形用户界面(GUI)的文件格式模糊测试工具。Adam Greene的notSPIKEfile和SPIKEfile http:/F:基于UNIX的文件格式模糊测试工具,其中的一个基于SPIKE,另一个则不基于SPIKE。Cody Pierce的PAIMEIfilefuzz /downloads/detail/208:类似于FileFuzz,它是另一个基于Windows GUI的文件格式模糊测试工具,构建于PaiMei逆向工程框架的基础之上。2.远程Fuzzer:远程Fuzzer以侦听一个网络接口的软件为测试目标。基于网络的应用程序很可能是Fuzzing最重要的测试目标。随着Ineternet的发展,几乎所有的公司现在都会公开发布一些可被访问的服务器来提供Web页、E-mail、域名系统(DNS)解析服务,等等。这类软件中的漏洞为攻击者提供了访问敏感数据或对更可信的服务器发起攻击的机会。网络协议Fuzzer:网络协议Fuzzer可以被分为两个主要的类:以简单协议为测试目标的Fuzzer和以复杂协议为测试目标的Fuzzer。下面将分别介绍这两类Fuzzer的主要特征。简单协议通常只有简单的认证或根本没有认证。它们通常基于可打印的ASCII文本,而不是二进制数据。简单协议不包括长度或校验和字段。此外,典型的简单协议应用程序并不包含很多的状态。简单协议的一个例子是FTP。在FTP协议中,所有的受控信道中的通信多是以普通ASCII码文本的形式传输的。就认证而言,FTP只需要简单文本形式的用户名和密码认证。复杂协议典型地要包含二进制数据,偶尔包含人可读的ASCII码字符串。认证可能需要通过加密或某中形式的混淆来实现,其中可能包括多个复杂的状态。复杂协议的一个例子是Microsoft远程调用(MSRPC)协议。MSRPC是一个二进制协议,在数据传输之前需要执行若干个步骤才能建立起一个通信信道。协议需要长度描述域和分解域。总体上讲,它不是一个很容易实现Fuzzing的协议。下面是几个网络协议Fuzzing的有用工具:Aitel的SPIKE /resources-freesoftware.shtml:SPIKE是第一个公开发布的Fuzz框架。它包括好几种流行协议的预生成的Fuzzing脚本,同时也可以被作为一个API来使用。Michael Eddington的Peach http:/P/:一个用Python编写的跨平台的Fuzz框架。它非常灵活并且可用来对几乎所有网络目标应用程序进行Fuzzing。Web应用Fuzzer:Web应用程序已经成为访问后端服务的一种流行的便捷方式,这些后端服务包括电子邮件和计帐系统等。随着Web2.0的到来(先不论它究竟是什么),诸如文字处理等传统的桌面应用程序也开始向Web上转移10。在对Web应用程序进行模糊测试时,研究者主要考察Web应用所特有的漏洞,例如SQL注入、交叉站点脚本(XSS)等。这使得Fuzzer必须具备通过超文本传输协议(HTTP)进行通信以及通过捕获网络响应来分析安全漏洞的能力。下面是一些有用的Web应用模糊测试工具:OWASP的WebScarab /index.php/Fuzzing_with_WebScarab:一个开放源代码的Web应用程序审核套件,具有Fuzzing能力。SPI Dynamics的SPI Fuzzer /products/webinspect/index.html:一个商业的HTTP和Web应用程序Fuzzer,它包含在WebInspect漏洞扫描器之内。Codenomicon的Codenomicon HTTP Test Tools /products/internet/http/:一个商业用HTTP测试套件。Web浏览器Fuzzer:尽管Web浏览器Fuzzer在技术上只是一类特殊的文件格式Fuzzer,但是由于基于Web的应用程序的普及性,我们认为应该将它专门列为一类。Web浏览器Fuzzer通常利用HTML的功能来使Fuzzing的过程自动化。例如,lcamtuf的mangleme实用程序是最先公开可用的浏览器Fuzzing支持工具之一,它利用标签以自动的方式连续加载测试用例。这种Web浏览器具有的独特特征使得客户端的Fuzzer能够完全被自动化,并且不需要对应用程序进行任何复杂的包装。而对其它客户端的浏览器,这种包装则是典型的需求。Web浏览器Fuzzing不仅仅限于对HTML文本进行解析,还有许多其它的测试目标。例如,See-Ess-Ess-DieFuzzing工具能够对重叠样式表进行解析,另一个Fuzzing工具COM Raider则关注那些能够被加载进Microsoft Internet Explore的组件对象模型(COM)对象。其它可Fuzzing的元素包括图形和服务器应答头域。下面是几个有用的Web浏览器Fuzzing工具:lcamtuf的mangleme /projects/mangleme/:第一个公开可用的HTMLFuzzer。它是一个CGI脚本,可反复发送打乱了的HTML数据到一个浏览器。H.D. Moore和Aviv Raff的DOM-Hanoi /users/hdm/tools/domhanoi/domhanoi.html:一个DHTMLFuzzer。H.D. Moore和Aviv Raff的Hamachi /users/hdm/tools/hamachi/hamachi.html:另一个DHTMLFuzzer。H.D. Moore、Aviv Raff、Matt Murphy和Thierry Zoller的CSSDIE /users/hdm/tools/see-ess-ess-die/cssdie.html:一个CSSFuzzer。David Zimmer的COM Raider /software/Fuzzing.php#more_comraider:一个易于使用、GUI驱动的COM对象(ActiveX控件)Fuzzer。3.内存Fuzzer:有些时候在测试过程中存在一些困难阻碍了Fuzzing的快速有效进行。这时候内存Fuzzer就可能会派上用场。内存Fuzzer的基本思想是简单的,但是开发一个合适的实现工具却不是一件容易的事。有一种实现方法涉及到冻结进程并记录它的快照,以及快速将故障数据注入进程的输入解析例程。在每个测试用例被执行之后,以前所记录的快照被存储下来并且新的数据被注入。上述过程反复进行直至所有测试用例都被穷尽。4.Fuzz框架:Fuzz框架不同于之前所说的Fuzzer,它不仅可以对多个不同目标进行Fuzzing,同时也包括一些其他的功能而并不只是局限于Fuzzing。fuzz框架其实就是一个通用的Fuzzer或Fuzzer库,它简化了许多不同类型的测试目标的数据表示。典型地,Fuzz框架包括一个库用来产生Fuzzing字符串或者通常能够导致解析例程出现问题的数据值。此外,典型的模糊测试框架还包括一组例程以简化网络和磁盘输入输出。Fuzz框架还应该包括某种脚本类语言,以便在创建具体的Fuzzer时使用。需要重点指出的是,一个成熟的fuzz框架应该具有以下几个模块:原始数据定义模块:一般都需要测试人员自己完成,比如定义原始数据包格式或者文件格式等;数据加工(变异)模块:用来在原始数据定义的基础上,衍生出成千上万的测试用例,如畸形文件或者畸形数据包等;测试逻辑:用于运行目标程序,发送测试用例,关闭目标程序。如果测试协议的话,发送测试用例有可能需要模拟若干次用于握手的数据包;测试GUI程序的文件格式的话,说不定还要模拟鼠标点击等;错误监测与日志模块:在测试过程中,监测一切相关进程的各种exception、crash等信息,并在错误发生时保存现场,记录对应的case,栈信息,寄存器信息等重要状态,以备后面的分析之用。Fuzz框架是流行的,但它绝对不是完全充分的解决方案。到目前为止前面提到的许多Fuzzer实际上是Fuzz框架,包括SPIKE和我们后面着重讨论的Peach。第三章 Peach框架3.1 认识Peach 3正如上文介绍,由IOACTIVE所发布的Peach是一个采用Python(3.0后为C#)语言编写的跨平台的Fuzz框架,其测试对象几乎包括了所有常见的Fuzz对象,例如文件结构,com,网络协议,API等。它最初是于2004年发布的,在3.0版本以前均是由Python编写,到3.0版本后移植到了C#上。本文后半部分就是以Peach C#开源版本Peach-2-source为研究对象,来进行架构分析和功能改进。Peach是一个开源框架,并且具有开放式的许可。同其它可用的fuzz框架相比,Peach是可证明的最为灵活的一个框架,并且最大程度的促进了代码的重用。正如Peach Fuzzer官网首页一段醒目的标题作为自我介绍:“Peach Fuzzer是一个先进并且可拓展的Fuzzing平台。该软件使安全顾问,产品测试,以及企业质量保证团队使用自动生成和突变的方法来发现软件中的漏洞。” http:/P/Peach作为一款现代化的安全Fuzzing软件,不仅仅可以实现最基本的Fuzz测试,进行漏洞查找,同时融合了监测、漏洞分析、代码优化等功能的一体化式综合测试软件。Peach最大的特点在于Peach pits文件。Peach把用于数据定义的文件叫做Peach pits文件。使用Peach时,实际上主要工作就是定义这样一个xml文件指示Peach测试平台去做测试。通俗的说,我们把我们构思好的“Fuzz方案”用这个xml文件传达给Peach 测试平台。例如对于一个网络协议,这个“Fuzz方案”可以包括:网络包的结构(包含哪些字段,分别是什么数据类型,包的组织结构等)、需要发生变异的包字段、变异的策略、测试的逻辑、监测被测目标的反应(监测Crash)等等。基于Fuzz的协议测试是网络安全研究领域的重要技术之一。虽然,目前有很多成熟的商用软件并不开源,在开源领域中也有很多的社区,其中Peach就是一个非常活跃的社区,很多研究人员的研究成果也促进了Peach的发展。本文剩下的部分主要以Peach为例,从源代码出发,分析其代码框架以及运行原理,深度挖掘其Fuzz测试核心原理。最后在原有基础上提出了对Peach框架的改进意见和方案。3.2 使用Peach 3Peach提供了一种定义数据应生成格式和以及如何、何时生成的模糊化的数据的方法。从本质上来说,正如我们之前所说,Peach实际上是一个Fuzz框架,而并非一个Fuzzer,因为通过设计编辑一份称作Peach pits的XML文件作为“对被测对象的描述和测试的具体要求”,来实现对被测目标“个性化”的Fuzzing,这里的“个性化”包括(括号里对应的是Fuzz框架的基本特点):被测对象数据格式的自定义(原始数据定义模块)、选择合适的数据变异方式(数据加工(变异)模块)、具体测试逻辑或者状态跳转的自定义(测试逻辑)、以及特殊定制的被测目标监控模块(错误监测与日志模块)。特别强调:这些功能可以全部通过Peach pits文件来实现,这是Peach框架的一大优点,或者准确的说是一大特点,因为这样也会带来一些棘手的问题,例如前期XML文件的设计工作会变得十分复杂。下面会简要介绍Peach框架下Peach pits的设计规则,以及一些在开发设计中的一些实例。3.2.1 Peach pits的设计规则Peach pits文件包含了所有Peach在执行Fuzzing测试时所需要的信息,需要用XML来编写。当对某个目标进行Fuzzing的时候即需要创建一个Peach pits文件。Peach pits文件中包含了这样几个重要的部分:General Configuration、Data Modeling、State Modeling、Agents and Monitors、Test Configuration。学习过XML的人都清楚XML是一门标签语言,所有数据与逻辑均有一对对可嵌套的标签来实现。同样,上面介绍的这些模块也是由一个个标签元素构成,标签元素的关键字均是由Peach框架指定的特殊关键字。1.General Configuration:Peach pits文件中的第一部分就是General Configuration(通用设置),在这个部分里,说明需要引用的外部模块、配置默认属性、设置python模块路径、以及导入自定义代码。2.Data Modeling:Peach pits文件中至少包含了一个或者更多的数据模型,这个一个数据模型描述了数据的类型信息、关系(数量、大小、位移)、以及其他允许Fuzzer对其进行智能变异的信息。在Data Modeling中,用标签来描述一个数据模型,被定义的数据模型可以被其他的数据模型多次重用或者引用,这样做的好处在于可以将数据模型的定义模块化,使其更具可读性。3.State Modeling:在Peach中,两个核心的模块构成了一个Fuzzer,一个是上文所介绍的数据模型,另一个就是状态模型(StateModel),或者我更倾向于称为逻辑模型。在逻辑模型中再现了一个用于测试网络协议的基本状态机逻辑。逻辑模型定义了如何向被测目标发送和接收数据。需要提到的是,逻辑模型并不一定必须设计的十分复杂,Peach官方文档中推荐我们在设计逻辑模型的时候尽量使逻辑模型更简单,并且更易于扩展。同样的,在State Modeling中

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论