Fuzzing-101 Exercises

前言

笔者将 AFL 源码审计的差不多了,打算接着 Fuzzing-101 这个项目来练练手,学习一下 Fuzz 工具的使用

AFL++ 环境搭建

sudo apt install llvm
sudo apt install clang
git clone https://github.com/AFLplusplus/AFLplusplus && cd AFLplusplus
make
sudo make install

如果想要使用 trace-pc-guard 模式,则需要 llvm 版本为 13+

Exercise-1 Xpdf CVE-2019-13288

Xpdf 是一个免费的 pdf 查看器和工具包,具体文本提取、图像转换等功能

CVE-2019-13288Xpdf 中的一个漏洞,可以通过构造恶意文件,使得 Parser.cc 中的 Parser::getObj() 函数被循环调用,从而导致栈内存耗尽。攻击者可以利用该漏洞实现 DOS 攻击

Xpdf 环境搭建

cd $HOME
mkdir fuzzing_xpdf && cd fuzzing_xpdf/

wget https://dl.xpdfreader.com/old/xpdf-3.02.tar.gz
tar -xvzf xpdf-3.02.tar.gz
cd xpdf-3.02

xpdf-3.02 目录下,存在一个 configure,其是用来生成 Makefile 的:

在这里插入图片描述
这里我们设置编译时采用 afl-clang-fast,以此来进行插桩:

export CC=/home/xiaozaya/fuzz/AFLplusplus/afl-clang-fast
export CXX=/home/xiaozaya/fuzz/AFLplusplus/afl-clang-fast++

插桩编译 xpdf:编译好的二进制程序在 $HOME/fuzzing_xpdf/install/bin 目录下

./configure --prefix="$HOME/fuzzing_xpdf/install/"
make
sudo make install

根据插桩关键字 __sanitizer_cov 确认下是否成功插桩:

cd $HOME/fuzzing_xpdf/install/bin
strings pdftotext | grep __sanitizer_cov

结果如下,可以看到我们已经成功完成插桩编译:
在这里插入图片描述

种子库获取 && 前期准备

在笔者看来,种子库是 fuzz 效率的关键或者决定性因素,如果编写好的种子是一门艺术。当然这也得不断积累,但是笔者刚刚入门,这里仅仅只是为了熟练下工具的使用,所以这里按照实验说明是直接下载别人的种子

cd $HOME/fuzzing_xpdf
mkdir pdf_examples && cd pdf_examples
wget https://github.com/mozilla/pdf.js-sample-files/raw/master/helloworld.pdf
wget http://www.africau.edu/images/default/sample.pdf
wget https://www.melbpc.org.au/wp-content/uploads/2017/10/small-example-pdf-file.pdf

这里需要注意的时,helloworld.pdf 这个文件所在的项目已经没有了。所以这里得单独下载

git clone https://github.com/mozilla/pdf.js-sample-files.git

然后第二个文件 sample.pdf 也找不到了,所以最后找到的种子如下:
在这里插入图片描述
测试下种子是否可用:利用 pdfinfo 查看下 helloworld.pdf 的信息

$HOME/fuzzing_xpdf/install/bin/pdfinfo -box -meta $HOME/fuzzing_xpdf/pdf_examples/helloworld.pdf

在这里插入图片描述
然后关闭系统的核心转储,防止 fuzz 过程中出现 crash 导致程序崩溃中止

sudo su
echo core >/proc/sys/kernel/core_pattern
exit

开始 fuzz && 分析 crash

使用如下命令开始 fuzz

$HOME/fuzz/AFLplusplus/afl-fuzz -i $HOME/fuzzing_xpdf/pdf_examples/ -o $HOME/fuzzing_xpdf/out/ -M fuzzer1 -- $HOME/fuzzing_xpdf/install/bin/pdftotext @@ $HOME/fuzzing_xpdf/output 

相关路径可以视情况而修改

参数说明:

  • -i in_dir:指定输入文件夹,即种子库
  • -o out_dir:指定输出文件夹,存放 fuzz 过程中的一些信息
  • -M fuzzer_name:并行 fuzz,指定主 fuzzer。可以使用 -S 指定从 fuzzer,但是输出路径要保持一致
  • --:分隔符,后面跟测试目标
  • @@:表示测试目标的输入是文件,不加代表是 stdin

