网络协议逆向初探—Netzob简介及优劣性分析

Netzob是一款由法国学者Georges Bossert和Frédéric Guihéry开发的,在网络协议逆向工程中, 用于划定字段边界,描述字段语义,流量生成,和模糊测试通信协议的开源工具。其中:

字段边界:将原始协议报文划分为若干个可识别字段。

字段语义:字段数据所约定的含义,包含静态语义和动态语义。

流量生成:生成与主机进行交互的网络流量。

模糊测试:通过向被测试系统注入大量非预期的输入来发现潜在的漏洞。

应用层协议包括两种基础组成部分:协议状态机和报文格式。这款工具能做到通过主动与被动过程来推断报文格式(词法),和协议状态机(语法)。如图1所示,Netzob的协议逆向分析由三个阶段组成:导入,协议推断,和仿真。

第一阶段:导入

Netzob可导入多种数据,如实时网络通信,进程间通信数据,捕捉的网络通信(PCAP)和oSpy文件格式的API。

使用函数PCAPImporter或FileImporter导入一个或多个文件,Netzob在导入过程中对原始报文进行解码转换,并分层归类。同时,可选择伯克利封包过滤器来限制导入的封包内容,指定导入的网络协议层数和指定导入数据包的数量。数据包导入后的格式为messages。

下图为导入的.pcap格式的Modbus数据包:

第二阶段:协议推断

将导入的messages合并(若有多个文件导入)并提取出规范化的形式Symbol。Symbol是相似报文的抽象化。属性相似的报文在协议里担当相同的角色。例如,TCP会话集中的SYN报文可抽象化为同一符号。Symbol结构明确了一系列可预判的字段(field)。这些字段有固定或可变的长度。图3为由modbus协议生成的messages提取的Symbol。

1

词法推断

>>>>

1. 字段分割

a) splitDelimiter字符分割:用于分割的字符可以为ASCII, 自定义, 十六进制字符串, 以及任何符合抽象数据类型AbstractType的对象。

图4的Symbol中,每行都包含字符“#”,因此将“#”作为分割符将每行分成多个字段(图5)。

图4. Symbol

图5. 字符“#”分割

b) splitStatic:根据静态分布的分割。

如图7所示,图6分割后的各字段中:Field-0,field-2。Field-4为动态字段,Field-1和Field-3为静态字段。

图6. Symbol

图7. 静态分割

c) splitAligned:检测活动的循环部分。用Needleman-Wunsch序列比对算法进行字节定界。此算法对包含可变长度的动态字段更有效。

对图8 Field-2再分割。根据Needleman-Wunsch算法,相似匹配度高的被分配在同一字段(图9)。

图8. Field-2

图9. 对齐分割

>>>>

2.报文分簇—重组报文

Netzob对分割后的报文进行分簇,使用的函数有:

clusterByKeyField

clusterbyApplicativeData

clusterBySize

clusterByAlignment

clusterByKeyField:根据关键字段分簇重组。

如图10,字符分割后的各字段中,Field-0包含了多种命令,如CMDidentify, CMDbye.等.因此,以Field-0作为 key field来分簇。分簇生成了14个不同的symbol(图11)。

图10. 字符分割的字段

图11. 分簇后的14个symbol

clusterbyApplicativeData:根据协议内嵌的应用数据分簇。用户需自定义Applicative Data,如ACK,SYN(图12)。

图 12. 自定义应用数据

clusterBySize根据长度分簇:相同长度的字段被重新归为一组(图13)。

图13. 根据长度分簇

clusterByAlignment:使用UPGMA(unweighted pair-group method with arithmetic means)非加权组平均法,构造系统树来进行多序列比对,最大化边界。

>>>>

3.各symbol之间的关系(RelationFinder)

确定潜在的报文字段之间的关系并根据所找到的关系修改报文格式。

2

语法推断

abstractSession:提取导入的原始报文的序列,包括在同一时间交换的报文。

推断状态机:

