Oracle安全攻防,你可能不知道自己一直在裸奔(3)
通过修改二进制隐藏Backdoor,只从数据库层去检查是无法发现问题的.必须对操作系统中的Oracle文件进行前后hash比对才能发现问题.二进制文件的方式虽然隐蔽,但最大的问题是,需要做Oracle文件的替换.如果想要替换Oracle文件就必须把整个数据库停掉.在实际操作中需要大量的内部信息,才能有更大胜算. (3)调用方式Oracle支持多种语言来写存储过程,并不只限于SQL语句.为了躲避检查,很多有问题的存储过程会通过其它语言编写.大部分语句都支持调用本地某个动态库.如果把Backdoor封装成一个动态库,则可以通过调用的方式把Backdoor加载入内存中,调用执行.例如下面的Java后门就可以达到上述效果. CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED “JAVALOADLIB” as import java.lang.*; import java.io.*; public class JAVALOADLIB { public static void LoadLibrary(string theLibrary) throws IOException { System.load(theLibrary); } }; / CREATE OR REPLACE PROCEDURE JAVALOADLIBPROC (p_command IN VARCHAR2) AS LANGUAGE JAVA NAME ‘JAVALOADLIB.LoadLibrary(java.lang.String)’; / EXEC JAVALOADLIBPROC(‘/Oracle/Oracle/product/11.2.0/db_1/ide/lib/hacker.dll’); 由于上述过程只是加载动态库,所以很可能DBA自己写的代码中也有类似逻辑,无法在数据库中武断的认为存在Backdoor或被Backdoor所用.这种方式只能通过对hacker.dll的检查进行查找. 4、内存级Rootkit技术内存级Rootkit技术,主要方式就是把Backdoor隐藏于内存之中.隐藏于内存之中数据库本身基本是无法检查的,必须和操作系统共同合作.这种方式是4种Rootkit技术中最难被发现的,但同样也受内存的限制,一旦重启会直接被清空,需要再次植入.根据Oracle的特性,针对Oracle的内存级Rootkit技术主要可以分为三个大类:
删除SYS.user$中hacker的记录,只会删除数据库中的hacker,而无法删除SGA中的hacker.无论是查询视图DBA_users还是基表x$kzsrt,都无法发现hacker的踪影.但hacker还是在以DBA权限正常访问数据库. 除去这种自动的在SGA区中驻留的方式外,还可以把存储过程或函数直接手动强行放入SGA区中.使用这种方式不会因为SGA区中数据库的交换,而被剔除.比起上面的方法更加稳定.这源于Oracle提供的dbms_shared_pool.keep.dbms_shared_pool.keep本意是帮助数据库在SGA区中固定某些包,是为了提高工作效率而设计的.而黑客可以利用该函数,把目标包存入数据库中,躲避安全扫描类软件的检查. (2)Oradebug的门道racle自带一个给Oracle支持人员追踪Oracle深层问题的工具-Oradebug.Oradebug可以对SGA内存中的数据库进行修改.正是这个特点,可以直接对内存中的关键参数进行修改.这里我们用Oradebug修改审计参数为例:原来审计参数是被关闭,现在直接通过Oradebug打开.把目标参数从0改成1即可. 很多变量的参数可以通过类似的方式,在内存中直接定位,然后用Oradebug修改成需要的值. (3)内存的门道这个部分需要操作系统的root权限.角度有两种,一种是在内存中发现需要的值(9i版本独有).另一种则是在内存中修改特定的值(10g的一种漏洞).简单说这种方式就是在内存中找到需要修改的关键点进行修改. 例如我们在内存中找sysawr的情况: strings? /dev/shm/* | grep ‘password’ | less …. m user$ where user#=:1 by sysawr password expire account lock )change_password_on_first_use in (‘Y’,’N’)1 ….. 当然不仅仅是找到关键点后进行修改.还可以利用某些漏洞对特定的部分进行整体编码修改,改成黑客掌握的密码.内存中的Backdoor隐蔽性最高,但操作中会有诸多限制,使用并不广泛. 5、小结(编辑:ASP站长网) |