Oracle安全攻防,你可能不知道自己一直在裸奔(2)
经过加壳处理后SELECT PASSWORD FROM sys.user$ WHERE name = ‘SYS’变成了7kdkm6Z0o773a8lZj8acZwqw.uwKx$Z3hk8kZBOCKZ=Z”717.这种方式主要为了防止通过关键高危字段检测出Backdoor.虽然通过检查高危谓词或高危语句无法检查出,但Oracle已有的置换字符串函数或加密函数的总数量是有限的.针对这种使用置换字符串或加密函数的存储过程和函数进行查询,顺藤摸瓜可以很快可以找到Backdoor所在. 由于考虑到可能被数据库扫描软件捕获的可能,很多黑客倾向采用Oracle自带的,对整个存储过程进行加密的warp技术.Oracle能内部识别warp加密的内容,且不提供解密函数进行解密.黑客甚至会特别说明这是一个系统自带包,以此混淆管理员的判断,但事实上,已经有相当一部分安全厂商完全掌握了warp技术的加解密原理,并且在安全产品中加入了warp还原的能力.真正具备warp还原能力的安全产品,会在warp解密后,立即检测出Backdoor的“尾巴”. 2、数据库级Rootkit技术数据库级的Rootkit技术,在主流数据库Backdoor手段中采用最为广泛,因为其更便于实施,且行为足够隐蔽,具有数据库权限即可完成所有Rootkit. Rootkit的整体思路分为两种:
(1)换路径换路径的思路相对比较老,主要在Oracle 9i中可以使用.手段是利用synonym创建同名视图,例如:想查询有哪些用户,安全产品通常使用Select username from dba_users这样的语句;很容易发现hacker用户.但如果查询到的是我们自己创造的假dba_users,那隐蔽hacker用户就很简单了. 如何能用户访问到假的dba_users?这和Oracle 在找目标时的顺序密切相关.Oracle会先在当前用户下寻找是否有,如果没有就去private Synonyms中寻找,再找不到才会去public Synonyms中寻找.黑客会利用Creating or modify a public synonym pointing to a different object,把自己定义的视图别名成SYS.dba_user来欺骗查询的安全产品. (2)修改视图修改视图的思路是根据换路径的思路延展开来,但使用面最广泛,Oracle全版本通用.既然要做假视图,改路径,还不如直接对视图本身动手. 下图是all_users的视图内容: create or replace view all_users (username,user_id,created) as select u.name,u.user#,u.ctime from sys.user$ u,sys.ts$ dts,sys.ts$ tts where u.datats# = dts.ts# and u.tempts# = tts.ts# and u.type# = 1; comment on table ALL_USERS is ‘Information about all users of the database’; comment on column ALL_USERS.USERNAME is ‘Name of the user’; comment on column ALL_USERS.USER_ID is ‘ID number of the user’; comment on column ALL_USERS.CREATED is ‘User creation date’; 图中标红的地方是这个视图的条件判定,如果我们在这个条件中再加一条and u.name !=”HACKER”,再重建这个视图通过Select * from all_users;就再也无法查询出HACKER用户了.类似的情况不单独发生在视图all_users上,类似的还有常用来查询的dba_users、v$session,、gv_$session、flow_sessions、v_$process、dba_jobs等,这些都可以通过这种方式隐藏掉非法用户以及非法用户创建的各种视图、函数等. 在这种方式的基础上随着对视图内容的深入理解,还可以通过不满足视图中的判断条件,来使用目标隐身. 例如在ALL_users中列出的用户需要满足sys.user$.datats = sys.ts$.ts#.如果我们让这个等式不成立那hacker也就不会被显示出来.DATATS#中的数值一般在0-4之间,使用update语句对hacker用户进行调整,把他的DATATS#改到1337,不在0-4的范围内.这样sys.user$.datats = sys.ts$.ts#的等式无法成立,就查询不到hacker.下图中红线的部分很明显的显示虽然hacker已经查询不到,但依旧可以用hacker进行登录. 3、操作系统级Rootkit技术操作系统级Rootkit技术,额外需要操作系统权限.权限至少是Oracle用户的权限.思路主要可以分成三类:
(1)替换文件替换文件的思路是用某些操作前的文件覆盖操作后的文件.使得操作只有部分生效,从而达到隐藏Backdoor的目的.其中比较常见的是Oracle home/dbs/下orapworcl文件的替换.我们还是使用hacker/hacker的例子. 假如我们创建了DBA用户hacker.后把文件orapworcl备份下来,接着用drop user hacker cascade;对用户hacker进行彻底删除.删除后再把备份的orapworcl重新拷回替换新生成的orapworcl.这时候在SYS.USER$层验证会发现hacker已经消失了.但如果使用hacker/hacker还是可以以DBA身份登陆到数据库中. 这种方式虽然可以逃过SYS.USER$层的验证,但如果查询基表x$kzsrt还是可以发现hacker用户的行踪.
可以看到删除hacker用户后,把orapworcl拷贝回去hacker依旧可以登陆.SYS.user$中得记录被清除,但追到最终得基表x$kzsrt 发现其实hacker还在.有效的隐藏了hacker的存在. (2)二进制文件二进制文件的思路主要是两种: 第一种的本质是通过改变路径,使访问者访问到错误的目标.另一种是改变二进制中的判断条件,隐藏Backdoor,这可以看作是数据库级Rootkit的升级版. 第一种方式中,在Oracle文件中查询sys.user$,可以发现如下语句: 如果我们把作为查询目标的sys.user$,改成我们自己创建的SYS.aser$,我们就可以掌控呈现何种查询结果. 在Oracle文件中找到sys.user$,替换成我们的SYS.aser$.这样,用户以为查询的是sys.user$,但实际上查询的是SYS.aser$,即可实现隐藏Backdoor的目的. 除了改路径外,还可能出现改变查询的条件语句.我们回到Oracle中查看,会发现如下代码: 上图中可以看到关键语句: select inst_id,username,decode(sysdba,1,’TRUE’,’FALSE’),decode(sysoper,’FALSE’) from x$kzsrt where valid=1? and username != ‘INTERNAL’ 同样把这句改成: select inst_id,’FALSE’) from x$kzsrt where username not in(‘INTERNAL’,’HACKER’). 就可以达到隐藏hacker用户的目的. (编辑:ASP站长网) |