其实这是一个非常简单的漏洞,就是栈溢出

当时来源于一个特殊的面试,问我分析过二进制漏洞没有,我说没有,叫我去分析一个,那我就在exploit db搜寻栈溢出,终于找到一个简单的了,就是这个

 

 

环境

 

 xp sp3 英文版(就是metasploit魔鬼训练营的xp环境)

攻击环境:kali 2.0

工具及插件:

IDA

ImmunityDebugger

 

pwntools

漏洞软件:freefloatftpserver1.0


一个新手学着分析的过程

 

下载漏洞程序打开,可以看到已经监听21端口,程序看着也应该简单

 

 Freefloat FTP Server 1.0 溢出漏洞分析_ftp服务器

玩一下ftpfuzz

Freefloat FTP Server 1.0 溢出漏洞分析_参考资料_02

确实可以溢出,挖洞还是fuzzing牛啊

 Freefloat FTP Server 1.0 溢出漏洞分析_栈溢出_03

利用mona插件查看modules信息,XP还没有搞ASLR吧

(ASLR 在 XP 时代已经提出来了,但 XP 上的ASLR 功能有限,只是对 PEB 和 TEB 进行简单的随机化处理。直到 Windows Vista 出现之后 ASLR 才真正发挥作用。)

Freefloat FTP Server 1.0 溢出漏洞分析_html_04

 

DEP默认只针对windows自带的程序和服务(第一次还是简单点比较好)

Freefloat FTP Server 1.0 溢出漏洞分析_html_05

查找jmp esp(因为知道要用,所以先查找了Freefloat FTP Server 1.0 溢出漏洞分析_栈溢出_06

Freefloat FTP Server 1.0 溢出漏洞分析_参考资料_07

 

选 kernel32的吧

7C86467B  FFE4             JMP ESP

利用pwntools编写脚本尝试攻击(其实那个ftp命令只要是无关紧要,随便搞个命令都可以溢出,不过返回地址有差异而已)

Freefloat FTP Server 1.0 溢出漏洞分析_指纹识别_08

成功溢出

 

 Freefloat FTP Server 1.0 溢出漏洞分析_html_09

通过栈上的一些返回地址(这就是栈回溯吧),找到了ftp给客户端返回欢迎信息的地方,这是nmap等扫描器指纹识别的字符串

Freefloat FTP Server 1.0 溢出漏洞分析_指纹识别_10

下断点。运行,发payload,断下来单步,跟着又弹异常

Freefloat FTP Server 1.0 溢出漏洞分析_ftp服务器_11

 

继续在这个函数下断,重来一遍,f7跟进,继续单步,看到接受我们输入的recv函数

Freefloat FTP Server 1.0 溢出漏洞分析_html_12

继续,看到判断用户传的命令是否有回车的代码(跟0d,0a比较)

Freefloat FTP Server 1.0 溢出漏洞分析_指纹识别_13

 

继续下断点,重复上面步骤

Freefloat FTP Server 1.0 溢出漏洞分析_参考资料_14

 

调试发现,不断去跟ftp的各种命令去比较

Freefloat FTP Server 1.0 溢出漏洞分析_栈溢出_15

 

查看ida的话也印证了这一点

 

 Freefloat FTP Server 1.0 溢出漏洞分析_ftp服务器_16

跟着比较完都不匹配,就会返回ftp服务器不明白这个命令

Freefloat FTP Server 1.0 溢出漏洞分析_参考资料_17

 

继续,又出现了

Freefloat FTP Server 1.0 溢出漏洞分析_栈溢出_18

 

最终发现就是00402de这个函数有问题,查看此时的堆栈信息,我们的输入传进去了

Freefloat FTP Server 1.0 溢出漏洞分析_html_19

跟进去里面有个strcpy的代码--à rep movsd

 

 Freefloat FTP Server 1.0 溢出漏洞分析_指纹识别_20

Ida查看更清晰,这个跟基础的pwn题一样………

Freefloat FTP Server 1.0 溢出漏洞分析_指纹识别_21

 

看看变量地址

Freefloat FTP Server 1.0 溢出漏洞分析_ftp服务器_22

 

那么填充字符数量是252,因为这里没用ebp来索引 ,所以不用加上ebp

Freefloat FTP Server 1.0 溢出漏洞分析_html_23

 

修改下代码,‘FEAT加个空格已经6个字符,所以我们补246个A就行了

 

当然不用计算也是可以的,mona生成一些测试样例,用于定位返回地址的

 

Freefloat FTP Server 1.0 溢出漏洞分析_ftp服务器_24.

Freefloat FTP Server 1.0 溢出漏洞分析_栈溢出_25Freefloat FTP Server 1.0 溢出漏洞分析_ftp服务器_26

 

跟我们计算的一样的

Freefloat FTP Server 1.0 溢出漏洞分析_栈溢出_27

搞个abcd看看对不对

Freefloat FTP Server 1.0 溢出漏洞分析_ftp服务器_28

 

实验可以知道计算没错

Freefloat FTP Server 1.0 溢出漏洞分析_ftp服务器_29

 

那我们尝试发送一个弹窗的shellcode过去看看

Freefloat FTP Server 1.0 溢出漏洞分析_指纹识别_30

 直接看结果吧

返回jmp esp的地址

Freefloat FTP Server 1.0 溢出漏洞分析_参考资料_31

至少要高8个垃圾字节啊

Freefloat FTP Server 1.0 溢出漏洞分析_html_32

实验成功

Freefloat FTP Server 1.0 溢出漏洞分析_指纹识别_33

 

总结

 

漏洞原因是,ftp服务器会将用户的输入复制到一个缓冲区,目的是拼接上一些用户提示信息返回给用户,使用了strcpy函数,没对长度进行检查,导致缓冲区溢出。

参考资料:

 

Exploit db有好几个洞实质都是一样的,不知道为啥搞了这么多上去

Freefloat FTP Server 1.0 溢出漏洞分析_ftp服务器_34

 

网络上志同道合,我们一起学习网络安全,一起进步,QQ群:694839022