其实这是一个非常简单的漏洞,就是栈溢出
当时来源于一个特殊的面试,问我分析过二进制漏洞没有,我说没有,叫我去分析一个,那我就在exploit db搜寻栈溢出,终于找到一个简单的了,就是这个
漏洞软件请到这里下载吧:
http://www.52pojie.cn/thread-557521-1-1.html
环境
xp sp3 英文版(就是metasploit魔鬼训练营的xp环境)
攻击环境:kali 2.0
工具及插件:
IDA
ImmunityDebugger
https://github.com/corelan/mona
pwntools
漏洞软件:freefloatftpserver1.0
一个新手学着分析的过程
下载漏洞程序打开,可以看到已经监听21端口,程序看着也应该简单
玩一下ftpfuzz
确实可以溢出,挖洞还是fuzzing牛啊
利用mona插件查看modules信息,XP还没有搞ASLR吧
(ASLR 在 XP 时代已经提出来了,但 XP 上的ASLR 功能有限,只是对 PEB 和 TEB 进行简单的随机化处理。直到 Windows Vista 出现之后 ASLR 才真正发挥作用。)
DEP默认只针对windows自带的程序和服务(第一次还是简单点比较好)
查找jmp esp(因为知道要用,所以先查找了)
选 kernel32的吧
7C86467B FFE4 JMP ESP
利用pwntools编写脚本尝试攻击(其实那个ftp命令只要是无关紧要,随便搞个命令都可以溢出,不过返回地址有差异而已)
成功溢出
通过栈上的一些返回地址(这就是栈回溯吧),找到了ftp给客户端返回欢迎信息的地方,这是nmap等扫描器指纹识别的字符串
下断点。运行,发payload,断下来单步,跟着又弹异常
继续在这个函数下断,重来一遍,f7跟进,继续单步,看到接受我们输入的recv函数
继续,看到判断用户传的命令是否有回车的代码(跟0d,0a比较)
继续下断点,重复上面步骤
调试发现,不断去跟ftp的各种命令去比较
查看ida的话也印证了这一点
跟着比较完都不匹配,就会返回ftp服务器不明白这个命令
继续,又出现了
最终发现就是00402de这个函数有问题,查看此时的堆栈信息,我们的输入传进去了
跟进去里面有个strcpy的代码--à rep movsd
Ida查看更清晰,这个跟基础的pwn题一样………
看看变量地址
那么填充字符数量是252,因为这里没用ebp来索引 ,所以不用加上ebp
修改下代码,‘FEAT加个空格已经6个字符,所以我们补246个A就行了
当然不用计算也是可以的,mona生成一些测试样例,用于定位返回地址的
.
跟我们计算的一样的
搞个abcd看看对不对
实验可以知道计算没错
那我们尝试发送一个弹窗的shellcode过去看看
直接看结果吧
返回jmp esp的地址
至少要高8个垃圾字节啊
实验成功
总结
漏洞原因是,ftp服务器会将用户的输入复制到一个缓冲区,目的是拼接上一些用户提示信息返回给用户,使用了strcpy函数,没对长度进行检查,导致缓冲区溢出。
参考资料:
Exploit db有好几个洞实质都是一样的,不知道为啥搞了这么多上去
https://www.exploit-db.com/exploits/17550/
https://www.exploit-db.com/exploits/22351/
https://www.exploit-db.com/exploits/23243/
http://hacksys.vfreaks.com/research/freefloat-ftp-server-buffer-overflow.html