【漏洞分析】PCMan FTP Server缓冲区溢出CVE-2013-4730漏洞分析

  • A+
所属分类:安全文章

作者坛账号:hqz66


PCMan FTP Server缓冲区溢出CVE-2013-4730漏洞分析

一、漏洞信息

1. 漏洞简述

  • 漏洞名称:PCMan FTP Server远程缓冲区溢出

  • 漏洞编号:CVE-2013-4730

  • 漏洞类型:缓冲区溢出

  • 漏洞影响:远程代码执行

  • 利用难度:Easy

  • 详细信息:https://www.exploit-db.com/exploits/26471

    2. 软件概述

PCMan FTP Server用于打开ftp服务,用于上传文件和管理有线及无线设备的软件

二、漏洞复现

1. 环境搭建

  • 靶机环境:Windows xp sp3

  • 靶机配置:

    • PCMan FTP Server 2.0.7

    • windbg

    • mona

  • 攻击机:kali 2.0

  • 攻击机配置:

    • pwntools

    • metasploit

2. 复现过程

在靶机中运行PCMan FTP,确保21号端口已打开,用windbg附加程序


由漏洞的exploit可以得知USER字段存在溢出漏洞,编写poc并在 kali 中运行测试

 复制代码 隐藏代码
from pwn import *
context(log_level="debug")
io = remote("192.168.112.146", 21)
print(io.recv())
#使用pwntools的cyclic函数构造唯一子串序列
fuzz = flat("USER ", cyclic(8000))
io.sendline(fuzz)
print(io.recv())

windbg查看pcman ftp的运行状态,发现eip指向了0x7561617a非法地址,程序崩溃


观察栈帧结构,栈已被poc发送的数据填满,可以确定存在缓冲区溢出漏洞


三、漏洞分析

1. 背景知识

最简单的缓冲区溢出,分析这个漏洞主要熟悉一下用windbg进行栈回溯

2. 分析思路

思路一

ftp作为网络通信协议,客户端与浏览器进行交互使用socket,那么一定使用了recv()函数,在windbg中对recv()函数下断点,发送poc并单步跟踪,能够找到漏洞函数

思路二

栈回溯:在触发漏洞的内存地址下断点,触发漏洞时观察栈帧的结构,能够找到漏洞函数的地址。这是本文分析使用的方法

3.详细分析

查看触发栈溢出漏洞时的栈帧结构,那么溢出的数据就不能覆盖函数返回地址,就要确定返回地址的位置:发送poc后,eip指向返回地址0x7561617a


在利用pwntools的cyclic_find()函数查看0x7561617a在唯一子串序列中的位置,可以确定返回地址在序列的位置为2000(这也是为什么poc使用cyclic生成字符串的原因)


重新发送poc字符串

 复制代码 隐藏代码
fuzz = flat("USER ", cyclic(2000), 'aaaa')


此时返回地址已被‘aaaa’覆盖,令进程在覆盖返回地址之前断下,选择栈中返回地址之前设置硬件条件断点,这里我选择0x0012ed98

 复制代码 隐藏代码
ba w4 0x0012ed98 ".if(poi(0x0012ed98)==0x74616174){}.else{gc}"

重新发送poc后进程在0x004173af出断下,kb查看栈信息


栈回溯,利用IDA查看造成缓冲区赋值的函数

0x00417428处函数write_char(),向指针地址写入一个字节的数据,地址赋值不可能只写一个字节,一定有一个函数循环调用write_char()


上一层0x00412ced,sprintf函数,继续返回上一层0x00403EE6,即sub_403E60()函数


这里使用sprintf向Buffer缓冲区赋值

sprintf第二个参数aDDD02d02d05dSS是格式化格式%d/%d/%d [%02d:%02d] (%05d) %s> %s

格式化参数v5是int类型,a2是函数参数char *类型

猜想:是没有控制用户的输入长度,直接将字符串a2复制到局部变量缓冲区buffer导致栈溢出

验证,在.text:00403EE6 E8 D4 ED 00 00    call    _sprintf设置断点,查看参数a2


查看0012edc4的值,确定是用户的输入字符串,猜想正确


这里格式化获取系统时间,并将数据写入文件,可能是为了记录信息到日志中,查看PCMan ftp的日志文件,更加确认了我们的猜想



四、漏洞利用

1. 利用条件

靶机windows xp sp3关闭DEP保护,使栈上的数据可执行

2. 利用过程

2.1 排除坏字符

利用mona插件生成一个0x00到0xff的bytearray,发送payload,比对哪个字符发送后会破坏payload,将其排除即可

 复制代码 隐藏代码
!py mona bytearray -b "x00x0a