我是如何发现CCProxy远程溢出漏洞的

上传人:橙** 文档编号:333356293 上传时间:2022-09-01 格式:PDF 页数:9 大小:88.37KB
返回 下载 相关 举报
我是如何发现CCProxy远程溢出漏洞的_第1页
第1页 / 共9页
我是如何发现CCProxy远程溢出漏洞的_第2页
第2页 / 共9页
我是如何发现CCProxy远程溢出漏洞的_第3页
第3页 / 共9页
我是如何发现CCProxy远程溢出漏洞的_第4页
第4页 / 共9页
我是如何发现CCProxy远程溢出漏洞的_第5页
第5页 / 共9页
亲,该文档总共9页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《我是如何发现CCProxy远程溢出漏洞的》由会员分享,可在线阅读,更多相关《我是如何发现CCProxy远程溢出漏洞的(9页珍藏版)》请在金锄头文库上搜索。

1、我是如何发现 CCProxy远程溢出漏洞的CCProxy是一个国产的支持HTTP、FTP、Gopher、SOCKS4/5、Telnet、Secure(HTTPS)、News(NNTP)、RTSP、MMS 等代理协议的代理服务器软件。因为其简单易用、界面友好,非常适合在对流量要求不高的网络环境中使用,所以在国内有很多初级的网管喜欢用这个软件,有时候我在公司上网也要用它做代理。前些日子我测试发现 CCProxy 6.0版本存在多处缓冲区溢出漏洞,可以导致攻击者远程执行任意代码。TIPS:什么是 Gopher、RTSP、MMS?Gopher是 Internet上一个非常有名的信息查找系统,它将 In

2、ternet上的文件组织成某种索引,很方便地将用户从Internet的一处带到另一处。允许用户使用层叠结构的菜单与文件,以发现和检索信息,它拥有世界上最大、最神奇的编目。RTSP 是 Real Tranfer Stream Protocol的缩写,翻译为实时传输流协议,用来传输网络上的流媒体文件,如RM 电影文件等,它的下载方法请看后文悄悄下载流媒体。MMS 是 Multimedia Messaging Service的缩写,中文译为多媒体信息服务,它最大的特色就是支持多媒体功能,可以在GPRS、CDMA 1X的支持下,以WAP 无线应用协议为载体传送视频短片、图片、声音和文字,彩信就算MMS

3、 协议中的一种。漏洞发现过程其实发现这个漏洞是很偶然的,当时在考虑公司产品的黑盒测试方案的时候,我想使用模板测试用例的方式来进行网络部分的边界测试。这是比较传统的黑盒测试方法,其核心内容就是把网络协议包分块,然后制定出对各个块的测试策略,最后按照策略对所有块逐步进行测试。这种测试方法的好处在于可以有效的控制测试进度,以及可以比较详细地测试一个网络协议的所有部分,而且在测试过程中还可以不断地加入新的测试用例,以完善测试计划。测试程序的编写则可以使用脚本语言或C 来完成。TIPS:什么是黑盒测试?黑盒测试法把程序看成一个黑盒子,完全不考虑程序的内部结构和处理过程。黑盒测试是在程序接口进行的测试,它

4、只检查程序功能是否能按照规格说明书的规定正常使用,程序是否能适当地接收输入数据产生正确的输出信息,并且保持外部信息的完整性。黑盒测试又称为功能测试。名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 9 页 -我就是用这种方法测试公司的产品的时候,恰好当时在公司内部网之间使用CCProxy做代理服务器,因为测试HTTP 协议要通过这个代理,所以测试过程中发现CCProxy崩溃了,也因此发现了这个漏洞,算是偶然吧。漏洞分析过程CCProxy的 HTTP 代理端口默认是808,这个端口可以在其界面中进行更改。漏洞的原理很简单,就是对CCProxy的 HTTP 代理端口发送URL 超过 4

