ღ Miranda

Freefloat FTP Server “USER”命令远程缓冲区溢出漏洞

Freefloat FTP Server是免费的用于上传文件和管理有线及无线设备的软件。Freefloat FTP Server在实现上存在远程缓存区溢出漏洞,攻击者可利用此漏洞在受影响的应用程序中执行任意代码,造成拒绝服务。此漏洞源于发送非常长的响应时出现边界错误,可造成基于栈的缓冲区溢出,例如:用非常长的用户名参数发送”USER”命令或发送非常长的未知命令。

缓冲区溢出

缓冲区是用户为程序运行时在计算机中申请的一段连续的内存,它保存了给定类型的数据。缓冲区溢出指的是一种常见且危害很大的系统攻击手段,通过向程序的缓冲区写入超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其他的指令,以达到攻击的目的。

环境

本实验环境为两台虚拟机,一台为Windows XP,用于运行Freefloat FTP Serverip192.168.1.109,一台为Kali Linux,用来进行缓冲区溢出攻击,ip192.168.1.110Freefloat FTP Server的版本为1.0XP上装有调试器Immunity Debugger,用来查看堆栈状态。

确认漏洞

这个漏洞的发现相对较为简单,直接写一个脚本即可,在XP上用调试器载入程序然后按F9让程序运行起来,然后在Kali上运行如下脚本:

看到XP上程序已经崩溃停止:

img

由此可以知道USER命令存在漏洞,溢出后,EIP寄存器的值变为了41414141,这是AAAA字符串,也就是我们发送的字符,由于我们知道EIP寄存器里的值为程序下一条指令所在的地址,所以我们的思路是将EIP内存器的值改为JMP ESP这条指令所在的地址,进而执行ESP里的shellcode

精确找到溢出的字节数

为了精确填充EIP,我们要找到EIP的四个字节位于长字符串的什么位置,这里我们使用唯一字符串法,即对目标发送一个唯一顺序的长字符串根据EIP里的值确定处于字符串的什么位置,metasploit-framwork里提供了这个功能,用pattern_creat这个ruby脚本生成唯一字符串:

这里生成了500长度的字符串,然后修改脚本,将buffer的值改为这一串字符,然后发送,XP上的情形如下:

img

看到EIP里的值为376841136,然后用pattern_offset.rb可以得到精确偏移量:

偏移为230,所以我们可以从第230个字符开始填入攻击代码,先检测一下猜想正确与否,脚本修改如下:

XP上看到:

img

EIP的值为44434241,正是ABCD这四个字符,我们已经可以控制EIP的值了,接着就要把EIP的值改为JMP ESP这条指令所在的地址,为了能够应用于各种情况,我们需要找到一个程序运行时加载的系统模块中的JMP ESP命令,这个地址每次都是不变的,这里可以使用mona这个插件(https://github.com/corelan/mona),下载后放到Immunity DebuggerPyCommands目录下,先用!mona modules寻找所有被加载的模块,我选择了USER32.DLL,,选择其他的也可以,然后用如下方式获得JMP ESP指令的16进制表示:

再用!mona find -s "\xff\xe4" -m USER32.DLL查找JMP ESP命令的位置,会找到好多,我选择了0x77D29353,确认确实是JMP ESP命令:

img

修改脚本再次发送:

跳到了ESP所在的地址,这里还可以看到ESP不能从头开始填充代码,要空出8个字节,这是由函数返回值决定的,所以在shellcode前要加8个字节的空字符\x90

img

shellcode

最后就是编写并发送shellcode了,首先需要确认坏字符,有些字符可能会导致字符串的意外结束或者字符无法显示,这可能导致shellcode执行失败,要找出这些字符,方法就是发送\x00~\xff所有的字符,查看缓冲区,看哪些字符不能显示或者截断了字符:

最后找到的坏字符为\x00\x0a\x0d,在shellcode中要排除它们,用下面命令生成反弹shellshellcode:

并开启端口监听:

最终的脚本如下:

看到反弹了shell:

img

Zoomeye搜索一下使用freefloat FTP的主机能找到35个结果,列出10个:

发表评论

电子邮件地址不会被公开。