Fuzzing101 Exercise 3 - TCPdump

任务

In order to complete this exercise, you need to:

  1. Find an efficient way to fuzz TCPdump
  2. Try to figure out how to enable ASan for fuzzing
  3. Fuzz TCPdump until you have a few unique crashes
  4. Triage the crashes to find a PoC for the vulnerability
  5. Fix the issue

准备程序

准备TCPdump和其依赖的libpcap

根据题解的说明,需要将libpcap-libpcap-1.8.0重命名为libpcap-1.8.0,要不然编译的时候会出问题。

构建与编译libpcap:

构建与编译TCPdump:

安装完成:

样本

其中,在tcpdump下的tests目录里面,有很多示例文件:

图中的参数说明如下:
vvvv:详细输出

XX:以16进制模式显示

ee:显示帧头部的信息

nn:禁用域名解析

编译程序

这次的实验需要开启AddressSanitizer,ASan是一个内存检测器,可以用来检测和调试与内存相关的问题比如缓冲区溢出等问题。

编译libpcap:

make clean
export LLVM_CONFIG="llvm-config-11"
./configure CC=afl-clang-lto --enable-shared=no
AFL_USE_ASAN=1 make

编译tcpdump:

rm -r ./install/
make clean
AFL_USE_ASAN=1 ./configure CC=afl-clang-lto --enable-shared=no --prefix=`pwd`/install/
AFL_USE_ASAN=1 make && make install

编译完成后,准备进行fuzz。

开始fuzz

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

其中-m选项可以指定内存限制模式,指定为none表示不限制其使用的内存量。

fuzz了两天,才出了一个crash,不知道是不是脸太黑了,还是有什么没有注意到的点。。。

验证crash

ASan提示堆溢出,给出了具体的相关信息。

修复

可以发现导致漏洞发生的strcmp被做了处理

修复后之前的crash正常被执行:

文章作者: Alex
文章链接: http://example.com/2023/07/09/fuzzing-lab3/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Alex's blog~