5、056字节的畸形请求,CCProxy就会发生堆栈溢出。后来发现,不仅仅是GET 请求存在此问题,所有POST、HEAD 等请求也都会导致溢出。在分析其原理后又发现CCProxy的 Telnet代理也存在该问题。现在来详细介绍一下我分析这个漏洞的过程。在发现了发送超长请求可以导致CCProxy出错以后,就开始分析溢出点以及利用限制。所要用到的工具是SOFTICE调试器和 IDA 反汇编工具。TIPS:很多人都知道使用WINDASM反汇编,但经过它反汇编出来的代码非常简单,很不容易看明白,但IDA 就不一样了,它不但会反汇编程序,并会尽量分析程序,并加上相应的注释。正因为这样,IDA 反汇编一个大

6、的程序会花非常长的时间。整个调试分析漏洞的过程如下:首先在SOFTICE中下断点:Bpx ntdll!KiUserExceptionDispatcher,这个命令的意思就是程序运行到Ntdll.dll中的KiUserExceptionDispatcher就停下来,交给SOFTICE 进行处理。KiUserExceptionDispatcher这个函数是Windows的异常处理过程中的很重要的一个步骤,它负责派发用户层空间发生的所有异常到异常链中的异常处理函数地址,每当在用户层空间发生异常的时候就会调用这个函数。SOFTICE默认是没有加载Ntdll.dll的,所以我们可以通过DriverStu

