20200906-Oracle 恶意攻击问题分析和解决(一)

在这里插入图片描述

一 常见攻击类型

1 被恶意篡改的数据库安装介质

此类攻击属于恶意破坏,攻击数据库后通常不会索要比特币等,当然也不会提供解决方案。

2 被恶意篡改的PL/SQL Devloper安装介质

此类攻击属于勒索病毒攻击,被攻击后会在告警日志中提示向某个邮箱发送固定数量的比特币,然后提供解锁数据库方式(当然也不一定可信)。

本次主要介绍第一种情况

二 问题现象

被恶意篡改的数据库安装介质问题现象
Windows环境下数据库,如果安装了 被恶意篡改的数据库安装介质,当攻击程序启动后,会清空数据库tab$表。
问题现象是当 通过PL/SQL工具数据库时,报错:

ORA-00600:internal error code,arguments:[kzrini:!uprofile],[],[],[]

三 影响范围

当前数据库处于open状态(Windows平台下可以open数据库,Linux平台下无法open,只能mount数据库),但是所有非sys用户均无法连接数据库,连接提示报错ORA-00600[kzrini:!uprofile]后连接中断,最终导致数据库无法提供服务。

四 数据库环境

操作系统:Windows Server 2008 R2
数据库版本:Oracle 11.2.0.4.0

五 问题分析和定位

5.1 查看错误日志

查看告警日志,有如下错误:

