尹誉衡
(华北计算技术研究所, 北京 100089)
互联网技术的不断发展,不仅使得计算机网络成为人们工作和生活不可或缺的部分,也使得针对互联网的网络攻击不断增多[1]。但由于各种原因,如网络协议本身在设计和实现时比较复杂,程序的开发人员使用网络协议进行程序处理时可能会设立不合适的假设前提及进行不适当的逻辑处理[2],安全工作者时常会发现与网络程序相关的漏洞。
网络程序漏洞种类丰富,难以防御,再加上这类病毒具备依托于网络进行传播的特性,所造成的损失也是十分巨大的。2003年,在Windows系统之间散播的冲击波蠕虫病毒至少攻击了全球80%的Windows用户[3],2007年,被具有强大破坏能力的熊猫烧香病毒感染的个人用户高达几百万,恶意攻击者利用网络对互联网上的设备发动远程攻击,规模巨大,直接影响到了整个互联网的安危[4]。
为了降低网络攻击对互联网的影响,安全从业者应当及时挖出漏洞,并发布补丁,保障网络世界的安全,这对互联网的良好发展有着十分深远的意义。
本文重点研究了基于Fuzzing的网络协议漏洞挖掘技术,采用对智能工具Sulley进行改进的方法,设计了变异规则和系统构成,对FTP协议进行Fuzzing测试,通过搭建模拟环境进行实验证明了该方法的有效性。
对网络协议进行分析是网络协议漏洞挖掘中的重要一环[5],通常采用截获网络通信流量,分析网络数据包,进而分析网络协议,挖掘网络协议漏洞的方法,对网络协议进行漏洞挖掘。其步骤如下。
(1) 获取测试目标的通信流量。在截获流量后,可以通过改变输入过程中的一项或几项重要参数,发送给测试目标,观察测试结果。这种改变流量的方式对网络协议结构的分析会起到很重要的作用,尤其是对未公开的协议[6],比如可以通过改变用户名和密码等输入参数来改变流量,从而分析协议。
(2) 流量分类。在对流量进行分类时,通常会按照流量的功能不同来对流量分类。一般来说,基本功能大致相同的函数所生成的网络流量通常会是比较相似的,所以在进行网络协议分析时,是可以按照流量的功能来对流量进行分类的。
(3) 分层分析。TCP/IP协议中的传输层记录的是端口信息,通常是固定的,可以作为流量识别的特征,但是P2P类型的软件,使用端到端的流量传输方式,就不能将端口作为识别特征。不同的软件在进行传输的过程中通常会在应用层才体现出差别,通过分析应用层协议报文,获取流量指纹特征并加以分类,就可以更好地区别软件,所以实际上分析网络协议相当于分析应用层协议。
Fuzzing技术是一种快速有效发现程序漏洞的方法,通过在程序外部输入非常规数据引起程序崩溃,并跟踪程序执行输入的过程,挖掘引发程序崩溃的漏洞[7]。但是在网络协议漏洞挖掘过程中,如果采用变异的用例生成方法,通常会面临测试用例无法通过校验的情况,从而导致大量的用例无法使用,造成时间和资源上的浪费[8]。目前Fuzzing在漏洞挖掘领域中被广泛应用,比如通过构造畸形数据的文件对文件操作软件进行Fuzzing,从而发现文件操作软件的漏洞。
与其他的漏洞挖掘方法如代码审计、静态分析、动态分析等相比,Fuzzing有许多其他方法不具备的优点[9]:(1)Fuzzing可以是一种黑盒测试方法,不需要源代码即可对软件进行分析;(2)Fuzzing的使用可以不用关心被测对象的实现语言、运行平台等细节。(3)Fuzzing的可重用性较好 , 一个测试用例可用于多个同类型对象。
Fuzzing技术步骤如图1所示。
图1 Fuzzing步骤
(1) 确定测试对象。确定了测试对象后才能选择测试方法和工具,对于测试对象,需要明确是否开源、是否掌握测试对象的输入输出格式、是否有已知漏洞、已知漏洞的触发方式和触发点等信息。
(2) 确定测试对象的输入。通常要触发目标软件的漏洞,就需要构造非预期的输入数据,当目标没有对输入进行有效的检验或是没有相应的适当错误处理时,就会引起目标软件出错。Fuzzing是一个构造非预期输入来测试目标软件的过程,要想高效地进行Fuzzing,就需要构造有针对性的数据输入,减少无效测试的次数,提高Fuzzing的效率。
(3) 生成测试数据[10]。根据用例生成采用的不同算法可分为两类生成方法:基于变异的方法和基于生成的方法。基于变异的算法是指通过特定的算法按照一定的规则修改样本中的某些数据,生成一批非常规的样本,而基于生成的算法则是不需要合法样本就自动生成一些非常规的数据样本,这个生成过程通常采用自动化的方式生成。
(4) 执行测试数据。通常情况下,执行完Fuzzing用例生成的过程就会立即执行Fuzzing执行的过程,所以通常会以自动化方法实现用例执行的过程。如果采用手动执行的方式,不仅工作量巨大费时费力,还容易出现误差。
(5) 监视异常。异常检测是在Fuzzing过程中,软件执行输入数据后,检测目标软件的执行情况,跟踪软件是否崩溃,是否抛出异常,记录所有异常信息的过程。
(6) 分析测试结果。根据异常信息进行人工分析。
系统设计是基于智能测试工具Sulley进行的,通过对Sulley对网络协议进行Fuzzing的改进和扩展,开发了一种针对FTP[11]协议的模糊器。首先通过变异器生成输入数据,通过流量截获模块截获流量数据包,再通过数据包分析模块分析网络协议,确定数据入口,最后通过会话管理模块连接目标,开始Fuzzing测试。系统架构如图2所示。
图2 系统架构
流量截获模块:针对网络协议的漏洞挖掘,需要有原始的数据包作为样本进行分析。设计流量截获模块,通过tcpdump和wireshark等工具获取FTP客户端与服务器之间的通信流量。
数据包分析模块:流量获取之后内容繁多,需要对流量进行清洗,分析有效字段,确定协议数据输入入口。
数据生成模块:相较于基于生成的测试用例生成方法生成的测试用例,基于网络协议通信数据进行变异的测试用例可以更有效地发现漏洞。因此在分析网络数据包的基础上,对输入样例进行字符变异和宽度变异操作,从而获得所需的测试用例。
会话管理模块:该模块从数据生成模块处获取测试用例,将其作为输入发送给服务端,从而引起服务端的错误。
变异器的作用是分别对网络协议中数值类型和字符串类型的协议字段进行变异和模糊处理,在具体设计中为了确保Fuzzing的有效性,需要重点考虑模糊次数的有限性。
(1) 数值模糊的方法
数值模糊是指根据协议中的数值字段的初始值来确定变异范围。比如,数值字段的初始是200,那么变异范围在初始值-100和+100的范围内,即在闭区间[100,300]内取值。
实现的方法步骤如下。
1) 根据数值字段初始值V,确定变异范围 [V-100,V+100];
2) 确定变异函数y=logax+b;其中,a和b使用伪随机算法获得,以确保变异策略多次运行可产生不同的变异值。
3) 通过已确定的变异函数,使用变异范围[V-100,V+100]的边界值V-100、V+100和式x=ay-b计算x的取值范围[X1,Xn]。
4) 根据设定的变异次数C={5,10,50,100},计算x在[X1,Xn]范围内的取值。例如,C=5,计算步径L=[Xn-X1]/5,那么x的取值分别是{X1,X1+L,X1+2L,X1+4L,Xn}。
5) 最后根据确定的变异函数,计算y值,即为最后的变异值。
使用对数函数的取值方法可保证模糊数据具有一定的变化速度和覆盖宽度。
(2) 字符串变异方法
字符串变异方法主要采取字符替换和宽度变换,或将两种方式结合使用的方式模糊已知的初始字符串。
字符替换需要基于样本文件来实现,通常测试工具自带样本文件,测试人员也可以自备样本文件。字符替换变异测试用例生成操作过程,如图3所示。
图3 字符替换变异流程
例如,初始字符串值S1为“AABBCC1234”,自定义变异样本S2为{“%”,“&”,“#”,“@*”,“000”,“233”},跳变长度L为3,迭代次数N为4。变异器生成随机值S2_N(假设为2),并从变异样本S2中先后随机抽取S2_N次值如“#”“%”将初始值替换为“#AB%CC#23%”,再将迭代次数减1,则再迭代3次,最终得到变异字符串。
宽度变异指将初始字符串的长度翻倍,倍数由测试人员确定,例如,初始字符串为“AABBCC”,设定长度倍数是3,则生成的变异字符串为“AABBCCAABBCC”。
当需要将字符变异和宽度变异两种方式结合的时候,默认先进行宽度变异,再进行长度变异。
本文采用一种基于Fuzzing的网络协议漏洞挖掘方法,通过对Sulley智能工具进行改进,以FTP服务器作为实验对象,对FTP协议进行漏洞挖掘,实现了FTP的漏洞挖掘系统。
实验测试对象为Uplus FTP Server。Uplus FTP Server是一款FTP文件服务端软件,支持标准的FTP协议,提供FTP文件传输服务,运行平台为Windows系列操作系统。
测试环境安装在虚拟机上,使用两台安装了Windows7操作系统的虚拟机,一台作为服务端,一台作为客户端。
在服务端正常安装并配置启动Uplus FTP Server,开放端口21。使用终端窗口连接服务端,如图4、图5所示。
图4 FTP服务端开启
图5 FTP客户端连接
根据图3所示的系统架构,在理解FTP规范的基础上,首先截获FTP协议通信流量,再通过数据包分析模块提取FTP流量,根据协议格式拆分数据包,提取原始输入集,确定数据输入入口,最后根据设定的变异规则使用数据生成模块来对输入进行变异,生成测试数据集。FTP数据报文格式如图6所示。
图6 FTP数据包报文格式
启动Uplus FTP Server,使用终端连接服务器,执行测试用例。本次实验使用mkdir和delete两个命令分别进行3次实验,执行成功后结果将返回至客户端,记录到日志中。
日志结果记录如图7所示。
图7 日志结果记录
从日志中可以观察到,mkdir命令有失败记录,输入的测试用例是200个“A”。基于此,手动构造宽度变异测试用例,进行多次实验,得出以下结论:测试用例长度超过400个字节时,被测目标返回“拒绝访问”;测试用例长度超过4 000个字节时,被测目标不再返回响应码,停止工作。
本文首先介绍了网络攻击的危害性和进行网络协议漏洞挖掘的重要性。然后对网络协议分析技术和Fuzzing技术进行了研究。第三部分设计了一种基于Sulley进行改造的Fuzzing测试系统,设计了各部分的功能模块。最后通过对FTP服务器的测试,证明了该方法的有效性和正确性。今后将加强对未知和加密协议格式自动识别方法的研究,一方面通过基于数据流的协议格式分析技术来获取未知协议的格式,以作为Fuzzing输入来对未知格式的网络协议进行漏洞挖掘,另一方面,利用中间人攻击和CA证书伪造技术的共同作用,对加密协议的原报文进行读取与解密,从而实现对加密协议的协议格式分析。通过分析未知格式协议和加密协议,提高系统的使用覆盖面,从而加强系统的智能化和自动化程度。