这里可以使用 -S 指定 fuzzer2 进行并行 fuzz
在这里插入图片描述
crash 分析
笔者跑了 20 多分钟,最后有 5 个 crash,整体还是不错的
在这里插入图片描述
最后导致 crash 的测试用例在输出目录的 crashes 文件夹下:
在这里插入图片描述
删除插桩编译的目标文件,然后重新利用 gcc 编译:

sudo rm $HOME/fuzzing_xpdf/install/ -rf
cd $HOME/fuzzing_xpdf/xpdf-3.02/
make clean
CFLAGS="-g -O0" CXXFLAGS="-g -O0" ./configure --prefix="$HOME/fuzzing_xpdf/install/"
make
sudo make install

然后就可以用 gdb 调试了

cd $HOME/fuzzing_xpdf/install/bin/
gdb pdftotext
set args /home/xiaozaya/fuzzing_xpdf/out/fuzzer1/crashes/id:000000,sig:11,src:000658,time:279572,execs:105141,op:havoc,rep:11
r

此时程序崩溃在 _int_malloc 的一个 push rbx 指令处,注意此时的 rsp
在这里插入图片描述
可以看到这里的 rsp 已经到达栈顶边界了在这里插入图片描述
通过 bt 回溯看下函数调用链:可以看到一直在循环调用在这里插入图片描述

总结

主要就简单的学习了下 AFL++ 的基本使用

  • 使用 afl-clang-fast 对目标程序进行插桩编译
  • 准备种子库
  • afl-fuzz 直接 fuzz
    • @@ 指明输入为文件
  • gdb 调试分析 crash

Exercise-2 libexif CVE-2009-3895/CVE-2012-2836

libexif 是一个用于解析、编辑和保存 EXIF 数据的库

EXIF:可交换图像文件格式,是专门为数码相机的照片设计的,可以记录数码照片的属性信息和拍摄数据

CVE-2009-3895 是一个堆溢出漏洞,发生在 exif-data.c 文件下的 exif_data_load_data 函数中
CVE-2012-2836 是一个越界读漏洞,发生在 exif-entry.c 文件下的 xif_entry_fix function 函数中

libexif 环境搭建

cd $HOME
mkdir fuzzing_libexif && cd fuzzing_libexif/
wget https://github.com/libexif/libexif/archive/refs/tags/libexif-0_6_14-release.tar.gz
tar -xzvf libexif-0_6_14-release.tar.gz

按照一些必要的依赖和库:

sudo apt-get install autopoint libtool gettext libpopt-dev

然后生成 configure 程序:

cd libexif-libexif-0_6_14-release
autoreconf -fvi

这里设置一下 $CCafl-clang-fast 实现插桩编译
在这里插入图片描述

export CC=/home/xiaozaya/fuzz/AFLplusplus/afl-clang-fast

然后进行插桩编译:生成的文件在 $HOME/fuzzing_libexif/install 目录下

./configure --enable-shared=no --prefix="$HOME/fuzzing_libexif/install/"
make
make install

可以看到插桩编译成功:
在这里插入图片描述

种子库获取 && 前期准备

这里值得注意的是这里的目标是一个链接库,其无法直接执行,所以我们得找一个可以调用该库的程序。其中 libexif 官网 就提供了 fuzz 的目标程序。然后该实验本身也提供了,这里就直接用

cd $HOME/fuzzing_libexif
wget https://github.com/libexif/exif/archive/refs/tags/exif-0_6_15-release.tar.gz
tar -xzvf exif-0_6_15-release.tar.gz

然后安装一下就行了,注意用 PKG_CONFIG_PATH 指定一下链接库的位置,最后生成的二进制文件同样在 instball 目录下,只是存放在了 bin 子目录下

cd exif-exif-0_6_15-release/
autoreconf -fvi
./configure --enable-shared=no --prefix="$HOME/fuzzing_libexif/install/" PKG_CONFIG_PATH=$HOME/fuzzing_libexif/install/lib/pkgconfig
make
sudo make install

最后可以看到成功插桩编译:
在这里插入图片描述
准备种子语料库
程序本身是解析 EXIF 文件的,所以种子找一些 EXIF 文件就好了。可以找一些 EXIF 文件生成器生成,这里直接用实验给的