ORA-00600: internal error code, arguments: [kgmfvmi#3], [], [], [], [], [], [], [], [], [], [], []
ORA-07445: exception encountered: core dump [kgmdelsis()+121] [ACCESS_VIOLATION] [ADDR:0x10] [PC:0x102F7F9] [UNABLE_TO_READ] []
ORA-00600: internal error code, arguments: [kzrini:!uprofile], [], [], [], [], [], [], [], [], [], [], []
ORA-00604: error occurred at recursive SQL level 1
ORA-00957: duplicate column name

5.2 问题分析

根据错误号ORA-00600: internal error code, arguments: [kzrini:!uprofile], [], [], [], [], [], [], [], [], [], [], []

初步怀疑数据库tab$损坏导致以上故障。

检查tab$表数据量为0。

在这里插入图片描述 此类攻击通常是通过恶意植入DBMS_SUPPORT_DBMONITOR触发器和DBMS_SUPPORT_DBMONITORP存储过程方式,攻击数据库tab$表;

检查当前数据库确实存在这两个对象,正常情况下是不会存在这两个对象。

SET LINE 150
COL OBJECT_NAME FOR A35
SELECT OWNER,
       OBJECT_NAME,
       OBJECT_TYPE,
       TO_CHAR(CREATED, 'YYYY-MM-DD HH24:MI:SS')
  FROM DBA_OBJECTS
 WHERE OBJECT_NAME LIKE 'DBMS_CORE_INTERNA%'
    OR OBJECT_NAME LIKE 'DBMS_SYSTEM_INTERNA%'
OR OBJECT_NAME LIKE 'DBMS_SUPPORT%';

存储过程:DBMS_SUPPORT_DBMONITORP
触发器:DBMS_SUPPORT_DBMONITOR

查看存储过程和触发器攻击过程如下:
1 DBMS_SUPPORT_DBMONITOR触发器定义了,当数据库启动时会自动执行 DBMS_SUPPORT_DBMONITORP 存储过程。
2 当执行 DBMS_SUPPORT_DBMONITORP 存储过程时,会检查当前时间距离数据库创建时间是否达到300天,如果大于等于300天,会以CTAS方式对sys.tab 表进行备份,备份的表名为 O R A C H K 加 10 位随机不重复的字符串,然后执行 d e l e t e s y s . t a b 表进行备份,备份的表名为ORACHK加10位随机不重复的字符串,然后执行delete sys.tab 表进行备份,备份的表名为ORACHK10位随机不重复的字符串,然后执行deletesys.tab;删除tab$表数据,并提交删除操作,生成检查点。

存储过程和触发器如下( 请勿用于其他用途):

存储过程:
在这里插入图片描述
触发器:
在这里插入图片描述

5.3 问题定位

由于数据库多了两个对象,存储过程 DBMS_SUPPORT_DBMONITORP 和触发器DBMS_SUPPORT_DBMONITOR,恶意破坏了数据库基表tab$,导致数据库无法使用。

六 攻击可能途径

此类事件可能攻击途径有如下方式

6.1 非官方途径获取的数据库安装介质

使用非官方途径获取的数据库安装介质,可能会导致恶意代码植入破坏数据库。
检查数据库服务器上的安装介质,分别对两个介质生成SHA1值。
可以使用windows系统自动的certutil工具生成安装介质的SHA1值,例如:
在这里插入图片描述
查看官方介质SH1值,进行对比

http://support.oracle.com

数据库/GI PSU,SPU(CPU),Bundle Patches 和 Patchsets 补丁号码快速参考 (Doc ID 1922396.1)
在这里插入图片描述 曾经遇到过第一个介质P13390677_112040_MSWIN-x86-64_1of7.zip对应的SHA1值不一致,怀疑安装包文件被恶意篡改。

检查安装包 P13390677_112040_MSWIN-x86-64_1of7.zip解压后文件

database\stage\Components\oracle.rdbms.dbscripts\11.2.0.4.0\1\DataFiles\filegroup2.jar\rdbms\admin\prvtsupp.plb

以及数据库安装后 $ORACLE_HOME\rdbms\admin\prvtsupp.plb文件

D:\app\Lenovo\product\11.2.0\dbhome_1\RDBMS\ADMIN\pvtsupp.pLb

在这里插入图片描述
发现 prvtsupp.plb 文件被恶意篡改了

正常文件内容只有如下内容:
在这里插入图片描述

而当前的文件多了下面两段内容
在这里插入图片描述

在这里插入图片描述
存储过程 DBMS_SUPPORT_DBMONITORP 被加密了

使用DfUnWraper工具进行解密
在这里插入图片描述存储过程为:
在这里插入图片描述

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

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

Oracle PL/SQL Dev软件中,里面的一个文件 A fterconnet.sql

例如:

D:\cjc\plsql\PLSQL Developer 8.0.3.1510\AfterConnect.sql

其中afterconnect.sql的大小应该是0字节,login.sql打开后只有一句注释“- -Autostart Command Window script ”,如果这两个文件里有其他内容,应怀疑是病毒 ,具体排查方法见第二篇博客,本次只讨论第一种场景。

七 数据库修复建议

7.1 无法通过ORACHKXXX备份表进行修复数据库

通过攻击的存储过程信息可知,在恶意删除tab 基表前,对 t a b 基表前,对tab 基表前,对tab进行了备份,备份的数据存在新建的ORACHKXXX表中。

但是由于tabKaTeX parse error: Expected 'EOF', got '#' at position 42: …luster,并且和C_OBJ#̲通过OBJ#列进行了关联,从而…数据库,关联的递归数据也并没有恢复,数据库仍然无法使用。

查看tab$表定义如下:

SQL> select * from (select * from SYS.BOOTSTRAP$ order by line#) where rownum<=5;

在这里插入图片描述
在测试环境下测试,通过ORACHKXXX表恢复了tab$表,但数据库仍然报同样的错误,问题没有解决。
在这里插入图片描述

7.2 建议修复方式

常见修复方式是通过第三方修复工具DUL等,或oracle内部工具bbed,直接修改数据块信息,去掉tab$对应数据块内删除标记,但Oracle官方并不建议直接修改数据块,可能会引发其他未知的错误,有一定的风险。

使用DUL恢复tab$方式如下:

利用dul工具直接更改tab$表数据块,去除行删除标记

上传gdul包到服务器(win)
在这里插入图片描述
替换license _key.dat
停库,备份SYSTEM01.DBF
将原SYSTEM01.DBF文件拷贝到D:\CJC目录下
在这里插入图片描述执行dul
在这里插入图片描述查看帮助信息
在这里插入图片描述
查看数据文件信息
在这里插入图片描述

Remove delete flag from TAB$ blocks.

在这里插入图片描述

已恢复tab$表2967行数据。

将system01.dbf替换原文件

禁用所有触发器

alter system set "_system_trig_enabled"=false scope=both;

重启数据库后,数据库恢复正常
在这里插入图片描述
在这里插入图片描述
删除这两个对象

drop TRIGGER SYS.DBMS_SUPPORT_DBMONITOR;
drop PROCEDURE SYS.DBMS_SUPPORT_DBMONITORP;

7.3 检查数据库是否被攻击

SELECT OWNER,
       OBJECT_NAME,
       OBJECT_TYPE,
       TO_CHAR(CREATED, 'YYYY-MM-DD HH24:MI:SS')
  FROM DBA_OBJECTS
 WHERE OBJECT_NAME LIKE 'DBMS_CORE_INTERNA%'
    OR OBJECT_NAME LIKE 'DBMS_SYSTEM_INTERNA%'
OR OBJECT_NAME LIKE 'DBMS_SUPPORT%';

八 如何预防此类问题

8.1 建议使用正版连接工具连接数据库

建议使用正版连接工具连接数据库,例如使用正版toad连接数据库,不使用绿色破解版等连接工具连接数据库。

8.2 使用官方正版或正规途径获取的数据库安装介质

使用官方正版或正规途径获取数据库安装介质,避免安装介质被恶意篡改。

欢迎关注我的微信公众号"IT小Chen",共同学习,共同成长!! !

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值