赞
踩
官方推荐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
# 从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
-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)>
如何使用AFLNet来模糊Live555并发现其RTSP服务器参考实现(testOnDemandRTSPServer)中的错误。
live555下载渠道:
本次实验采取的是live555在2018年8月28日上传到Github的版本,其代码为ceeb4f4。
# 到工作目录
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
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
捕获消息序列作为种子输入
AFLNet 将消息序列作为种子输入,因此我们首先捕获示例客户端 (testRTSPClient) 和受测服务器 (SUT) 之间的一些示例使用场景。需要根据服务器根据请求将 WAV 格式的音频文件流式传输到客户端的使用场景为 AFLNet 准备种子输入。可以遵循相同的步骤为其他媒体源文件(例如,WebM,MP3)准备其他种子输入。
# 去到服务器和客户端的文件目录下
cd $workspace/live555/testProgs
./testOnDemandRTSPServer 8554
sudo tcpdump -i lo -w rtsp.pcap port 8554
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
以多行显示数据包(请求和响应),一行表示一个数据包。
使用Follow->TCP提取请求序列。
Wireshark将以纯文本形式显示所有请求和响应。
由于只需要客户端向服务器请求的流量。
最后以二进制的形式保存请求序列。
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结果:
后续复现实验待更新ing…
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。