AFLNet 复现
AFLNet 复现
1. 环境配置(AFL安装)
1.1. 系统环境
官方推荐Ubuntu 18.04和16.04 64位系统,本次实验使用的是Ubuntu 18.04。
需要clang和llvm,以及一些其他依赖项(graphviz-dev libcap-dev)
1 | # Install clang (as required by AFL/AFLNet to enable llvm_mode) |
1.2. 安装AFLNet
1 | # 从aflnet仓库中拉取源代码 |
1 | -N netinfo: server information (e.g., tcp://127.0.0.1/8554) |
示例命令
1 | afl-fuzz -d -i in -o out -N <server info> -x <dictionary file> -P <protocol> -D 10000 -q 3 -s 3 -E -K -R <executable binary and its arguments (e.g., port number)> |
2. 实验
2.1. 实验1:live555 RTSP服务器
实验内容
如何使用AFLNet来模糊Live555并发现其RTSP服务器参考实现(testOnDemandRTSPServer)中的错误。
实验环境
live555下载渠道:
本次实验采取的是live555在2018年8月28日上传到Github的版本,其代码为ceeb4f4。
1 | # 到工作目录 |
ceeb4f4.patch补丁作用:生成使用 afl-clang-fast++ 执行覆盖反馈启用检测的 Makefile 的更改之外,还进行了一个小更改以禁用 Live555 中的随机会话 ID 生成。在 Live555 的未修改版本中,它为每个连接生成一个会话 ID,会话 ID 应包含在从连接的客户端发送的后续请求中。否则,请求会很快被服务器拒绝,这会导致模糊测试时出现不确定的路径。具体而言,同一消息序列可能会执行不同的服务器路径,因为会话 ID 正在更改。通过修改 Live555 来处理此特定问题,使其始终生成相同的会话 ID。
live555源代码编译成功后,我们所需要的被测试的服务器(testOnDemandRTSPServer)和RTSP客户端(testRTSPClient)都处于 testProgs 文件夹中。
测试服务器:
1 | # 去到服务器和客户端的文件目录下 |
实验开始
捕获消息序列作为种子输入
AFLNet 将消息序列作为种子输入,因此我们首先捕获示例客户端 (testRTSPClient) 和受测服务器 (SUT) 之间的一些示例使用场景。需要根据服务器根据请求将 WAV 格式的音频文件流式传输到客户端的使用场景为 AFLNet 准备种子输入。可以遵循相同的步骤为其他媒体源文件(例如,WebM,MP3)准备其他种子输入。
启动被测服务器:
1
2
3# 去到服务器和客户端的文件目录下
cd $workspace/live555/testProgs
./testOnDemandRTSPServer 8554使用tcpdump捕获服务器和客户端之间的消息序列:
1
sudo tcpdump -i lo -w rtsp.pcap port 8554
上述步骤完成后,启动客户端:
1
2cd $workspace/live555/testProgs
./testRTSPClient rtsp://127.0.0.1:8554/wavAudioTest在客户端运行结束后,停止tcpdump捕获。客户端与服务器之间的消息序列将被保存在rtsp.pcap文件中。该文件可以使用wirehsark打开,并提取客户端发给服务器的消息序列(请求),并将请求序列作为AFLNet的种子输入。
1 | # 安装wirehsark |
以多行显示数据包(请求和响应),一行表示一个数据包。
使用Follow->TCP提取请求序列。
Wireshark将以纯文本形式显示所有请求和响应。
由于只需要客户端向服务器请求的流量。
最后以二进制的形式保存请求序列。
fuzz:
1 | cd $workspace/live555/testProgs |
一旦 AFLNet 发现错误(例如,崩溃或挂起),包含触发错误的消息序列的测试用例将被存储在 或 文件夹中。在模糊测试过程中,AFLNet 状态机器学习组件不断推断 SUT 的输入状态机,并相应地更新 .dot 文件 (ipsm.dot),以便用户可以查看该文件(使用 xdot 等 .dot 查看器)来监控 AFLNet 在协议推理方面的当前进度。
部分Fuzz结果:
后续复现实验待更新ing…