论文复现-AFLNet

AFLNet 复现

AFLNet官方Github仓库

1. 环境配置(AFL安装)

1.1. 系统环境

官方推荐Ubuntu 18.04和16.04 64位系统,本次实验使用的是Ubuntu 18.04。

需要clang和llvm,以及一些其他依赖项(graphviz-dev libcap-dev)

# Install clang (as required by AFL/AFLNet to enable llvm_mode)
sudo apt-get install clang
# Install graphviz development
sudo apt-get install graphviz-dev libcap-dev

1.2. 安装AFLNet

# 从aflnet仓库中拉取源代码
git clone https://github.com/aflnet/aflnet.git aflnet
# 进入aflnet目录
cd aflnet
# 编译aflnet
make clean all
# 进入llvm_mode目录
cd llvm_mode
# 设置llvm_config环境变量,如果采用apt-get安装的clang,llvm-config应该是/usr/bin/llvm-config-6.0
export LLVM_CONFIG=/usr/bin/llvm-config-6.0
# 编译llvm_mode
make
# 返回到安装目录
cd ../..
# 设置环境变量
export AFLNET=$(pwd)/aflnet
export WORKDIR=$(pwd)
export PATH=$PATH:$AFLNET
export AFL_PATH=$AFLNET
# 验证是否安装完成
afl-fuzz --help

aflnet-finish.png

-N netinfo: server information (e.g., tcp://127.0.0.1/8554)

-P protocol: application protocol to be tested (e.g., RTSP, FTP, DTLS12, DNS, DICOM, SMTP, SSH, TLS, DAAP-HTTP, SIP)

-D usec: (optional) waiting time (in microseconds) for the server to complete its initialization

-e netnsname: (optional) network namespace name to run the server in

-K : (optional) send SIGTERM signal to gracefully terminate the server after consuming all request messages

-E : (optional) enable state aware mode

-R : (optional) enable region-level mutation operators

-F : (optional) enable false negative reduction mode

-c script : (optional) name or full path to a script for server cleanup

-q algo: (optional) state selection algorithm (e.g., 1. RANDOM_SELECTION, 2. ROUND_ROBIN, 3. FAVOR)

-s algo: (optional) seed selection algorithm (e.g., 1. RANDOM_SELECTION, 2. ROUND_ROBIN, 3. FAVOR)

示例命令

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下载渠道:

  1. live555官方资源站
  2. live555 Github仓库

本次实验采取的是live555在2018年8月28日上传到Github的版本,其代码为ceeb4f4。

aflgit.png

# 到工作目录
cd $workspace
# Clone live555
git clone https://github.com/rgaufman/live555.git
# 进入live555目录
cd live555
# 切换live555版本
git checkout ceeb4f4
# 使用补丁
patch -p1 < $AFLNET/tutorials/live555/ceeb4f4.patch
# 生成Makefile
./genMakefiles linux
# 编译
make clean all

patch.png

ceeb4f4.patch补丁作用:生成使用 afl-clang-fast++ 执行覆盖反馈启用检测的 Makefile 的更改之外,还进行了一个小更改以禁用 Live555 中的随机会话 ID 生成。在 Live555 的未修改版本中,它为每个连接生成一个会话 ID,会话 ID 应包含在从连接的客户端发送的后续请求中。否则,请求会很快被服务器拒绝,这会导致模糊测试时出现不确定的路径。具体而言,同一消息序列可能会执行不同的服务器路径,因为会话 ID 正在更改。通过修改 Live555 来处理此特定问题,使其始终生成相同的会话 ID。

live555源代码编译成功后,我们所需要的被测试的服务器(testOnDemandRTSPServer)和RTSP客户端(testRTSPClient)都处于 testProgs 文件夹中。

测试服务器:

# 去到服务器和客户端的文件目录下
cd $workspace/live555/testProgs
# 复制相同的媒体资源到服务器文件目录下
cp $AFLNET/tutorials/live555/sample_media_source/*.* ./
# 启动服务器端口号使用8554
./testOnDemandRTSPServer 8554
# 在另一个终端中启动客户端
./testRTSPClient rtsp://127.0.0.1:8554/wavAudioTest

server.png

client.png

实验开始

捕获消息序列作为种子输入

AFLNet 将消息序列作为种子输入,因此我们首先捕获示例客户端 (testRTSPClient) 和受测服务器 (SUT) 之间的一些示例使用场景。需要根据服务器根据请求将 WAV 格式的音频文件流式传输到客户端的使用场景为 AFLNet 准备种子输入。可以遵循相同的步骤为其他媒体源文件(例如,WebM,MP3)准备其他种子输入。

  1. 启动被测服务器:
# 去到服务器和客户端的文件目录下
cd $workspace/live555/testProgs
./testOnDemandRTSPServer 8554
  1. 使用tcpdump捕获服务器和客户端之间的消息序列:
sudo tcpdump -i lo -w rtsp.pcap port 8554

tcpdump.png
3. 上述步骤完成后,启动客户端:

cd $workspace/live555/testProgs
./testRTSPClient rtsp://127.0.0.1:8554/wavAudioTest

在客户端运行结束后,停止tcpdump捕获。客户端与服务器之间的消息序列将被保存在rtsp.pcap文件中。该文件可以使用wirehsark打开,并提取客户端发给服务器的消息序列(请求),并将请求序列作为AFLNet的种子输入。

# 安装wirehsark
sudo apt-get install wireshark
# 打开rtsp.pcap文件
wireshark rtsp.pcap

以多行显示数据包(请求和响应),一行表示一个数据包。

wireshark1.png

使用Follow->TCP提取请求序列。

wireshark2.png

Wireshark将以纯文本形式显示所有请求和响应。

wire3.png

由于只需要客户端向服务器请求的流量。

wire4.png
wire5.png

最后以二进制的形式保存请求序列。

wire6.png

fuzz:

cd $workspace/live555/testProgs
# 使用AFLNet的afl-fuzz进行模糊测试
afl-fuzz -d -i $AFLNET/tutorials/live555/in-rtsp -o out-live555 -N tcp://127.0.0.1/8554 -x $AFLNET/tutorials/live555/rtsp.dict -P RTSP -D 10000 -q 3 -s 3 -E -K -R ./testOnDemandRTSPServer 8554

一旦 AFLNet 发现错误(例如,崩溃或挂起),包含触发错误的消息序列的测试用例将被存储在 或 文件夹中。在模糊测试过程中,AFLNet 状态机器学习组件不断推断 SUT 的输入状态机,并相应地更新 .dot 文件 (ipsm.dot),以便用户可以查看该文件(使用 xdot 等 .dot 查看器)来监控 AFLNet 在协议推理方面的当前进度。

部分Fuzz结果:

aflnet-live555-afl.png

后续复现实验待更新ing…

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值