1、简介
- 本文旨在使用AFLNet对RTSP协议实现Live555进行模糊测试。
- 实验环境为:Ubuntu22.04.4
- AFLNet安装参考:AFLNet入门教学——安装(Ubuntu22.04.4)-CSDN博客
2、安装Live555
- 本次实验采取的是live555在2018年8月28日上传的版本,版本号为ceeb4f4。
- 克隆Live555。
-
# Clone live555 git clone https://github.com/rgaufman/live555.git
-
- 切换版本号。
-
# 进入live555目录 cd live555 # 切换live555版本 git switch -c ceeb4f4
-
- 打补丁。
-
# 使用补丁 patch -p1 < $AFLNET/tutorials/live555/ceeb4f4.patch
- 【注】ceeb4f4.patch补丁除了生成使用afl-clang-fast++执行覆盖反馈启用检测的Makefile之外,还进行了一个小改动,以禁用Live555中的随机会话ID生成。在未修改的Live555版本中,每个连接都会生成一个会话ID,后续从客户端发送的请求中必须包含该会话ID,否则请求会被服务器很快拒绝。这会导致模糊测试时路径不确定性增加,因为同一消息序列可能会执行不同的服务器路径,原因是会话ID在变化。通过修改Live555使其始终生成相同的会话ID,可以解决这个特定问题。
-
- 生成makefile文件并编译。
-
# 生成Makefile ./genMakefiles linux # 编译 make clean all
-
- live555源代码编译成功后,所需要的被测服务器(testOnDemandRTSPServer)和RTSP客户端(testRTSPClient)都处于testProgs文件夹中。
- 将测试中所用的资源复制到testProgs文件夹中。
-
# 去到服务器和客户端的文件目录下 cd testProgs # 复制相同的媒体资源到服务器文件目录下 cp $AFLNET/tutorials/live555/sample_media_sources/*.* ./
-
- 启动服务器
-
./testOnDemandRTSPServer 8554
-
- 启动客户端
-
# 在另一个终端中启动客户端 ./testRTSPClient rtsp://127.0.0.1:8554/wavAudioTest
-
3、开始实验
3.1、准备初始种子
- AFLNet是基于变异的fuzzer,需要初始种子作为输入,即消息序列。
- 因此我们首先捕获示例客户端 (testRTSPClient)和被测服务器 (testOnDemandRTSPServer)之间的真实通信流量。例如,捕获下面常见的真实流量作为初始种子:服务器根据请求将WAV格式的音频文件流式传输到客户端。
- 启动被测服务器。
-
# 去到服务器和客户端的文件目录下执行 ./testOnDemandRTSPServer 8554
-
- 打开新的终端,使用tcpdump捕获服务器和客户端之间的通信流量。
-
sudo tcpdump -i lo -w rtsp.pcap port 8554
-
- 打开新的终端,启动客户端。
-
./testRTSPClient rtsp://127.0.0.1:8554/wavAudioTest
-
- 在客户端运行结束后,ctrl+c停止tcpdump捕获。
- 客户端与服务器之间的消息序列将被保存在rtsp.pcap文件中。该文件可以使用wirehsark打开,并提取客户端发给服务器的消息序列(请求),并将请求序列作为AFLNet的种子输入。
- 使用wireshark打开rtsp.pcap文件。
-
# 打开rtsp.pcap文件 wireshark rtsp.pcap
-
- 提取请求序列。
-
Wireshark将以纯文本形式显示所有请求和响应。
- 只保留客户端向服务器发送的请求。
- 以二进制的形式保存请求序列,单击“另存为”并将其保存到文件中,例如rtsp_requests_wav.raw。保存到 /RTSP/live555/testProgs/in-rtsp下。
3.2、Fuzz
- 运行模糊测试。
-
cd $workspace./RTSP/live555/testProgs # 使用AFLNet的afl-fuzz进行模糊测试 afl-fuzz -d -i ./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
-
- 报错:
-
[-] Hmm, your system is configured to send core dump notifications to an external utility. This will cause issues: there will be an extended delay between stumbling upon a crash and having this information relayed to the fuzzer via the standard waitpid() API. To avoid having crashes misinterpreted as timeouts, please log in as root and temporarily modify /proc/sys/kernel/core_pattern, like so: echo core >/proc/sys/kernel/core_pattern [-] PROGRAM ABORT : Pipe at the beginning of 'core_pattern' Location : check_crash_handling(), afl-fuzz.c:8340
-
- 解决办法:
-
# 获得管理员权限 sudo su root # 修改配置 echo core >/proc/sys/kernel/core_pattern # 退出 exit
-
- 重新运行。
-
afl-fuzz -d -i ./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
-