首页
社区
课程
招聘
[原创]Quick 'n Easy FTP Server Lite漏洞分析手记
发表于: 2013-10-28 16:48 10009

[原创]Quick 'n Easy FTP Server Lite漏洞分析手记

2013-10-28 16:48
10009

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


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 5
支持
分享
最新回复 (6)
雪    币: 19
活跃值: (130)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
这个程序是xdsec的一道题,比赛没做完,今天拿出来分析了一下。
2013-10-28 16:50
0
雪    币: 702
活跃值: (4584)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
学习 为毛回复不了
2013-10-28 17:58
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
你也参加了xdsec线下赛,分析的比我好,那个组的哇?
http://blog.csdn.net/tai_yang_feng/article/details/12921231
2013-11-7 13:54
0
雪    币: 2332
活跃值: (3809)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
5
网上有现成脚本,但是没成功~~
2013-11-8 21:58
0
雪    币: 19
活跃值: (130)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
我是wpsec的,抱歉最近忙一些事情,现在才看到。。
2013-11-14 15:57
0
雪    币: 24
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
哈哈哈。。曹小杰
2013-11-14 16:56
0
游客
登录 | 注册 方可回帖
返回
//