题目链接:https://github.com/antonio-morales/Fuzzing101/tree/main/Exercise%203
在本练习中,我们将对TCPdump数据包分析器进行模糊测试。目标是在 TCPdump 4.9.2 中找到CVE-2017-13028的崩溃/PoC 。如果想要了解更多CVE-2017-13028,可以通过以下的链接找到有关越界读取漏洞的更多信息:https: //cwe.mitre.org/data/definitions/125.html
完成此练习后,您将了解:
所有的练习都在Ubuntu 20.04.2 LTS上进行了测试。强烈建议您使用相同的操作系统版本,以避免不同的模糊结果。
让我们首先得到我们的fuzzing目标。为您想要fuzzing的项目创建一个新的目录
cd $HOME
mkdir fuzzing_tcpdump && cd fuzzing_tcpdump/
下载并解压tcpdump-4.9.2.tar.gz:
wget https://github.com/the-tcpdump-group/tcpdump/archive/refs/tags/tcpdump-4.9.2.tar.gz
tar -xzvf tcpdump-4.9.2.tar.gz
我们还需要下载 TCPdump 所需的跨平台库 libpcap。下载并解压 libpcap-1.8.0.tar.gz:
wget https://github.com/the-tcpdump-group/libpcap/archive/refs/tags/libpcap-1.8.0.tar.gz
tar -xzvf libpcap-1.8.0.tar.gz
我们需要重命名libpcap-libpcap-1.8.0
为libpcap-1.8.0
. 否则,tcpdump找不到libpcap.a
本地路径:
mv libpcap-libpcap-1.8.0/ libpcap-1.8.0
构建并安装libpcap:
cd $HOME/fuzzing_tcpdump/libpcap-1.8.0/
./configure --enable-shared=no
make
接下来,构建并安装tcpdump:
cd $HOME/fuzzing_tcpdump/tcpdump-tcpdump-4.9.2/
./configure --prefix="$HOME/fuzzing_tcpdump/install/"
make
make install
要测试一切是否正常工作,只需执行以下命令:
$HOME/fuzzing_tcpdump/install/sbin/tcpdump -h
结果如图所示:
在继续执行以下步骤之前,请检查版本号是否与上面的数字匹配
可以在“./tests”文件夹中找到很多.pcacp示例。您可以使用以下命令行运行这些 .pcap 文件:
$HOME/fuzzing_tcpdump/install/sbin/tcpdump -vvvvXX -ee -nn -r [.pcap file]
例如:
$HOME/fuzzing_tcpdump/install/sbin/tcpdump -vvvvXX -ee -nn -r ./tests/geneve.pcap
结果如图所示:
AddressSanitizer (ASan)是用于 C 和 C++ 的快速内存错误检测器。它最初由 Google开发,并于 2011 年 5 月首次发布。
它由编译器检测模块和运行时库组成。该工具能够查找对堆、堆栈和全局对象的越界访问,以及释放后使用、双重释放和内存泄漏错误。
AddressSanitizer 是开源的,从 3.1 版本开始与 LLVM 编译器工具链集成。虽然它最初是作为 LLVM 的项目开发的,但它已被移植到 GCC 并包含在 >= 4.8 的 GCC 版本中
您可以通过以下链接找到有关 AddressSanitizer 的更多信息。
现在我们将构建启用 ASAN 的 tcpdump(和 libpcap)。
首先,我们将清理所有先前编译的目标文件和可执行文件:
rm -r $HOME/fuzzing_tcpdump/install
cd $HOME/fuzzing_tcpdump/libpcap-1.8.0/
make clean
cd $HOME/fuzzing_tcpdump/tcpdump-tcpdump-4.9.2/
make clean
现在,在调用configure和make前设置AFL_USE_ASAN=1:
cd $HOME/fuzzing_tcpdump/libpcap-1.8.0/
export LLVM_CONFIG="llvm-config-11"
CC=afl-clang-lto ./configure --enable-shared=no --prefix="$HOME/fuzzing_tcpdump/install/"
AFL_USE_ASAN=1 make
cd $HOME/fuzzing_tcpdump/tcpdump-tcpdump-4.9.2/
AFL_USE_ASAN=1 CC=afl-clang-lto ./configure --prefix="$HOME/fuzzing_tcpdump/install/"
AFL_USE_ASAN=1 make
AFL_USE_ASAN=1 make install
执行以下命令:
afl-fuzz -m none -i $HOME/fuzzing_tcpdump/tcpdump-tcpdump-4.9.2/tests/ -o $HOME/fuzzing_tcpdump/out/ -s 123 -- $HOME/fuzzing_tcpdump/install/sbin/tcpdump -vvvvXX -ee -nn -r @@
一段时间后,您应该会遇到多次崩溃:
调试使用 ASan 构建的程序比之前的练习要容易得多。您需要做的就是向程序提供崩溃文件:
$HOME/fuzzing_tcpdump/install/sbin/tcpdump -vvvvXX -ee -nn -r '/home/antonio/fuzzing_tcpdump/out/default/crashes/id:000000,sig:06,src:002318+001583,time:10357087,op:splice,rep:8'
您将获得崩溃的详细摘要,包括执行跟踪: