缓冲区溢出漏洞实战
记一个缓冲区溢出漏洞原理与利用的过程,加深对缓冲区溢出漏洞的理解,学习缓冲区溢出漏洞的防范方式。
搭建Windows10 FTP服务器
控制面板,程序与功能,选择启用或关闭Windows功能,在IIS中选择下列内容
确定之后等待几分钟Windows自动配置
然后进入开始面板,找到Windows管理工具,里面有个IIS管理器,打开:
在左侧选择新建FTP站点,如下图:
填写站点信息:
配置IP和端口:
配置权限:
xp虚拟机访问:
war-ftp 1.65
环境
ollydbg
war-ftp 1.65
Windows 10
Windows xp sp1
VC++6.0
python 3.7.2
使用ollydbg打开程序
然后点击开始运行,出现下面的界面:
允许匿名登录,点击那个最左边的黄色闪电符号开启服务
编写测试溢出的代码
根据ppt内容,我们可以知道,漏洞是在向服务器发送超过480字节的用户名可以触发漏洞(即使用命令USER longString\r\n),溢出之后,ESP中的内容包含了longString中的部分内容。
编写python脚本,链接ftp服务:
运行之后可以看到xp虚拟机中的程序已经崩溃了,查看ollydbg,我们可以看出EIP的值已经改变,编程41414141,也就是A的ascii码,证明确实有溢出漏洞。
确定溢出点
ppt上面说是超过480,那么我们先用480试试
我们发现EIP变成了43434343也就是字符C,我们进一步确定溢出点应该是在486到490之间,继续细化:
我们可以看到EIP变成了45444342 即EDCB,因此溢出位置应该是在486-489
查找JMP ESP指令地址
如果选择 ESP 为跳转的寄存器,则需要 JMP ESP 的指令地址,在中文 Windows 系统核心 dll 中查找, 找到XP kernel32.dll 的 JMP ESP:0x77fb59cc ,此外可以使用中文 WIN 2K/XP/2003 下通用的 JMP ESP : 0x7ffa4512
代码:
1 |
|
构造攻击代码
构造的攻击字串如图所示。
这里我们构造一个简单的shellcode简单验证一下原理:
构造shellcode使目标机运行cmd
查找WinExec的地址,ctrl+G输入WinExec即可:
我们可以看到WinExec在我的xp虚拟机中的地址是77e4fd35
构造出来的payload:
执行使用payload进行登录:
成功执行了目标机的CMD。
后面可以去网上找一些比较功能完善的shellcode,比如创建一个系统管理员用户等。
源码:
1 |
|
防范方法
从代码编写的角度来说,对于缓冲区的操作要进行严格的边界检查,这可借助一些工具如编译器来实现,像这次实践的 war-ftp 1.65 就应该对用户名数组边界进行检测;从运行状态来看,可进行动态保护,主要是数组边界检查和保证返回指针的完整性;从开发语言来看可使用安全的函数检测输入是否越界; 此外还可以从系统的角度阻止攻击代码的执行,例如非执行的缓冲区技术。对于操作系统而言, Windows 从 XP SP2 引入的 DEP(Data Execution Prevention) 即“数据执行保护”,一直延续到此后的 Windows Server 2003 、 Windows Server 2008 中,后者的 Address Space Load Randomization 让缓冲区溢出攻击变得非常困难,在 Windows 7 中, DEP 默认是激活的。