早期客户数据库软件被注入恶意代码,导致数据库无法启动,报错ORA-00600: internal error code, arguments:[16703], [1403], [20],由于恶意攻击,$ORACLE_HOME/rdbms/admin/prvtsupp.plb被注入恶意代码,因prvtsupp.plb为加密文件,可使用网名“大头”的"unwrap.jar"解密查看。核心部分为一个触发器一个存储过程,清空了tab$,导致数据库启动时,bootstrap阶段无法完成。这里过多原因不再赘述,这里只讲干货。如果有备份的话,那么很简单就不展开了,本文主要介绍没备份的方法。
一. 因客户数据保密性,这里选择构造模拟场景:
1. 创建清空TAB$存储过程
2. 创建触发器
3. 创建test表测试数据
修改系统时间,abort数据库,重启后报错如下:
二 . 恢复步骤:
1. 使用核心恢复shell scan.sh生成恢复脚本(该脚本不做公布)
--//主要时间消耗在第3步,大约需要5分多钟.看看生成修改的脚本:
$ls scan**.bbed*
scan3_bbed.txt --修改记录flag偏移脚本
scan4k_bbed.txt
scan4m_bbed.txt --修改mref_offset标识
san5_bbed.txt --sum apply脚本
2. 使用scanx.sh脚本检查tailchk值,这里tailchk值都一致。如不一致,需要去分析tailchk值是不是相差过大,如相差过大多数原因在于近期执行了delete操作,这部分内容不需要恢复。
$ cat scanx.sh
#! /bin/bash
grep dba scan3_bbed.txt | cut -d" " -f4 | uniq | while read dba
do
echo -n $dba :
echo "p dba $dba offset 8188"| rlbbed | grep "ub4 tailchk"
done
$ . scanx.sh | cut -c64-71 | sort|uniq -c
3. 执行生成的bbed脚本
4. 禁用sys.tab$的索引I_TAB1
5.禁用job和系统触发器,启动数据库
6. drop破坏脚本
7. 检查破坏脚本tab$备份表ORA与tab$记录
SQL> select count(*) from (
select obj# from ORACHK1C350A4E053D200A8C0FE9E
minus
select obj# from tab$);
COUNT(*)
----------
0
ORA开头表与tab$记录一致,不需要追加。
8. dbv校验system01.dbf
存在549个
kdbchk: the amount of space used is not equal to block size
used=5115 fsc=486 avsp=2981 dtl=8096
Page 86141 failed with check code 6110
类似错误。
建议:
将数据库迁移到另外数据库。
三. 迁移数据库
使用exp工具导出TEST用户数据
[oracle@test bbed]$ exp 'userid="/ as sysdba"' owner=test file=test06.dmp
报ORA-01578: ORACLE data block corrupted (file # 1, block # 86141)错误,使用bbed撤销坏块标记,如下:
2. 再次导出TEST用户数据
也可以按表模式导出:
数据导出无报错的情况下,都能够正常恢复到另外数据库中,余下步骤不再演示,至此数据库完美恢复。后期会继续分享加密型勒索病毒恢复案例、ASM DATA磁盘组元数据损坏恢复案例等,敬请关注!