本文将详细介绍如何使用Netzob工具逆向未知通信协议。Netzob是一款强大的开源工具,适用于逆向工程、生成流量和模糊测试通信协议。通过本文的学习,你将能够掌握Netzob的基本功能和高级用法。
0x00 前言
本文主要介绍如何使用Netzob来逆向未知协议。通过学习协议的消息格式及其状态机,并结合实际通信中的流量生成,最后说明如何进行基本的模糊测试。
0x01 Netzob简介
Netzob是一个用于逆向工程、生成流量和模糊测试通信协议的开源工具。它支持通过被动和主动的方式推断协议的消息格式和状态机。生成的模型可以用于模拟现实和可控流量,以及对目标实现进行模糊测试。
本文将介绍Netzob的主要功能,包括推断消息格式和简单协议的语法,并在最后介绍基本的模糊测试方法。具体功能包括:
- 导入包含通信痕迹的文件
- 推断消息格式
- 区分特定分隔符的消息
- 重组特定关键字字段的消息
- 区分序列对齐的每个消息的子集
- 查找每组消息的关联性
- 修改消息格式,应用发现的关系
- 推断语法
- 生成主状态机
- 生成序列状态机
- 生成Prefix Tree Acceptor (PTA)
- 生成流量和模糊测试服务器
- 生成遵循推断的消息格式的消息
- 通过不同消息格式对服务器进行模糊测试
0x02 安装Netzob和下载教程
首先,获取Netzob的源代码,安装依赖库并编译底层库。详细的安装步骤请参考README文件。然后,下载教程中使用的协议实现的源代码和一些消息序列的PCAP文件。
在深入Netzob功能之前,建议先阅读其文档,特别是API的描述。
0x03 消息格式接口
从PCAP文件中导入消息
逆向协议的第一步是收集重要的通信实例。本教程中,示例来自PCAP文件。通过PCAPImporter.readfile()函数可以从PCAP文件中读取数据包。该函数支持BPF过滤、导入层和捕获数据包等选项。
例如,以下代码从PCAP文件中导入消息,并创建一个基于这些消息的symbol。symbol代表了一组共享相同语法和语义的消息。
使用分隔符进行格式区分
通过快速查看消息,发现字符#出现在每个消息中间。因此,可以使用splitDelimiter()函数根据字符#分割每条消息。使用_str_debug()方法可以结构化输出分割后的字段。
根据关键字段进行分簇
现在我们已经将消息分解成不同的字段,接下来可以尝试重组一些消息。Netzob中的分簇方法可以帮助我们根据特定字段将消息分组。例如,根据第一个字段(包含几种命令行)进行分簇。
分簇算法生成了14个不同的symbol,每个symbol都有一个唯一的第一个字段。
在每个symbol中以序列对齐来区分格式
现在我们已经重组了消息,并且有每个消息的三个基本字段:命令字段、分割字段和不定长内容。具有动态大小的字段适合在Netzob中进行序列对齐。使用splitAligned()函数可以对齐静态和动态的子字段。
例如,对于symbol CMDencrypt,序列对齐后的最后一个字段显示为两个可变字段包裹一个静态字段x00x00x00。最后一个字段可能是我们要加密的缓冲区。
找到每个symbol的关系
接下来,尝试找出这些消息之间的关系。Netzob的API提供了RelationFinder.findOnSymbol()函数,可以帮助确定潜在的消息字段之间的关系。
例如,在未知协议中,我们找到了symbol CMDencrypt在内容字段(第三个字段)和其他字段之间的关系。
应用找到的symbol结构之间的关系
我们发现了一个与下一个字段大小相关的字段。为此,我们创建一个Size字段,其值取决于目标字段的内容。还指定了Size字段的大小应该是缓冲区字段的八分之一。
通过这些操作,我们得到了每个symbol的完整定义。
0x04 推断状态机
生成一个状态机链
在逆向协议的消息格式之后,接下来逆向状态机,即描述授权消息序列的语法。Netzob中的Session对象表示消息序列,而Abstract Session对象用于推测状态机。
我们将介绍三种方法来生成基于PCAP文件的自动机:
- 生成一个基本的自动机,描述从PCAP文件中导出的命令和响应序列。
- 生成一个唯一的状态机,接收任何发送消息触发的状态转变。
- 生成一个基于PTA的自动机,合并相同路径的消息序列。
0x05 流量生成和模糊测试
根据推断的模型生成消息
现在我们已经理解了消息格式和目标协议的语法,可以测试这个模型,尝试与真实服务器通信。
首先,启动服务器。然后创建一个UDP客户端,使用Netzob生成的消息与服务器通信(127.0.0.1:4242)。Netzob中的抽象层确保发送的symbols和接收的消息抽象。
Fuzzing一个指定的symbol
最后,选择CMDencrypt的消息格式进行模糊测试。修改格式以扩展缓冲区字段的大小。
通过这些步骤,你可以使用Netzob逆向未知协议,并进行基本的模糊测试。建议阅读API文档,如果有任何问题,可以与Netzob开发团队交流。