7、dio套件中的一个叫做“Symbol Loader”的工具的Load Exports来加载这个DLL 文件。设好断点后,就用一个简单的程序向808 端口发送“GET/AAAA.4056 bytes HTTP/1.0”这样的超长字符串,其中包含4056个 A 的超长 URL。发送之后 SOFTICE 会跳出来并停在KiUserExceptionDispatcher断点上,这时候用“dd(*(esp+4)+b8”命令来查看出错时的EIP 地址,这是因为KiUserExceptionDispatcher的函数参数是一个指向保存异常发生时的寄存器的结构,该结构从偏移0 x8c 的位置开始保存寄存器值,

8、其具体保存寄存器值如下:0 x08c Gs 0 x090 Fs 0 x094 Es 名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 9 页 -0 x098 Ds 0 x09c Edi 0 x0a0 Esi 0 x0a4 Ebx 0 x0a8 Edx 0 x0ac Ecx 0 x0b0 Eax 0 x0b4 Ebp 0 x0b8 Eip 0 x0bc Cs 0 x0c0 EFlags 0 x0c4 Esp 0 x0c8 Ss 用“dd(*(esp+4)+b8”命令发现出现异常的EIP 是 0 x41414141,我们知道0 x41就是 A 的 ASCII码,所以现在已经证实我们发送

9、的超长字符串已经覆盖了某个函数的返回地址,导致该函数返回的时候返回到0 x41414141这样的地址。此时退出SOFTICE 就会弹出“0 x41414141指令引用 0 x41414141的内存。该内存不能 read。”这样的应用程序错误对话框。TIPS:“0 x41414141指令引用 0 x41414141的内存。该内存不能read。”这种是典型的溢出提示,明确告诉我们溢出的地址和错误,对进一步分析溢出很有好处。接下来,我们还需要知道究竟是什么地方导致函数返回地址被覆盖的。因此我们逐渐减少发送的字符串长度,发现当发送4039字节时就不会导致出错了。由于堆栈和返回地址被覆盖,我们无法看到导

10、致溢出的地址到底是哪里,但是根据经验推测,这可能是一个由 Strcpy、Strcat或 Sprintf等函数导致的溢出。因此我们在这些函数下断点,然后再次发送4056字节的长 URL 命令。但是发现没有在这些函数中断下来,证明溢出过程并没有调用这些函数。到了这里似乎没有好的办法能够确定溢出位置了,但是通过观察发生溢出后的堆栈内容,可以看到根据当时的堆栈中的连续大片的“AAAA”和开头的时间和“unknown Web”字符串等信息得知,当对堆栈中对这些地址写入内容的时候会导致覆盖返回地址,所以我们直接对堆栈地址设写断点,使用命令“bpmd 01977908 w”来对 0 x01977908的地址

11、设一个写操作断点,这个地址是我们通过观察溢出发生后的ESP 来得到的,因为这应该就是函数返回之后的ESP,即栈顶地址。但是这个地址是不固定的,可能不同的系统上这个地址也不一样,即使在同一个系统上,这个地址也随每次CCProxy进程的名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 9 页 -启动而不同。但是在同一个系统上,一般试几次就会使用同样的地址,所以我们只需要多试几次就肯定能够中断下来了。在设断点之前首先要用Addr ccproxy来进入CCProxy的进程地址空间。经过仔细分析发现,当调用0040A410这个函数之前,会进行压栈操作,这个压栈恰好会把函数返回地址写入到堆栈0

12、1977908的位置,所以我们有理由相信就是调用这个 0040A410这个函数的过程当中导致了溢出。在0040A410函数入口出设断点,然后发送溢出字符串,中断后按F12(即执行到函数返回),可以看到恰好返回到0 x41414141的地址,这就印证了我们的推测,溢出确实发生在0040A410函数当中。然后我们用 IDA 来反汇编 CCProxy.exe来看看 0040A410函数到底进行了哪些操作。反汇编的代码如下:text:0040A410 sub_40A410 proc near;CODE XREF:sub_408A10+114 p.text:0040A410;sub_408A10+262

13、 p.text:0040A410 mov eax,280Ch.text:0040A415 call _alloca_probe;分配 0 x280c大小的缓冲区.text:0040A41A mov eax,dword_501D04.text:0040A41F push ebp.text:0040A420 mov ebp,esp+2814h;这是要记录的内容,作为参数传入可以看到这个函数调用“_alloca_probe”函数来进行缓冲区分配,它和普通函数调用Sub esp,xxx的方式来分配缓冲区有点不同,这是因为需要分配的缓冲区太大,直接减 ESP 可能会导致直接到达未分配的地址空间,所以需要

14、用“_alloca_probe“来分配这个大缓冲区。我们再继续跟踪这个函数,发现到0040A607的指令时覆盖了函数的返回地址。代码如下:.text:0040A5F1 lea ecx,esp+414h.text:0040A5F8 push ebp.text:0040A5F9 push ecx.text:0040A5FA lea edx,esp+1820h.text:0040A601 push offset aSS_0;%s%s.text:0040A606 push edx.text:0040A607 call _sprintf 在这个调用了“_sprintf“函数,按照“日期 内容”的格式存入

15、0 x1820大小的局部字符串缓冲区中,由于没有限制长度,所以导致了缓冲区溢出。再仔细查看发现“_sprintf”函数是在 CCProxy自己的代码段里面实现的,而没有调用“msvcrt.dll”导出的 Sprintf函数,难怪我们前面在Sprintf函数下断点没有拦截到!名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 9 页 -说句题外话,现在市场上有些防溢出软件产品是利用拦截系统的字符串拷贝函数然后回溯堆栈的方法,并宣称从根本上解决了系统缓冲区溢出的问题。这根本就是无稽之谈,因为很多溢出都是软件自己的代码实现导致溢出的,例如这个CCProxy溢出这样,根本就不调用任何系统函数

16、,所以那种保护方法并不能从根本上解决溢出的问题。在 0040A410函数返回的时候,就会返回到被覆盖的地址去。代码如下:.text:0040A700 add esp,280Ch;恢复堆栈.text:0040A706 retn;返回到这里我们已经可以看出,0040A410这个函数其实是一个记录CCProxy日志的函数,它按照“日期 内容”的格式来记录日志,但是在构造日志字符串的时候没有限制长度,所以导致了缓冲区溢出。我们已经找到了导致溢出的位置,接下来就要看看如何利用这个漏洞了。漏洞利用要利用漏洞,就要找到覆盖返回地址的字符串偏移。我们可以通过发送AAAABBBBCCCCDDD 这样的组合字符串看到底是哪里覆盖了返回地址。经过一番分析,得知在 4056 的偏移处恰好覆盖了函数返回地址。所以我们这样来设计溢出字符串:GET/AAAA .|shellcode|jmp esp|jmp back|HTTP/1.0其中“AAAA”这样的字符串是为了在执行ShellCode之前腾出足够的空间,因为字母 A 所对应的 CPU 指令是 INC ECX,即一条无实际作用的指令,相当于传统的NOP指令,但是

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 初中教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号