任务
In order to complete this exercise, you need to:
- Find an efficient way to fuzz TCPdump
- Try to figure out how to enable ASan for fuzzing
- Fuzz TCPdump until you have a few unique crashes
- Triage the crashes to find a PoC for the vulnerability
- 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 |
编译tcpdump:
rm -r ./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正常被执行: