LSD RPC 溢出漏洞之分析 (转自安全焦点)

/*************************************************************************
今天晚上去安全焦点,结果上不去了,去www.shopsky.com,发现好像是因为lsd漏洞分析这篇文章惹了祸,就去google搜了一下,国内的站点除了安全焦点只有绿盟发了lsd漏洞分析这篇文章,结果今天晚上绿盟也上不去了……难道因为这个……出了事么?
但是安全漏洞是不能遮遮掩掩的,正好小弟有收藏这篇文章,发上来给大家。
*************************************************************************/

--------------------------------------------------------------------------------

LSD RPC 溢出漏洞之分析
原始文档:http://www.xfocus.net/articles/200307/579.html
创建时间:2003-07-25
浏览次数:
原创:flashsky (flashsky1_at_sina.com)

转摘请注明作者和安全焦点
作者:FLASHSKY
作者单位:启明星辰积极防御实验室
WWW SITE:WWW.VENUSTECH.COM.CN WWW.XFOCUS.NET,WWW.SHOPSKY.COM
邮件:[email protected],[email protected],[email protected]
感谢BENJURRY做测试,翻译和代码的通用化处理。
邮件:[email protected]

LSD 的RPC溢出漏洞(MS03-26)其实包含了2个溢出漏洞,一个是本地的,一个是远程的。他们都是由一个通用接口导致的。
导致问题的调用如下:
hr = CoGetInstanceFromFile(pServerInfo,NULL,0,CLSCTX_REMOTE_SERVER,STGM_READWRITE,L"C:\\1234561111111111111111111111111.doc",1,&qi);
这个调用的文件名参数(第5个参数,会引起溢出),当这个文件名超长的时候,会导致客户端的本地溢出(在RPCSS中的GetPathForServer函数里只给了0X220堆栈的空间,但是是用lstrcpyw进行拷贝的),这个我们在这里就不深入研究了(不过这个API先会检查本地文件是否存在,在进行处理,因此由于建不了长文件,所以要利用这个溢出不能直接调用这个API,而是构造好包信息以后直接调用LPC的函数,有兴趣的可以自己去试。),我们来讲解一下远程的溢出。
在客户端给服务器传递这个参数的时候,会自动转化成如下格式:L“\\servername\c$\1234561111111111111111111111111.doc"这样的形式传递给远程服务器,于是在远程服务器的处理中会先取出servername名,但是这里没做检查,给定了0X20(默认NETBIOS名)大小的空间,于是堆栈溢出产生了:
问题代码如下:
GetPathForServer:
.text:761543DA push ebp
.text:761543DB mov ebp, esp
.text:761543DD sub esp, 20h <-----0x20空间
.text:761543E0 mov eax, [ebp+arg_4]
.text:761543E3 push ebx
.text:761543E4 push esi
.text:761543E5 mov esi, [ebp+hMem]
.text:761543E8 push edi
.text:761543E9 push 5Ch
.text:761543EB pop ebx
.text:761543EC mov [eax], esi
.text:761543EE cmp [esi], bx
.text:761543F1 mov edi, esi
.text:761543F3 jnz loc_761544BF
.text:761543F9 cmp [esi+2], bx
.text:761543FD jnz loc_761544BF
.text:76154403 lea eax, [ebp+String1]《-----------写入的地址,只有0X20
.text:76154406 push 0
.text:76154408 push eax
.text:76154409 push esi 〈----------------------我们传入的文件名参数
.text:7615440A call GetMachineName
。。。。。。。。。。。。。。。。。。。。。。。。。。 此函数返回的时候,溢出点生效

GetMachineName:
.text:7614DB6F mov eax, [ebp+arg_0]
.text:7614DB72 mov ecx, [ebp+arg_4]
.text:7614DB75 lea edx, [eax+4]
.text:7614DB78 mov ax, [eax+4]
.text:7614DB7C cmp ax, 5Ch 〈-----------------只判断0X5C
.text:7614DB80 jz short loc_7614DB93
.text:7614DB82 sub edx, ecx
.text:7614DB84
.text:7614DB84 loc_7614DB84: ; CODE XREF: sub_7614DA19+178j
.text:7614DB84 mov [ecx], ax 〈----------------写入上个只有0X20的空间,超过就溢出
.text:7614DB87 inc ecx
.text:7614DB88 inc ecx
.text:7614DB89 mov ax, [ecx+edx]
.text:7614DB8D cmp ax, 5Ch
.text:7614DB91 jnz short loc_7614DB84
.text:7614DB93

OK,我们现在就需要想法来利用这个漏洞,由于\\SERVERNAME是由系统自动生成的,我们只能利用手工直接生成RPC的包来实现,另外SHELLCODE中不能包含0X5C,因为这样判断就是\\SERVERNAME结束了。
下面就给出一个实现的代码,注意点如下:
1.由于RPCRT4,RPCSS中没有JMP ESP的代码,这里使用了OLE32.DLL中的,但是这可能是会重定位的,大家测试的时候
需要再确定或自己找一个存在的JMP ESP的代脉,我的这是WIN2000+SP3上的地址且OLE32未重定位情况下的。
2。这里使用了反向连接的SHELLCODE,需要先运行NC
3。程序中的SC的整体长度必须满足sizeof(sz)%16=12的关系,因为不是整数的话,整个包的长度会有一些填充,那么
计算就不满足我这里给出的一个简单关系了,会导致RPC包的解析无效果。
4。在溢出返回前,返回地址后面的2个参数还会使用,所以需要保证是个内存可写空间地址。
5,这里是直接使用堆栈溢出返回的,其实大家也可以尝试一下覆盖SEH,这里就不再多讲
---------------------------------------------------------------

能看懂尽量看,看不懂的话最好还是先把基础打好!!!:)
---------------------------------------------------------------

up learn
---------------------------------------------------------------

up,it's a good article
---------------------------------------------------------------

呵呵,懂的讲讲那些shellcode怎么出来得?又是怎么溢出得?

Published At
Categories with 服务器类
Tagged with
comments powered by Disqus