cd $HOME/fuzzing_libexif
wget https://github.com/ianare/exif-samples/archive/refs/heads/master.zip
unzip master.zip

简单测试一下:

$HOME/fuzzing_libexif/install/bin/exif $HOME/fuzzing_libexif/exif-samples-master/jpg/Canon_40D_photoshop_import.jpg

在这里插入图片描述

开始 fuzz && 分析 crash

$HOME/fuzz/AFLplusplus/afl-fuzz -i $HOME/fuzzing_libexif/exif-samples-master/jpg/ -o $HOME/fuzzing_libexif/out/ -M fuzzer1 -s 123 -- $HOME/fuzzing_libexif/install/bin/exif @@
  • -s seed:使用固定的随机种子【主要就是为了复现用的】

crash 分析
跑了 20 多分钟,共触发了 14 次 crash
在这里插入图片描述
这里其实也可以直接用 gdb 调试,而不一定去重新编译非插桩代码

这里 crash 发生在 exif_data_load_data 函数中,应该是 CVE-2009-3895
在这里插入图片描述
另外一个漏洞好像没有跑出来

总结

通过这个实验学习到了如何对链接库进行 fuzz

  • 对链接库进行插桩编译
  • 寻找一个调用该库的程序,并对其进行插桩编译

Exercise-3 TCPdump CVE-2017-13028

TCPdump 是一个开源的命令行数据包分析器,使用 TCPdump 时需要安装跨平台库 Libpcap

CVE-2017-13028 是一个越界读漏洞,可以通过 BOOTP 数据包(引导协议)触发,漏洞逻辑在 print-bootp.c:bootp_print()

TCPdump 环境搭建

export CC=/home/xiaozaya/fuzz/AFLplusplus/afl-clang-fast
export CXX=/home/xiaozaya/fuzz/AFLplusplus/afl-clang-fast

cd $HOME
mkdir fuzzing_tcpdump && cd fuzzing_tcpdump/

// 安装 Libcpacp 库
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 时找不到该库
mv libpcap-libpcap-1.8.0/ libpcap-1.8.0
// 进入 libpcpa-1.8.0 中编译,在 make 之前需要指定 AFL_USE_ASAN=1 来开启 ASAN
cd libpcap-1.8.0/
sudo apt install flex
AFL_USE_ASAN=1 ./configure --prefix="$HOME/fuzzing_tcpdump/install/"
AFL_USE_ASAN=1 make
AFL_USE_ASAN=1 sudo make install

// 安装 TCPdump
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
cd tcpdump-tcpdump-4.9.2/
AFL_USE_ASAN=1 ./configure --prefix="$HOME/fuzzing_tcpdump/install/"
AFL_USE_ASAN=1 make
AFL_USE_ASAN=1 sudo make install

检查可知插桩编译成功
在这里插入图片描述

种子库获取 && 前期准备

在下载的 tcpdump-tcpdump-4.9.2 目录下存在一个 test 目录,里面就是一些例子,可以直接使用这些例子作为种子
在这里插入图片描述
检查发现这些例子是可以正常解析的
在这里插入图片描述
关一下核心转储

sudo su
echo core >/proc/sys/kernel/core_pattern
exit

开始 fuzz && 分析 crash

/home/xiaozaya/fuzz/AFLplusplus/afl-fuzz -m none -i ./tcpdump-tcpdump-4.9.2/tests/ -o ./out/ -- ./install/sbin/tcpdump -vX -ee -nn -r @@

这里有一些警告:可以自行对 tests/ 下的例子人为做一些筛选
在这里插入图片描述

  • -m:内存限制,因为 ASAN 模式对内存消耗很大,使用这里设置一些不限制内存

没跑出来 crash (主要是笔者没时间跑了,如果跑个一两天应该是可以跑出来的,bushi)

总结

这里学习到了如何在 fuzz 的过程中使用 ASAN,在编译时加上 AFL_USE_ASAN=1

Exercise-4 LibTIFF CVE-2016-9297

Libtiff 是一个用来读写标签图像文件格式的库,库中包含命令行工具来处理 TIFF 文件

CVE-2016-9297 是一个越界读漏洞,通过恶意构造的 TIFF_SETGET_C16_ASCIITIFF_SETGET_C32_ASCII 标记值触发

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值