1.基于流量重放的工控协议模糊测试方法,其特征在于:以工控设备运行环境的真实协议流量数据为基础,通过配置文件格式和工控协议报文定义格式,构建对应的协议解析器,提取设备协议状态报文,对用户指定工控协议字段进行模糊化,封装和重放报文,从而快速进行工控协议模糊测试。
2.根据权利要求1所述的基于流量重放的工控协议模糊测试方法,其特征在于具体步骤如下:步骤1:配置文件读取;
首先读取用户填写的配置文件,其中包含需要测试的设备目标IP、指定设备所用的协议、指定重放的报文文件路径、工控协议报文格式文件路径、指定模糊测试的工控协议数据字段以及模糊测试的次数;
步骤2:协议解析器构建与协议解析;
根据配置文件中指定的协议,读取相关的协议报文格式文件,构建协议解析器;协议解析器通过读取测试协议相关的报文格式定义文件,构建协议树状结构,树状结构中的节点包含协议字段长度、字段类型、字段名称;最后使用协议解析器解析报文;
步骤3:测试协议相关报文提取;
已有的报文被加载后并不能直接用于测试,需要过滤其中不相关报文,为之后报文变异做准备;
步骤4:连接目标设备;
根据配置中指定的协议、目标IP,建立与目标之间的Socket连接,同时设置连接超时时间T,如果无法建立连接,将错误信息写入日志;
步骤5:设备存活确认;
在每次测试前,使用ICMP Ping报文确认设备处于工作状态;如果设备无响应,表明测试用例导致设备出现无响应,将异常测试用例保存;
步骤6:工控协议数据字段模糊化;
在测试报文发送到目标设备前,需要根据配置文件中指定的协议字段变异;针对协议字段的类型不同进行使用不同的变异方法,字符串类型字段使用开源工具RADAMSA,数值型字段使用随机数字;
步骤7:模糊测试报文封装和重放;
将变异后的测试用例组成新的报文发送到目标设备,等待设备响应,因为变异后的测试用例可能会被设备拒绝,如果出现连接重置,那么跳过当前测试用例之后的报文,重建与设备的连接,进入下一次测试。
3.根据权利要求2所述的基于流量重放的工控协议模糊测试方法,其特征在于步骤1具体实现如下:步骤1.1使用配置解析器加载配置文件;首先根据传入的配置文件路径configPath打开配置文件,将读入的字节传入Python语言自带的json解析库函数,输出Python语言的字典类型表示配置信息config;
配置文件格式:字段的键在分号前,字段的值在分号后,其中配置文件必须包含字段:设备所用的工控协议protocol、目标设备IP地址dstIp、重放报文文件路径pcapPath、工控协议报文格式文件路径protocolPath、指定需要模糊测试字段fields、模糊测试次数count,模糊测试字段fields由数组表示,数组每个元素都指定需要进行变异的工控协议数据字段。
4.根据权利要求3所述的基于流量重放的工控协议模糊测试方法,其特征在于步骤2具体实现如下:步骤2.1根据协议报文格式构建协议解析器;
首先将配置信息config中协议报文格式文件路径protocolPath作为输入,使用Python导入模块库函数import_module动态导入协议定义类,构建协议树状结构,最后测试协议报文格式类绑定到解析器指定的运输层端口上,生成解析器对象parser;
协议报文格式包含协议的运输层端口、协议字段长度、字段类型、字段名称;
步骤2.2读取重放报文文件;
将重放报文文件路径pcapPath作为输入,打开文件输入流stream,其中重放报文文件使用PCAP格式;
步骤2.3输入流解析为原始报文;
在PCAP文件中每一个报文由Packet Header和Packet Data组成,每次读取Packet Header获得Packet Data长度dataLen,然后stream再向后读取dataLen字节数据得到原始报文数据packet,将packet保存到数组rawPacket中,重复这个步骤,直到stream读取完毕,最后输出rawPacket;
步骤2.4协议解析器解析原始报文;
将步骤2.3解析的原始报文数组rawPacket作为输入,遍历每一个rawPacketi,调用步骤
2.1中parser的parse方法得到已解析报文对象;parse方法会按照数据链路层、网络层、运输层、应用层的TCP/IP模型顺序调用每一层对应的解析器,其中应用层解析器在步骤2.1中绑定,而其他层的解析器是协议解析器自带;已解析报文对象保存在数组Packet中,最后输出Packet。
5.根据权利要求4所述的基于流量重放的工控协议模糊测试方法,其特征在于步骤3具体实现如下:首先将已解析数据报文Packet作为输入,遍历每一个报文Packeti,使用函数hasLayer判断如果Packeti的运输层协议不是TCP协议,那么舍弃这个报文;如果Packeti的TCP协议标志位tcpFlag是TCP协议的SYN、ACK、FIN标志位中的一个,那么舍弃这个报文;使用函数hasLayer判断如果Packeti的应用层协议不是配置信息config中指定工控协议protocol,则舍弃这个报文,反之保存报文到数组ePacket中,随后将ePacket输出。
6.根据权利要求5所述的基于流量重放的工控协议模糊测试方法,其特征在于步骤6具体实现如下:步骤6.1将提取的报文ePacket作为输入,遍历每一个报文ePacketi,在函数hasLayer中判断其应用层是不是测试协议,如果是则进入步骤6.2,否则跳过该报文;
步骤6.2在函数mutateField中遍历该报文的协议树状结构,找到配置信息中指定的协议字段fields,根据这个字段类型选择对应的变异策略,字符串类型字段使用开源工具RADAMSA,数值型字段使用随机数字;最后将变异报文mPacket输出,进入步骤7。
7.根据权利要求6所述的基于流量重放的工控协议模糊测试方法,其特征在于步骤7具体实现如下:步骤7.1提取数据(extractData);将已变异的测试报文mPacket作为输入,遍历每一个报文mPacketi,截取应用层数据data,然后封装成完整数据报文;
步骤7.2通过步骤4建立的连接conn,将完整数据报文发送到目标设备;
步骤7.3通过函数isConnectRest来判断此时连接状态,如果出现连接重置错误,则使用函数saveLog将事件记录日志,然后函数reconnect重新建立与目标的连接,此次测试之后的报文跳过,进入步骤5。