Fuzzing 101
2022-05-01 17:07:43

Fuzzing 101:

1、Xpdf:

目标简介:

Xpdf是一个免费的PDF查看器和工具包,包括文本提取器,HTML转换器

目标采用Xpdf 3.02版本,其中存在不受控制的递归漏洞CVE-2019-13288

漏洞介绍:

该漏洞通过构造文件的方式,使Parser.cc文件中的Parser::getObj()函数多次调用,由于每个调用的函数都会在栈上开辟一块新的使用空间=》栈帧==》如果一个函数被递归调用多次==》导致栈内存耗尽并导致程序崩溃==》DOS攻击

目标安装,插桩,编译

1、对目标进行安装:

//安装存放路径
cd $HOME
mkdir fuzzing_xpdf && cd fuzzing_xpdf

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

2、设置环境变量:将编译命令指定为afl-clang-fast

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

3、编译程序,指定将编译好的程序存放在**$HOME/fuzzing_xpdf/install/**

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

4、确认插桩是否成功:

进入程序目录:

cd $HOME/fuzzing_xpdf/install/bin

由于是使用afl-clang-fast进行插桩==》搜索关键字__sanitizer_cov==》

strings ./pdftotext | grep __sanitizer_cov

FUZZ

1、准备种子

==》需要输入的测试用例==》

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

检测下载的文件是否可用==》调用fuzzing_xpdf/install/bin下的pdfinfo==》

2、对helloworld.pdf进行基本信息查看:

/home/closure/fuzzing_xpdf/install/bin/pdfinfo -box -meta /home/closure/fuzzing_xpdf/pdf_examples/helloworld.pdf 

3、关闭系统的核心存储==》确保在fuzz过程中出现crash不会使程序终止

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

4、进行fuzz:

afl-fuzz -i $HOME/fuzzing_xpdf/pdf_examples/ -o $HOME/fuzzing_xpdf/out/ -s 123 -- $HOME/fuzzing_xpdf/install/bin/pdftotext @@ $HOME/fuzzing_xpdf/output

出现crash==》暂停fuzzing查看out目录下的crash输出==》

GDB验证fuzz结果

1、复现崩溃:

修改文件名为clo.pdf

$HOME/fuzzing_xpdf/install/bin/pdftotext '$HOME/fuzzing_xpdf/out/default/crashes/clo.pdf' $HOME/fuzzing_xpdf/output

2、删除由afl-clang-fast插桩编译的install目录下的内容,重新使用gcc编译:

rm -rf $HOME/fuzzing_xpdf/install
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

3、使用gdb指定pdftotext二进制程序运行fuzz结果文件:

cd $HOME/fuzzing_xpdf/install/bin
gdb --args ./pdftotext /home/closure/fuzzing_xpdf/out/fuzzer1/crashes/clo.pdf /home/closure/fuzzing_xpdf/output

run运行==》

bt命令回溯执行过的函数:

发现Parser::getObj函数在不断的被递归调用==》

验证CVE-2019-13288漏洞描述

2、Libexif:

目标简介:

libexif是一个用于解析,编辑,保存exif数据的库,支持解析,编辑,保存exif数据

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

目标采用libe 0.6.14版本==》存在CVE-2009-3895和CVE-2012-2836漏洞

漏洞介绍:

CVE-2009-3895:

一种基于堆溢出的缓冲区溢出漏洞,可以通过无效的EXIF图像触发

详情:在libexif/exif-entry.c中的exif_entry_fix函数中基于堆的缓冲区溢出允许远程攻击者导致拒绝服务或可能通过无效的EXIF图像执行任意代码

CVE-2012-2836:

一种基于越界读取漏洞,可以通过特殊构造的EXIF标签的图像触发

详情:EXIF标签解析库(libexif)中的exif-data.c中的exif-data-load-data函数允许远程攻击者导致拒绝服务(越界读取)或可能通过制作进程从内存中获取敏感信息图像中的EXIF标记

目标安装,插桩,编译

//创建本次模糊测试目录
cd $HOME
mkdir fuzzing_libexif && cd fuzzing_libexif/

//安装依赖
sudo apt-get install autopoint libtool gettext libpopt-dev

//获取源码包
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

//构建并安装libexif
cd libexif-libexif-0_6_14-release/
autoreconf -fvi

//设置环境变量
export CC=/home/closure/AFLplusplus/afl-clang-fast
export CXX=/home/closure/AFLplusplus/afl-clang-fast++
export LLVM_CONFIG="llvm-config-11"

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

//检查插桩
cd $HOME/fuzzing_libexif/install/lib、
strings libexif.a | grep __sanitizer_cov

注意点:

libexif是一个链接库,无法直接运行==》需要一个能够调用libexif库的程序==》

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

cd exif-exif-0_6_15-release/
autoreconf -fvi

//用PKG_CONFIG_PATH指定链接库位置
./configure --enable-shared=no --prefix="$HOME/fuzzing_libexif/install/" PKG_CONFIG_PATH=$HOME/fuzzing_libexif/install/lib/pkgconfig

make
sudo make install

检查插桩是否完成

FUZZ

准备种子:

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

进行fuzz:

(注意关闭核心存储)

afl-fuzz -i $HOME/fuzzing_libexif/exif-samples-master/jpg/ -o $HOME/fuzzing_libexif/out/ -s 123 -- $HOME/fuzzing_libexif/install/bin/exif @@

暂停fuzzing查看out目录下的crash输出==》

eclipse验证fuzz结果

1、java环境:

sudo apt install default-jdk

2、安装并启动eciopse:

cd $HOME
mkdir tools && tools/

wget https : //www.eclipse.org/downloads/download.php?file=/technology/epp/ downloads/ release/2021-03/R/eclipse-cpp-2021-03 -R-linux-gtk-x86_64.tar.gz

tar -xzvf eclipse-cpp-2021-03-R-linux-gtk-x86_64.tar.gz

cd eclipse/
./eclipse

3、调用Libexif库的程序将exif导入eclipse==》

File ==》Import ==》C/C++ ==》 Existing Code as Makefile Project==》

==》对项目进行命名==》指定exif的源码路径==》选择Linux GCC索引器

配置调试参数==》

Run==》Debug Configurations==》

C/C++ Application==》 New_configuration==》

将exif项目导入==》

配置Argument进行配置==》将AFL++跑出来的ctash POC之一的路径填入==》Debug

选择Run==》Resume

==》程序在段错误的时候停止==》

GDB验证fuzz结果

使用GDB将crash文件输入到程序中:

gdb --args /home/closure/fuzzing_libexif/install/bin/exif ./clo.jpg

run运行

3、TCPdump

目标简介:

TCPdump是一个强大的开源命令行数据包分析器,支持在一些不支持图形界面的系统上使用

使用TCPdump还需安装跨平台库Libpcap支持使用

实验中使用TCPdump 4.9.2,存在CVE-2017-13028越界读取漏洞

漏洞介绍:

CVE-2017-13028是一个越界读取漏洞,通过BOOTP数据包(引导协议)触发,属于溢出

==》允许远程攻击者导致拒绝服务或可能从进程内存中获取潜在的敏感信息

目标安装,插桩,编译:

#首先设置环境变量
export CC=/home/closure/AFLplusplus/afl-clang-fast
export CXX=/home/closure/AFLplusplus/afl-clang-fast++
export LLVM_CONFIG="llvm-config-11"

#Libpcap获取
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安装
#需要先将目录修改名字,否则后续安装TCPdump的时候找不到libpcap.a的库
mv libpcap-libpcap-1.8.0/ libpcap-1.8.0

#编译Libpcap
cd libpcap-1.8.0
./configure --enable-shared=no --prefix="$HOME/fuzzing_tcpdump/install/"
AFL_USE_ASAN=1 make
AFL_USE_ASAN=1 make install

等待编译结束,去~/fuzzing_tcpdump/install/lib查看编译后的库是否插桩成功

strings lib/libpcap.a | grep __sanitizer_cov

#TCPdump安装
cd $HOME/fuzzing_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 make install

等待编译结束,去~/fuzzing_tcpdump/install/sbin查看编译后的库是否插桩成功

strings tcpdump |grep __sanitizer

查看编译好的程序是否能够正常运行:

FUZZ

准备种子:

在下载的TCPdump的目录中,存在一个tests目录,该立目录中存放着很多用来使用的例子==》作为种子

尝试种子是否可用:

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

进行fuzz:

关闭核心存储(core)

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

开始fuzz:

AFLplusplus/afl-fuzz -m none -i fuzzing_tcpdump/tcpdump-tcpdump-4.9.2/tests/ -o fuzzing_tcpdump/out/ -s 123 -- fuzzing_tcpdump/install/sbin/tcpdump -vvvvXX -ee -nn -r @@

-m参数:在使用ASAN模式下对内存的消耗非常大==》使用-m none指定禁用内存限制

fuzz结果:

结果分析:

使用TCPdump读取crash文件==》查看ASan检测结果:

$HOME/fuzzing_tcpdump/install/sbin/tcpdump -vvvvXX -ee -nn -r '/home/closure/fuzzing_tcpdump/out/default/crashes/id:000000,sig:06,src:000967,time:7691890,execs:2248945,op:havoc,rep:2'

漏洞类型:heap-buffer-overflow

4、LibTIFF

目标简介:

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

实验使用libtiff 4.0.4版本,存在CVE-2016-9297漏洞

漏洞介绍:

CVE-2016-9297:通过精心设计的TIFF_SETGET_C16ASCII 或 TIFF_SETGET_C32_ASCII 标记值==》

可以进行越界读取==》可以进一步造成拒绝服务并从进程内存中获取敏感信息

目标安装,插桩,编译:

#获取libtiff
wget https://download.osgeo.org/libtiff/tiff-4.0.4.tar.gz
tar -xzvf tiff-4.0.4.tar.gz
#编译libtiff
./configure --prefix="$HOME/fuzzing_tiff/install/" --disable-shared
AFL_USE_ASAN=1 make
AFL_USE_ASAN=1 make install

等待编译完成,检测是否插桩成功:

strings tiffinfo |grep __sanitizer

检查编译好的程序是否能正常运行:

安装LOCV:

sudo apt install lcov

FUZZ:

准备种子:

在获取的tiff源码包中的test文件夹中包含了很多已经准备好的测试用的种子:

/fuzzing_tiff/tiff-4.0.4/test/images

对种子进行测试:

./fuzzing_tiff/install/bin/tiffinfo -D -j -c -r -s -w fuzzing_tiff/tiff-4.0.4/test/images/palette-1c-1b.tiff

进行fuzz:

关闭核心存储(core)

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

开始fuzz:

AFLplusplus/afl-fuzz -m none -i fuzzing_tiff/tiff-4.0.4/test/images/ -o fuzzing_tiff/out/ -s 123 -- fuzzing_tiff/install/bin/tiffinfo -D -j -c -r -s -w @@

-m none:指定禁用内存限制

fuzz结果:

结果分析:

漏洞类型:heap-buffer-overflow

查看POC代码覆盖率

使用–coverage标志重建libTIFF:

rm -r $HOME/fuzzing_tiff/install
cd $HOME/fuzzing_tiff/tiff-4.0.4/
make clean

设置环境变量并编译:

CFLAGS="--coverage" LDFLAGS="--coverage" ./configure --prefix="$HOME/fuzzing_tiff/install/" --disable-shared

make
make install

收集代码覆盖率数据:

#重置以前的计数器
lcov --zerocounters --directory ./

#返回包含每条检测线的零覆盖率的“基线”覆盖率数据文件
lcov --capture --initial --directory ./ --output-file app.info

#运行您要分析的应用程序。您可以使用不同的输入多次运行它
$HOME/fuzzing_tiff/install/bin/tiffinfo -D -j -c -r -s -w /home/closure/fuzzing_tiff/out/default/crashes/id\:000000\,sig\:06\,src\:000089\,time\:69903\,execs\:38060\,op\:havoc\,rep\:4

#将当前覆盖状态保存到 app2.info 文件中
lcov --no-checksum --directory ./ --capture --output-file app2.info

使用genhtml将app2.info中覆盖率数据转换为HTML可视化状态:

genhtml --highlight --legend -output-directory ./html-coverage/ ./app2.info

==》代码覆盖率报告就保存在当前目录下的html-coverage文件夹下,打开index.html即可查看

5、LibXML2

目标简介:

LibXML2是Gnome项目开发的XML C的解析器和工具包,同时也可以在Gnome平台之外使用

XML本身是一种用于设计标记语言的元语言,使用尖括号之间的额外标记信息将予以结构添加内容

实验采用LibXML2 2.9.4版本该版本存在漏洞CVE-2017-9048

漏洞介绍:

CVE-2017-9048为栈溢出漏洞,影响LibXML2的DTD验证功能,远程攻击者可以利用此漏洞在使用受影响库的应用程序上进行命令执行

目标安装,插桩,编译:

#目标获取
mkdir fuzzing_libxml2
cd $HOME/fuzzing_libxml2/
wget http://xmlsoft.org/download/libxml2-2.9.4.tar.gz
tar xvf libxml2-2.9.4.tar.gz && cd libxml2-2.9.4/

#安装依赖
sudo apt-get install python-dev

#设置环境变量
export CC=$HOME/AFLplusplus/afl-clang-fast
export CXX=$HOME/AFLplusplus/afl-clang-fast++
export LLVM_CONFIG="llvm-config-11"
export CFLAGS="-fsanitize=address"
export CXXFLAGS="-fsanitize=address"
export LDFLAGS="-fsanitize=address"

#目标编译
AFL_USE_ASAN=1 ./configure --prefix="$HOME/Fuzzing_libxml2/libxml2-2.9.4/install" --disable-shared --without-debug --without-ftp --without-http --without-legacy --without-python LIBS='-ldl'

AFL_USE_ASAN=1 make -j$(nproc)
AFL_USE_ASAN=1 make install

在fuzzing_libxml2/install/bin目录中检测插桩是否成功:

strings xmllint |grep __sanitizer

使用test目录下的测试用例测试编译后的程序可运行性:

./xmllint --memory test/wml.xml

FUZZ:

准备种子:

#使用fuzzing 101提供的种子
mkdir afl_in && cd afl_in

wget https://raw.githubusercontent.com/antonio-morales/Fuzzing101/main/Exercise%205/SampleInput.xml

准备字典文件:

mkdir dictionaries && cd dictionaries
wget https://github.com/AFLplusplus/AFLplusplus/blob/stable/dictionaries/xml.dict

关闭核心存储(core)

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

开始fuzz:

采用并行测试

$HOME/AFLplusplus/afl-fuzz -m none -i afl_in -o out -s 123 -x dictionaries/xml.dict -D -M master -- libxml2-2.9.4/xmllint --memory --noenc --nocdata --dtdattr --loaddtd --valid --xinclude @@

$HOME/AFLplusplus/afl-fuzz -m none -i afl_in -o out -s 234 -S slave1 -- libxml2-2.9.4/xmllint --memory --noenc --nocdata --dtdattr --loaddtd --valid --xinclude @@

-M:指定主Fuzzer

-S:指定从Fuzzer

fuzz结果:

结果分析:

使用ASan分析fuzz结果(实在后面挂了两天没跑出来,就先放弃了)