您好,欢迎访问三七文档
实验二:缓冲区溢出国家计算机网络入侵防范中心刘奇旭内容摘要1.实验目的2.实验工具3.实验步骤4.实验报告1.实验目的掌握缓冲区溢出的原理掌握常用的缓冲区溢出方法理解缓冲区溢出的危害性掌握防范和避免缓冲区溢出攻击的方法2.实验工具溢出对象:CCProxy6.2(课上分析)war-ftp1.65(自己分析)3CTftpSvc2.0.1(自己分析)调试工具:CDB/NTSD/WinDbg:这三个工具都包含在DebuggingToolsforWindows中(网上有下载)OllyDBG/IDAProetc.需要使用高级语言编程虚拟机(可选,自行安装)3.实验步骤1.介绍CCProxy6.22.CCProxy6.2缓冲区溢出漏洞说明3.CCProxy6.2缓冲区溢出漏洞演示4.CCProxy6.2缓冲区溢出漏洞利用3.1介绍CCProxyCCProxy因其设置简单和使用方便等特点,成为国内最受欢迎的代理服务器软件。CCProxy不但支持常见的HTTP和SOCKS代理,而且还支持FTP和Telnet这类不常用的协议及其它协议。3.2漏洞说明CCProxy在代理Telnet协议时,可以接受Ping命令Ping命令格式:pinghostname\r\n当hostname的长度大于或者等于1010字节时,CCProxy6.2会发生缓冲区溢出,导致程序崩溃3.3漏洞演示在目标主机运行CCProxy,使用默认设置运行CCProxy的机器IP是192.168.121.129使用telnet命令连接CCProxy:telnet192.168.121.12923返回信息:3.3漏洞演示输入ping命令,后接畸形数据:pingAAAA…在ping命令后接10个字符A,观察返回信息将字符A的数量变为100个、1000个、2000个,观察返回信息如果终端提示“Hostnotfound”,说明CCProxy正确地处理了这个畸形数据,仍工作正常如果终端提示“失去了跟主机的连接”,表明CCProxy已经崩溃3.3漏洞演示输入1000个A输入10个A3.3漏洞演示输入2000个A3.4漏洞利用于是,我们可以考虑利用CCProxy6.2的这个缓冲区溢出漏洞,利用ping命令向其发送一个长的字符串,溢出局部变量,覆盖RET的位置,从而实现程序跳转。定位RET寻找跳转指令地址构造shellcode定位shellcode存放位置编写攻击程序局部变量n……局部变量1EBPRET函数实参1……函数实参m函数栈布局3.4.1定位RET在目标主机上运行CCProxy用CDB将其挂起cdb–pnccproxy.exe3.4.1定位RET输入g继续运行在攻击主机上按前面所述telnet到目标主机上,并通过ping命令把2000个A组成的字符串发送到CCProxy时,CDB捕捉到CCProxy的AccessViolation事件3.4.1定位RET可以发现,EIP的内容为41414141(字符A的ASCII码是0x41)这是因为栈中存放RET值的地方已经被41414141覆盖,当函数返回时,就将这个值弹出到EIP寄存器EIP中存放的是程序下一条指令的地址。但程序在0x41414141地址处找不到可执行的指令,因此报错很容易想到,如果覆盖RET位置的不是0x41414141,而是指向某个跳转指令(eg.Jmpesp)的地址呢?3.4.1定位RET查看一下此时各寄存器中的内容ESP和ESI指向的内容都有我们植入的字符串3.4.1定位RET我们选择ESP寄存器来实现程序流程跳转即:将shellcode放在ESP寄存器中,然后在RET位置填充一条指向jmpesp指令的地址,于是函数返回时,就能执行jmpesp,跳转到ESP中的shellcode上运行定位:缓冲区有多大?RET位置在哪里?3.4.1定位RET利用一串不重复的字符填充缓冲区,然后查看覆盖RET的字符串,计算它们在整个字符串中的位置,从而得出缓冲区的大小及RET的偏移通过patternCreate.pl来生成不重复的字符3.4.1定位RET3.4.1定位RETTelnet到目标主机,将这串字符串通过ping命令发送给CCProxy,CDB捕捉到异常3.4.1定位RETEIP寄存器的值为:0x68423768通过patternOffset.pl计算出它在整个长为2000的字符串中的偏移是10123.4.1定位RET这说明,RET相对缓冲区的偏移大小是1012字节。由于EBP占4字节,故存放局部变量的缓冲区大小为1008字节。3.4.2寻找jmp指令地址前面说到,我们选择通过jmpesp来实现程序跳转,也就是说,要在RET的位置放置jmpesp指令的地址,那么,到哪里找jmpesp指令呢?最好是能在系统中找到现成的,而不需要我们重新再构造事实上,在Windows系统的许多DLL中都能找到jmpesp这样一条指令,一个通用的地址是0x7ffa45123.4.2寻找jmp指令地址前面分析,ping后接字符串的1012字节位置开始的4个字节将覆盖RET于是,我们便可以在字符串的这个位置上填充0x120x450xfa0x7f程序运行到此,就会转向地址0x7ffa4512找到jmpesp指令并执行,其流程发生变化3.4.3构造shellcode所谓shellcode就是一段能够完成特定功能的机器码,因其最初的功能为获得目标主机的一个shell而得名由于受目标主机的缓冲区大小限制,shellcode长度一般越小越好Shellcode一般构造步骤:用C语言实现功能将其修改为带有shellcode特点的汇编(精通汇编语言的人可直接使用汇编语言编写程序)根据汇编程序得到机器码形式的shellcode3.4.3构造shellcode在目标主机中添加一个用户账号hack3.4.4定位shellcode存放位置我们要把shellcode放置在程序崩溃时ESP指向的地址处那么,程序崩溃时,ESP指向什么位置呢?同样,我们可以用定位RET偏移的方法来定位ESP指向的位置3.4.4定位shellcode存放位置用CDB挂起CCProxy.exe利用patternCreate.pl生成长为2000的字符串用ping命令向目标主机发送这个字符串在CDB捕捉到CCProxy.exe的崩溃事件时,查看ESP的内容用patternOffset.pl计算出它在整个长为2000的字符串中的偏移3.4.4定位shellcode存放位置这说明ESP指向字符串的第4个字节因此,我们把shellcode放在字符串的第4个字节处由于这段shellcode长度只有476字节,而缓冲区大小为1012字节,足够容纳下shellcode构造好的exploit的结构如下所示:3.4.5编写攻击程序Socket编程连接目标主机(connect)构造溢出字符串(即构造后接shellcode的ping命令:pingshellcode\r\n)向目标主机发送溢出字符串(send)关闭连接3.4.5编写攻击程序运行攻击程序在目标主机上查看攻击效果4.实验说明可任选CCProxy6.2/war-ftp1.65/3CTftpSvc2.0.1进行溢出实验截止时间:2010-11-133(暂定)实验分值:20分选择CCProxy:满分按18分计选择war-ftp:满分按20分计选择3CTftpSvc:满分按20分计4.实验说明——CCProxyCCProxy官方发现CCProxy6.2的这个ping缓冲区溢出漏洞后,对其进行了修补,当ping请求超过255字节时,会自动截断。不过修补后的CCProxy版本号未变因此,在网上下载的CCProxy6.2有可能是已修补了该漏洞的程序4.实验说明——War-ftpwar-ftp漏洞提示:向服务器发送超过480字节的用户名可以触发漏洞(即使用命令USERlongString\r\n),溢出之后,ESP中的内容包含了longString中的部分内容4.实验说明——3CTftpSvc软件名称:3CTftpSvc影响版本:Currentversion:2.0.1漏洞描述:畸形的传输模式可以导致缓冲区溢出,覆盖EIP,可能造成拒绝服务攻击和远程代码执行。漏洞调试:当传输模式为mode=netascii+A*469时覆盖EIP4.实验说明实验报告要求详细分析漏洞的细节写出详细的实验步骤附上攻击程序源代码附上实验过程截图和结果截图提出防范此类缓冲区溢出漏洞的方法阐述碰到的问题及解决方法阐述收获和体会阅读相关论文,阐述阅读体会谢谢liuqx@nipc.org.cn
本文标题:实验2:缓冲区溢出
链接地址:https://www.777doc.com/doc-1794618 .html