首页
社区
课程
招聘
[技术专题]软件安全测试(fuzz)之大家一起学1: fuzz platform架构
发表于: 2008-10-21 00:14 23723

[技术专题]软件安全测试(fuzz)之大家一起学1: fuzz platform架构

2008-10-21 00:14
23723

待到秋来九月八,我花开后百花杀

最近应一个会议的邀请,需要准备一些关于security testing的东西,fuzz技术作为工业界普遍采用的有效测试方法,当然是非常重要的一块。

很多朋友给我反馈说《0day安全:软件漏洞分析技术》中测试方面讲的一带而过,太薄太弱。于是我想顺便把这些东西总结一下,也作为《0day》第二版的一个主要更新的章节。(另一个主要更新将是vista的安全机制剖析与VS2005中的安全编译选项)

开始之前声明下,这些知识的一个很头疼问题就是文档不全,寡人一个人势单力薄,很难全面掌握,只是写出自己工作和学习中的一些经验体会。这次系列教程想做成类似讨论的形式,大家在学习完一节后自己又发现什么tips和诀窍的话,希望能在跟贴中拿出来一起分享,一起进步。

独乐乐,与人乐乐,孰乐?

大概准备分成以下几个部分来讲这块内容:

第一讲:fuzz platform的架构与peach的入门
第二讲:PNG文件格式fuzz实验1——数据定义
第三讲:PNG文件格式fuzz实验2——drop evil file
第四讲:PNG文件格式fuzz实验3——monitor exception
第五讲:PNG文件格式fuzz实验4——handle GUI problem
第六讲:网络协议fuzz实验
第七讲:…如果寡人还活着,且还有力气的话…

这是个构思,还没有成为现实,而且能有百分之多少成为现实,咳咳,我也说不上来。另外教程中给出的都是最简单的fuzzer,不要指望直接把这些代码跑起来就能得到0day。However,完成实际fuzzer的知识点将被尽可能多的覆盖到。

开始前在说一句:来听寡人在这里鸡歪的朋友应该至少理解了《0day安全:软件漏洞分析技术》中前5章的内容,否则建议还是先去学下那些基本原理,要不然辛辛苦苦crash了软件,连是defects还是vulnerbility都分不清楚。

按照对能力的要求,个人认为 漏洞挖掘 >漏洞分析>漏洞利用

言归正传,今天第一次,从最基本最简单的开始。

忽略fuzz的历史渊源之类的东西,愿意了解的去翻下0day第16章,稍微写过一点。多罗嗦一句,加上自己的一点感触:成熟精准的fuzz测试应当算是种介于白盒和黑盒之间的灰盒测试吧。

一个成熟的fuzz platform应该具有以下几个模块:

1:原始数据定义模块:一般都需要测试人员自己完成,比如定义原始数据包格式或者文件格式等
2:数据加工(变异)模块:用来在原始数据定义的基础上,衍生出成千上万的测试用例,如畸形文件或者畸形数据包等
3:测试逻辑:用于运行目标程序,发送测试用例,关闭目标程序。如果测试协议的话,发送测试用例有可能需要模拟若干次用于握手的数据包;测试GUI程序的文件格式的话,说不定还要模拟鼠标点击等。
4:错误监测与日志模块:在测试过程中,监测一切相关进程的各种exception、crash等信息,并在错误发生时保存现场,记录对应的case,栈信息,寄存器信息等重要状态,以备后面的分析之用。

说的简单点,fuzz就是要自己写个数据格式的模板,然后让platform按照这个模板衍生出许多evil的数据,然后把这些数据丢给想测试的程序,看他们崩不崩。。。

在这四大块中,“数据变异模块”和“错误检测与日志记录模块”应当由fuzz platform提供
数据定义一般得由测试人员自己来写。最终的fuzzer能不能找到问题,能不能找准问题的关键就在这里。你对数据结构理解的越深,对程序思考的越多,写出来的fuzzer就越高效。

测试逻辑一般有测试人员部分完成。最简单的就是一条命令run 某个程序把测试用例跟在后面当参数。要是协议,就得加上若干个send revive和状态判断逻辑了,遇到GUI的话可能还得去模仿鼠标点击。

优秀的fuzz platform应当提供方便的数据衍生变异功能。在《0day》中简单介绍过使用C语言的SPIKE。在这个教程中我将着重介绍另外一个非常优秀的fuzz platform——peach(这里我就不把它僵硬的翻成蜜桃了)

