Fuzzing101:Exercise 3 - tcpdump 翻译+解题

Fuzzing101:Exercise 3 - tcpdump 翻译+解题

题目部分翻译

题目链接: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

你将学到什么:

完成此练习后,您将了解:

  • 什么是ASan(Address Sanitizer),一个运行时内存错误检测工具
  • 如何使用 ASAN 模糊目标
  • 使用 ASan 对崩溃进行分类有多容易
环境:

所有的练习都在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.0libpcap-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

结果如图所示:

Fuzzing101:Exercise 3 - tcpdump 翻译+解题_第1张图片

在继续执行以下步骤之前,请检查版本号是否与上面的数字匹配

种子语料库创建

可以在“./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

结果如图所示:

Fuzzing101:Exercise 3 - tcpdump 翻译+解题_第2张图片

AddressSanitizer

AddressSanitizer (ASan)是用于 C 和 C++ 的快速内存错误检测器。它最初由 Google开发,并于 2011 年 5 月首次发布。

它由编译器检测模块和运行时库组成。该工具能够查找对堆、堆栈和全局对象的越界访问,以及释放后使用、双重释放和内存泄漏错误。

AddressSanitizer 是开源的,从 3.1 版本开始与 LLVM 编译器工具链集成。虽然它最初是作为 LLVM 的项目开发的,但它已被移植到 GCC 并包含在 >= 4.8 的 GCC 版本中

您可以通过以下链接找到有关 AddressSanitizer 的更多信息。

启用 ASan 进行构建

现在我们将构建启用 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

模糊测试Fuzzing

执行以下命令:

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 @@

一段时间后,您应该会遇到多次崩溃:

Fuzzing101:Exercise 3 - tcpdump 翻译+解题_第3张图片

Triage 

调试使用 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'

您将获得崩溃的详细摘要,包括执行跟踪:

Fuzzing101:Exercise 3 - tcpdump 翻译+解题_第4张图片

你可能感兴趣的:(Fuzzing101,tcpdump,测试工具,网络)