0x01:背景
tcpdump-tcpdump-4.9.0存在栈溢出漏洞,CVE-2017-11543 tcpdump sliplink_print 栈溢出漏洞,形成原因及POC可以参考文尾链接,这里主要是使用AFL 来fuzzing tcpdump-4.9.0,漏洞复现推荐环境;
0x02: 编译tcpdump-tcpdump-4.9.0
实际操作发现使用以下命令安装的libpcap-dev版本与推荐复现版本不一致,可以尝试使用这个版本,我这为了与参考环境统一,下载了 libpcap v1.7.4版本。
$ sudo apt-get install libpcap-dev
$ dpkg -l libpcap-dev
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-==========================================-==========================-==========================-=========================================================================================
ii libpcap-dev:i386 1.8.1-6ubuntu1.18.04.2 i386 development library for libpcap (transitional package)
//下载tcp dump源码
$ wget https://github.com/the-tcpdump-group/tcpdump/archive/tcpdump-4.9.0.tar.gz
//解压源文件
$ tar zxvf tcpdump-4.9.0.tar.gz
$ cd tcpdump-tcpdump-4.9.0/
//生成配置文件
$ ./configure
//安装tcpdump
$ sudo make install
//查看tcpdump及libpcap版本
curits@curits-virtual-machine:~/Desktop$ tcpdump --version
tcpdump version 4.9.0
libpcap version 1.7.4
到这CVE复现环境已经搭建完了,但是使用AFL-fuzz 我们需要重新编译tcpdump!!!
0x03:Afl-fuzzing详细使用过程
安装AFL-fuzz:
//如果使用的ubuntu系统直接 sudo apt-get install afl
//下载AFL源码
http://lcamtuf.coredump.cx/afl/releases/afl-latest.tgz
//编译AFL
$ make
//安装AFL
$ sudo make install
//使用afl-gcc 编译tcpdump
//下载tcp dump源码
$ wget https://github.com/the-tcpdump-group/tcpdump/archive/tcpdump-4.9.0.tar.gz
//解压源文件
$ tar zxvf tcpdump-4.9.0.tar.gz
$ cd tcpdump-tcpdump-4.9.0/
//生成配置文件
$ ./configure CC="afl-gcc" CXX="afl-g++"
//编译tcpdump
$ make
//构建testcases 和 result
$ cd tcpdump-tcpdump-4.9.0/
//testcases 用于存放语料库,result用于输出fuzzing结果
$ mkdir testcases result
//将afl源码中的pcap示例文件拷贝到testcase文件夹
curits@curits-virtual-machine:~/Desktop/afl-fuzzing/afl-2.52b/testcases/others/pcap$ pwd
/home/curits/Desktop/afl-fuzzing/afl-2.52b/testcases/others/pcap
curits@curits-virtual-machine:~/Desktop/afl-fuzzing/afl-2.52b/testcases/others/pcap$ ls
small_capture.pcap
$ cp -rf afl-2.52b/testcases/others/pcap/small_capture.pcap tcpdump-tcpdump-4.9.0/testcases
//开始使用AFL fuzzing tcpdump
afl-fuzz -i ~/tcpdump-4.9.2/testcases/ -o ~/tcpdump-4.9.2/result/ ~/tcpdump-4.9.2/tcpdump -nr @@
//因为已经知道栈溢出漏洞是 tcpdump -e -r xxxxx.pcap ,可以使用以下命令加快fuzzing速度
afl-fuzz -i ~/tcpdump-4.9.2/testcases/ -o ~/tcpdump-4.9.2/result/ ~/tcpdump-4.9.2/tcpdump -e -r @@
AFl fuzzing界面如下所示:
0x04:Afl-fuzzing使用参数说明
afl-fuzz -i [TESTCASE DIR] -o [RESULT_DIR] [TARGET_BINARY] [BINARY_PARAMS] @@
参数 | 示例 |
---|---|
TESTCASE DIR | ~/tcpdump-4.9.2/testcases/ |
RESULT_DIR | ~/tcpdump-4.9.2/result/ |
TARGET_BINARY | ~/tcpdump-4.9.2/tcpdump |
BINARY_PARAMS | -nr |
实际fuzz效果还得后续跟进!!!
0x04:Afl-fuzzing结果
xxd 查看crash信息:
查看所有crash文件都是因为direction的值被设置成除0 和 1之外的值!!!
pcap global header: struct PCAPHEADER header
Name | Value(0x) | Start | Size |
---|---|---|---|
unint32 magic_number | a1b2d4c3 | 0h | 4h |
uint16 version_major | 02 | 4h | 2h |
uint16 version_minor | 04 | 6h | 2h |
int32 thiszone | 0 | 8h | 4h |
int32 sigflags | 0 | Ch | 4h |
int32 snaplen | 60000 | 10h | 4h |
int32 network | 08 | 14h | 4h |
Record(Packet) Header 数据包头:
Name | Value(0x) | Start | Size |
---|---|---|---|
time_t ts_sec | 546031b8 | 18h | 4h |
uint32 ts_usec | 08a5 | 1Ch | 4h |
uint32 incl_len | 4a | 20h | 2h |
int32 orig_len | 4a | 24h | 4h |
network类型为SLIP,Packet Data 结构:
从crash信息来看这里direction的值为0xfffff,从而发生了栈溢出,访问了非法的地址,dmesg信息如下所示:
0x05: 还可以使用plot分析整个fuzz过程数据
sudo apt-get install gnuplot
afl-plot ~/result ~/output/dir
参考链接:https://firmianay.gitbooks.io/ctf-all-in-one/content/doc/7.1.1_tcpdump_2017-11543.html