Peach使用Python编写,开源,你甚至可以为它随意添加模块,扩展出更强大的功能。前面提到的四个部分在peach platform中结构清晰,功能明确。Peach的测试对象包括了几乎所有常见的fuzz对象,例如文件结构,com,网络协议,API等等

今天第一讲,我们就来简单的认识一下这个platform,以后的实验也会基于这个platform来讨论。

Peach的作者是Michael Eddington,不知道peach这个名字的来源和他的大肚子有没有关系,呵呵。首先去网站下载peach:

http://peachfuzzer.com/

下载,安装,注意安装前需要若干python的preinstall,缺的话自己去找来下

假设安装目录是c:\peach

打开安装目录可以看到有一个sample子目录,里面有若干个.xml文件。

使用Peach时实际上主要工作就是定义这样一个xml文件指示platform去做测试。Michael Eddington把这样的xml代码文件叫做peach pit。

用XML编辑器或者直接用VS2005(推荐用VS哦,后面会告诉你为什么)打开这些文件中的任何一个,可以发现peach pit文件实际上很简单,基本上总是包含以下这几个部分:

<?xml…版本,编码之类…>
<Peach …版本,作者介绍之类…>
        <Include ...注意有两个文件是永远都要被包含进来的/>

        <DataModel >
                …原始数据结构定义…
        </DataModel>

        <StateModel >
                …测试逻辑,如收到什么样的数据包之后,发出什么样对应的数据包…
        </StateModel>

        <Agent >
                …检测exception,crash等…

        </Agent>

        <Test >
                …指定将要使用到的state,agent,publisher等…
        </Test>

       
        <Run >
                …Fuzzer执行的进入点,相当于main吧…
        </Run>

</Peach>

1:整个文件被一个“大”标签<Peach>        </Peach>括着
2:文件中的第二级标签包括Include,DataModel,StateModel,Agent,Test,Run共6种。(这六种标签并不是全部必须的)
3:Include包含的外部文件,其中defaults.xml和PeachTypes.xml是必须的,里边含有peach的基本方法,类,数据类型等等
4:DataModel用于定义数据结构,此标签下有下级标签若干级、若干种。使用这些子标签可以轻易的定义数据的类型,长短,各个数据块之间的关系,甚至CRC校验之类的东西也能轻易的定义进去。可以定义多个DataModel,多个DataModel之间可以有关系也可以根本无关。后续文章会着重讲解。
5:StateModel用于定义测试的逻辑,实际上就是一个状态机。下属标签包括state,每个state中又可以包含若干个action标签。State表示一个状态,不同的state之间可以根据一些判断条件进行跳转。Action用于执行打开文件,发送数据包之类的命令。后续文章会着重讲解。
6:Agent是一个稍微复杂点的概念,其中一个非常重要的功能就是用来监测crash等。今天的讲座中暂不涉及,在后面稍微高阶点的应用讨论中会集中讲解
7:Test这个标签域相当简单,一般只是制定使用哪个Agent,哪个StateModel,用什么方法发数据(网络还是文件?),有时还会在这里指定使用什么方法加工(变异)数据
8:Run应该是最简单的标签了,有点像我们熟悉的main函数,指定当前这次fuzz测试使用那个Test。

对照我们上面的这个简单介绍,我们先high  level的看一下samples目录下那个最最简单的HelloWorld.xml吧。

Include 标签和前面那些介绍版本信息和作者信息的飘过不说了。
DataModel就定义了一个字符串,“Hello World!”
StateModel中只有一个状态,当然也就不存在状态转换之类的工作了
由于实在太简单,这里根本不需要Agent了
再看Test,看标签里边的第二行,Publisher有很多种类,代表把我们加工好的畸形数据(测试用例)往哪里丢,这里的stdout表示直接屏幕输出,常用的还有文件输出,socket输出等等。
最后的run是最没啥好看的,不说了。

我们要做的就是运行下这个Peach Pit文件
C:\peach\peach.py C:\peach\samples\HelloWorld.xml

我们可以看到屏幕上一开始打印“Hello World!”,之后Peach会以这个原始的字符串为模板加工出许许多多畸形的数据出来,包括了超长串,NULL结束符缺失的非法串,重复,格式化串等等等等有可能引起程序出错的,然后依次打印出来。

这个helloworld基本演示了peach pit文件的基本结构和peach运行的框架,随着我们介绍的深入,我们会一点一点讨论到扩展出一个能够实际应用的peach pit出来,如果可能的话,还会再讨论一些扩展Peach的话题。

有点困了,下次见吧,如果等不急就去peach的网站看  Tutorial或者samples文件夹下面的代码吧。下次我们集中讲数据的定义,并且要定义出一个PNG文件模板出来。

临睡之前,再挣扎着说几句闲话。组里最近招人,于是到咱的招聘版上发了个job description。
http://bbs.pediy.com/showthread.php?t=74635
如果有朋友感兴趣,可以直接找我,免得去ChinaHr海投被别的简历给淹了。。。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (29)
雪    币: 7309
活跃值: (3788)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
2
严重学习一下
太晚了,明天再看
2008-10-21 00:44
0
雪    币: 334
活跃值: (22)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
支持,学习,膜拜
2008-10-21 00:54
0
雪    币: 47147
活跃值: (20445)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
4
感谢failwest再次出手!又是一套宝贵的技术学习资料。
2008-10-21 07:55
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
学习
Peach好大的源码包。。。最好是默认路径安装,否则会找不着图标文件,不知会否还有其它问题
2008-10-21 09:05
0
雪    币: 233
活跃值: (15)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
是啊,又见LZ,必学之!
2008-10-21 09:11
0
雪    币: 8209
活跃值: (4518)
能力值: ( LV15,RANK:2473 )
在线值:
发帖
回帖
粉丝
7
python还没学会,看来还学不了这个啊
2008-10-21 09:44
0
雪    币: 2056
活跃值: (13)
能力值: ( LV13,RANK:250 )
在线值:
发帖
回帖
粉丝
8
左盼右盼,终于又等到failwest出手了,激动啊!
2008-10-21 10:06
0
雪    币: 12
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
来学习了
2008-10-21 11:29
0
雪    币: 2056
活跃值: (13)
能力值: ( LV13,RANK:250 )
在线值:
发帖
回帖
粉丝
10
Fuzz的内容,我喜欢。

貌似Peach的最新版本是Peach-2.2-BETA2,在安装之前需要先安装ActivePython-2.5,下载地址:http://downloads.activestate.com/ActivePython/windows/2.5/ActivePython-2.5.2.2-win32-x86.msi
2008-10-21 13:06
0
雪    币: 690
活跃值: (1826)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
11
学习。。。。。
2008-10-21 13:11
0
雪    币: 249
活跃值: (35)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
12
大手笔~! 跟住
2008-10-21 16:53
0
雪    币: 251
活跃值: (25)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
13
本人还没学会Python,郁闷
2008-10-21 19:27
0
雪    币: 62
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
lz:高手中的战斗机
2008-10-22 00:44
0
雪    币: 333
活跃值: (11)
能力值: ( LV12,RANK:770 )
在线值:
发帖
回帖
粉丝
15
圣人说,做人要厚道,厚道要顶啊
2008-10-24 09:29
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
请楼主帮我解决问题,或者给个建议:

Paimei当中有个struct_spy.py文件专门用来监控某个结构(struct)中的变化。
但是,我发现其捕捉不到由PAGE_GUARD带来的异常。

我给出了一个简单的例子,来运行struct_spy.py:
其命令行参数是:
ea_end_example.exe 0x00401048 eax 10
该程序附在下面。
http://www.live-share.com/files/377852/Paimei_old.rar.html

请高手给我指导。

另外,该代码在windows 2000, windows xp下面都进行了测试,都捕捉不到由PAGE_GUARD带来的异常。

另外,我通过PAGE_NOACCESS代替PAGE_GUARD的方法可以触发并捕捉到相关的异常,但这个方法需要做很多其他的工作。
2009-1-31 21:20
0
雪    币: 267
活跃值: (24)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
17
最近正在研究peach想研究好了写几篇文章出来!
2009-12-26 10:44
0
雪    币: 108
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
夜深了,明天仔细看看
2009-12-28 00:18
0
雪    币: 1585
活跃值: (182)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
膜拜一下,呵呵
2010-6-7 11:07
0
雪    币: 266
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
mark 一下下
2010-10-27 15:11
0
雪    币: 61
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
需要安装哪些Python的preinstall?
是不是vxasm说的ActivePython?
2010-11-16 17:19
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
非常感谢failwest 总是能分享些这么好的资料~
2011-6-28 10:58
0
雪    币: 42
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
收藏了 改天看。。。。
2011-6-28 15:34
0
雪    币: 310
活跃值: (159)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
24
好文章,要支持下,!
2011-7-28 22:33
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
什么时候能到此水平啊,学习学习!!
2011-12-18 07:35
0
游客
登录 | 注册 方可回帖
返回
//