状态机是特征化的所有可能的,合理的报文序列。状态机包含一组状态集(states)、一个起始状态(start state)、一组输入符号集(alphabet)、一个映射输入符号和当前状态到下一状态的转换函数(transition function)的计算模型。状态机可以用一个有向图形来描述,由一组节点和一组相应的转移函数组成。状态机通过响应一系列事件而“运行”。每个事件都在属于“当前”节点的转移函数的控制范围内。这些节点中至少有一个必须是终态。当到达终态,状态机停止。

以下为Netzob中可生成的状态机:

状态机链Chained States Automata: 图14为一个基本的自动机,包括一系列来描述报文传输的命令和响应的序列。每发送一个报文都将创建一个新的状态(State1-State8)。一系列报文的状态组成了状态机链。

图14. 状态机链

单状态机 One State Automata: 图15的状态机中只生成了一个状态(main state),其中包含了每一个合理的接收与发送报文。

图15. 单状态机

PTA Automata: 合并不同的从Prefix Tree Acceptor中抽象得来的报文序列来生成状态机(图16)。

这里用到的Prefix Tree前缀树,是一种多叉树结构,图17为一棵Trie树,包含了关键词:{‘to’, ’tea’, ‘ted’, ‘ten’, ‘a’, ‘in’, ‘inn’}. Trie树把每个关键字保存在一条路径上. 两个有公共前缀的关键字,在Trie树中前缀部分的路径相同。

图16. PTA状态机

图17. 前缀树示

第三阶段:仿真

1

流量生成

流量生成– 与真实的服务器通信来验证报文格式是否正确

a) 启动Netzob中内置的服务器(IP client, Raw Ethernet client, SSL client, TCP client/server, UDP client/server)

b.)如图18所示,连接一个客户端,让推断出的报文与服务器通信。客户端代表通信的远端端口,可以收发生成的状态机和报文格式的数据。为了确保接收与发送的Symbol和具体消息能够相互转化,使用一个抽象层(Abstraction Layer),图19为抽象层的内容。

图18. 流量生成

图19. 抽象层

图20. Incoming messages

从图20结果来看,收到的报文格式是正确的,服务器能分析它们并发送正确回应。

2

模糊测试

模糊测试(Fuzzing)通过向被测试系统注入大量非预期的输入来发现潜在的漏洞。

如图21,选定一个有动态字段(CMDencrypt)的报文,改变报文结构。

图21. 生成非预期报文

下图可看出Netzob只发出了最后一个字段的CMDencrypt报文。

图22. 发送非预期报文

图23为用原始报文和改过的报文向服务器询问过程。含有动态字段的原始报文发送到服务器,得到了回应。而被修改过动态字段的测试报文发送后得到了错误消息。

图23. Fuzzing过程

如图24所示,服务端得到了错误消息,解析最后一个字段时产生了bug。

图24. 错误消息

总结

Netzob主要用 Needleman-Wunsch算法和UPGMA对报文分割分簇,以此来划定字段边界。提取字段类型特征,将类型具体化为表达式,并用搜索算法识别内在符号的依赖关系来描述字段语义。Netzob用主动推断的方式基于报文序列方法推断状态机,利用询问和应答的反馈不断扩充已有样本来推断状态机。但Netzob对于字段之间存在的顺序、并列和层次三种结构关系缺乏描述,也无法分析出字段取值所需要满足的特定约束条件。Netzob对于字段语义的描述引入过多的先验知识,因此对于未知网络协议分析具有一定的局限性。

参考文献

[2] “使用Netzob逆向未知协议.” www.anquanke.com/post/id/85441.

[3] Georges Bossert. Security Evaluation of Communication Protocols in Common Criteria

[4] 吴礼发.网络协议逆向分析及应用,2016

[5] https://baike.baidu.com/item/%E7%8A%B6%E6% 80%81%E6%9C%BA/6548513

内容编辑:安全大数据分析实验室 王语嫣 责任编辑:肖晴

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180625G0MSGT00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券