Quick 'n Easy FTP Server Lite ---- ----Exploit Introduction Author : Jesse Quick’n Easy FTP Server Lite 是一款Ftp工具,可以在本地搭建一个快速的FTP服务器,改程序存在两处缓冲区溢出漏洞,两个漏洞分别可以实现ftp强制登录以及远程代码执行。 漏洞存在两处: 1.当你用户名密码超过96位时,可以强制登录,也不需要暴力破解了 2.其次登录过后,你发送的数据包如果超长会导致缓冲区溢出 我先观察了一下溢出环境: 第一次测试: CONTEXT DUMP EIP: 49414449 Unable to disassemble at 49414449 EAX: 00000000 ( 0) -> N/A EBX: 00000000 ( 0) -> N/A ECX: 49414449 (1229014089) -> N/A EDX: 77a871ad (2007527853) -> N/A EDI: 00000000 ( 0) -> N/A ESI: 00000000 ( 0) -> N/A EBP: 01d31438 ( 30610488) -> kqwIDAIwIDAIrxowIDAIIDAI (stack) ESP: 01d31418 ( 30610456) -> qwlqwkqwIDAIwIDAIrxowIDAI (stack) +00: 77a87199 (2007527833) -> N/A +04: 01d31500 ( 30610688) -> IDAIIDAI;##qwIDAIxIDAIFX# (stack) +08: 01e2e614 ( 31647252) -> AIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDA (stack) +0c: 01d3151c ( 30610716) -> ;##qwIDAIxIDAIFX# (stack) +10: 01d314d4 ( 30610644) -> rxowIDAIIDAI;##qwIDAIx (stack) +14: 01d3196c ( 30611820) -> qw(kqw@\IDAI@w@\IDAI@row@\@\IDAIIDAI (stack) 第二次测试: CONTEXT DUMP EIP: 49414449 Unable to disassemble at 49414449 EAX: 00000000 ( 0) -> N/A EBX: 00000000 ( 0) -> N/A ECX: 49414449 (1229014089) -> N/A EDX: 77a871ad (2007527853) -> N/A EDI: 00000000 ( 0) -> N/A ESI: 00000000 ( 0) -> N/A EBP: 01e51438 ( 31790136) -> kqwIDAIwIDAIrxowIDAIIDAI (stack) ESP: 01e51418 ( 31790104) -> qwlqwkqwIDAIwIDAIrxowIDAI (stack) +00: 77a87199 (2007527833) -> N/A +04: 01e51500 ( 31790336) -> IDAIIDAI;##qwIDAIxIDAIFX# (stack) +08: 01f4e614 ( 32826900) -> AIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDA (stack) +0c: 01e5151c ( 31790364) -> ;##qwIDAIxIDAIFX# (stack) +10: 01e514d4 ( 31790292) -> rxowIDAIIDAI;##qwIDAIx (stack) +14: 01e5196c ( 31791468) -> qw(kqw@\IDAI@w@\IDAI@row@\@\IDAIIDAI (stack) 从这个信息我们能知道两个问题: 第一,缓冲区溢出导致溢出了EIP指针,第二,堆栈是使用的随机堆栈地址,这无疑给我们后面要进行缓冲区溢出执行shellcode造成了难度。 后来通过IDA找到了处理字符串的代码处: .text:00407A20 push ebp .text:00407A21 mov ebp, esp .text:00407A23 push 0FFFFFFFFh .text:00407A25 push offset SEH_407A20 .text:00407A2A mov eax, large fs:0 .text:00407A30 push eax .text:00407A31 mov large fs:0, esp .text:00407A38 sub esp, 2A4h 在这里下一个软断点。。。 果然没想到,这里就是FTP的消息中心,往下走到这里 00407BA6 |. E8 359BFFFF CALL FTPServe.004016E0 ; 获得你的USER PASS 和buffer 00407BAB |. 50 PUSH EAX EAX 019A1924 ASCII "LIST IDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAI ECX 01EFE738 EDX 00000002 EBX 00000001 ESP 01EFE628 EBP 01EFE8E8 ESI 01EFE974 EDI 01EFE8DC EIP 00407BAB FTPServe.00407BAB 这里看一下截图1。。。 然后一路继续往下走我找到了缓冲区溢出的具体位置 00408384 |. 8985 D8FDFFFF MOV DWORD PTR SS:[EBP-228],EAX ; 下面就是漏洞溢出点 0040838A |. E8 41ECFFFF CALL FTPServe.00406FD0 到这里我们看一下内存窗口 0162A548 00000002 ECX的指针指向这里 0162A54C 00003A99 0162A550 00003A99 0162A554 49414449 EAX EDX 都保存了一个指针指向这里 0162A558 44494144 0162A55C 41444941 0162A560 49414449 0162A564 44494144 0162A568 41444941 0162A56C 49414449 0162A570 44494144 0162A574 41444941 0162A578 49414449 0162A57C 44494144 0162A580 41444941 我们还需要继续跟进call 406fd0 跟进之后发现是strcpy函数复制的时候出错了 00407023 |. E8 B8A6FFFF CALL FTPServe.004016E0 ; strcpy出错啦 00407028 |. 50 PUSH EAX ; /src 00407029 |. 8D8D 00FEFFFF LEA ECX,DWORD PTR SS:[EBP-200] ; | 0040702F |. 51 PUSH ECX ; |dest 00407030 |. E8 D5190100 CALL <JMP.&MSVCRT.strcpy> ; \strcpy CPU窗口: EAX 018BA554 ASCII "IDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDAIDA ECX 01ECE420 EDX 00000074 EBX 00000001 ESP 01ECE3CC EBP 01ECE620 ESI 01ECE974 EDI 01ECE614 EIP 00407030 FTPServe.00407030 我们来看看这个内存的大小吧,借助一下IDA sub_406FD0 proc near var_240= byte ptr -240h Dst= byte ptr -200h var_C= dword ptr -0Ch var_4= dword ptr -4 arg_0= byte ptr 8 Dst就是strcpy的目标地址,200h == 512字节左右的样子 我们OD F8步过strcpy函数 程序完蛋了。程序发出异常退出既然不能覆盖堆栈,那么触发SEH退出了 我们看一下这里的FS:[0] dd FS:[0] 01D6E614 01D6E8DC 指向下一个 SEH 记录的指针 01D6E618 00419459 SE处理程序 我们看到01D63618是SE处理程序的指针,这里复制的EDI指向01D6E440 两者离得很近很近(500字节的距离) 也就是说这个程序可能是SEH溢出(注意:这些地址是我多次调试得出来的,所以上下文的AD可能不同) 然后我们对01D6E614下一个内存写入断点 看到SEH确实被覆盖了 01D6E60C 49414449 01D6E610 44494144 01D6E614 41444941 指向下一个 SEH 记录的指针 01D6E618 49414449 SE处理程序 (图2) 这里就和我们开始生成的异常报告吻合了 我们现在可以看到我们既可以覆盖SEH,又可以 用520个字节刚好覆盖掉下面的EIP指针。 我们先尝试覆盖EIP吧,毕竟覆盖EIP来得快点。。(截图3) 想想如何跳转到我们的shellcode. 我们可以看到,在覆盖EIP后,实际堆栈环境: 01CBE620 41414141 AAAA 01CBE624 00407064 dp@. FTPServe.00407064 01CBE628 019C320C .2? ASCII CC,"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" 也就是说,我们的返回地址下面就可以是shellcode的地址,那么retn指令执行两次就行了 只需要将第一retn的地址指向自己当前的地址就可以了(截图4)如果说以后遇到这种动态地址的问题,shellcode在自己retn address 下面,那么可以多次使用堆栈retn滑行(将retn后面至shellcode前面的数据改为retn指令的地址,这样就可以连续滑行堆栈,从而成功执行我们的shellcode) 将ftpserver.exe paper exp 打包上传到网盘上,需要的下载 http://pan.baidu.com/s/15mGRK
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课