Exercise 3 - TCPdump

Exercise 3 - TCPdump

一、实验背景

CVE-2017-13028是一个越界读取漏洞,可以通过BOOTP数据包(引导协议)触发,越界读取是当程序读取数据超过预期缓冲区的末尾或开始之前时发生的漏洞。因此,它允许远程攻击者导致拒绝服务或可能从进程内存中获取潜在的敏感信息。

越界读取漏洞(https://cwe.mitre.org/data/definitions/125.html)

**AddressSanitizer (ASan)**是C和c++的快速内存错误检测器。它最初是由谷歌(Konstantin Serebryany, Derek Bruening, Alexander Potapenko, Dmitry Vyukov)开发的,并于2011年5月首次发布。

它由编译器插装模块和运行时库组成。该工具能够查找对堆、堆栈和全局对象的越界访问,以及use-after-free、double-free和内存泄漏错误。

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

AddressSanitizer(https://clang.llvm.org/docs/AddressSanitizer.html)

二、实验目的

模糊TCPdump数据包分析器。目标是在TCPdump 4.9.2中找到CVE-2017-13028漏洞

三、实验环境:

win10,VMware,Ubuntu 20.04.2 LTS(虚拟机用户名密码均为fuzz)

四、实验步骤

1、下载并构建目标

得到模糊目标,为要模糊化的项目创建一个新目录

1
2
cd $HOME
mkdir fuzzing_tcpdump && cd fuzzing_tcpdump/

image

下载并解压tcpdump-4.9.2.tar.gz

1
2
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

image

下载libpcap(TCPdump需要的一个跨平台库)并解压libpcap-1.8.0.tar.gz

1
2
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

image

我们需要将“libpcap-libpcap-1.8.0”重命名为“libpcap-1.8.0”。否则,tcpdump找不到libpcap的本地路径

1
mv libpcap-libpcap-1.8.0/ libpcap-1.8.0

构建并安装libpcap

1
2
3
4
cd $HOME/fuzzing_tcpdump/libpcap-1.8.0/
./configure --enable-shared=no
make
make install

image

image

构建并安装tcpdump

1
2
3
4
cd $HOME/fuzzing_tcpdump/tcpdump-tcpdump-4.9.2/
./configure --prefix="$HOME/fuzzing_tcpdump/install/"
make
make install

image

image

image

测试工作是否正常

1
$HOME/fuzzing_tcpdump/install/sbin/tcpdump -h

看到如下页面说明正常

image

tcpdump version 4.9.2

libpcap version 1.8.0

检查版本号是否与实验手册的一致,若一致,则继续下面的实验

2、创建种子语料库

可以在“.pcap”中找到许多. pcap示例,“/tests”文件夹中。你可以用下面的命令行运行这些.pcap文件

1
$HOME/fuzzing_tcpdump/install/sbin/tcpdump -vvvvXX -ee -nn -r [.pcap file]

例如

1
$HOME/fuzzing_tcpdump/install/sbin/tcpdump -vvvvXX -ee -nn -r ./tests/geneve.pcap

然后会看到如下页面

image

3、构建时启用ASan

构建启用了ASAN的tcpdump(和libpcap)

要清理所有之前编译过的目标文件和可执行文件

1
2
3
4
5
6
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

image

调用configure和make之前设置AFL_USE_ASAN=1

1
2
3
4
5
6
7
8
9
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

image

image

image

image

image

Afl-clang-lto编译可能需要几分钟才能完成

4、fuzzing

使用以下命令运行fuzzer

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

image

注意:64位系统上的ASAN需要大量虚拟内存。这就是为什么我在AFL中设置了禁用内存限制的标志“-m none”

几小时后可以看见有多个崩溃

image

5、Triage

调试用ASan构建的程序,需要给程序提供崩溃文件

1
$HOME/fuzzing_tcpdump/install/sbin/tcpdump -vvvvXX -ee -nn -r '/home/fuzz/fuzzing_tcpdump/out/default/crashes/id:000000,sig:06,src:003788,time:8574962,execs:1212760,op:havoc,rep:3'

可以得到一个很好的奔溃摘要,包括执行跟踪

image

image

image

报错信息

AddressSanitizer: heap-buffer-overflow on address 0x6100000000ff at pc 0x0000003cee45 bp 0x7fff77cbed90 sp 0x7fff77cbe538

堆溢出

6、修复问题

https://github.com/the-tcpdump-group/tcpdump/commit/85078eeaf4bf8fcdc14a4e79b516f92b6ab520fc#diff-05f854a9033643de07f0d0059bc5b98f3b314eeb1e2499ea1057e925e6501ae8L381

五、总结

通过这个实验,我了解了CVE-2017-13028漏洞,了解运行时内存错误检测工具**ASan (Address Sanitizer)**,学会如何使用ASAN模糊目标,使用ASan对崩溃进行分类