warftp漏洞利用实验
2019-04-24 14:18:55
一 漏洞分析
1.1 验证漏洞
在Windows XP虚拟机中,使用OllyDbg装载war-ftp1.6.5,并运行程序。允许匿名登录FTP。
图1是正常情况下系统的界面:
利用python代码来验证漏洞:
1 | from ftplib import FTP |
发送登录请求后,系统还能够正常使用,状态无明显变化,因为warftp是多线程的。
利用CDB进行调试,再次发送登录请求,当登录的用户名长度达到500个字节时,CDB能够捕捉到错误的信息。在调试器中,能够看到EIP指向了41414141(41为’A’的ASCII码)如图2所示:
1.2 定位溢出点地址
利用PatternTool生成2000个不循环的字符串,作为用户名,向warftp发起请求,这里EIP被填充为32714131,执行patterntool,计算出RET的偏移量为485,如图3所示。由于EBP占4个字节,所以存放局部变量的缓冲区大小为481个字节。
1.3 寻找JMP指令地址
希望通过在RET的位置放置jmp esp
指令的地址,来实现程序的跳转。在Windows系统的许多DLL中都能找到这条指令,一个通用的地址是0x7ffa4512。
因此继续来验证改地址的指令是否为jmp esp
。如图4所示,可以看到地址为0x7ffa4512的指令的确为jmp esp
。
二 漏洞利用
2.1 构造Shellcode
这里从metasploit上选择一个弹出命令行对话框的Shellcode。
1 | buf += "\x55\x8B\xEC\x33\xFF\x57\x83\xEC\x04\xC6\x45" |
2.2 定位Shellcode存放位置
在程序崩溃时,查看ESP指向的内容为0x71413471,计算其偏移量为493。说明ESP指向字符串的第493个字节。因此,把Shellcode放在字符串的第493个字节。
2.3 完整Payload
在确定了Shellcode的存放位置,以及jmp esp
指令的地址之后,继续来构造完整的Payload进行攻击。
1 | buf = 'A' * 485 + '\x12\x45\xfa\x7f' + 'B' * 4 |
2.4 攻击主机
编写攻击代码,向目标发送payload。可以看到成功弹出了命令行。说明攻击成功。