背景
相信做过oracle中间件的同学肯定都会遇到这样的情况
- 忘记weblogic管理员密码
- 忘记数据库schema密码
项目就像流水一样永不停息,每个项目又有多套环境,每个环境又有超级多的服务器,就产生了超级多的密码,程序员又懒又自负,自以为能记住所有密码,结果往往是悲剧的,幸运的是weblogic帮我们记住了所有的密码,虽然是加密的,但由于weblogic本身也要使用密码进行验证,因此加密必然是可逆的,这篇文档介绍如何进行解密。
在weblogic后台配置文件中,有很多是包含密码的,比如boot.properties,config.xml
等,这些密码都被加密过,你看到的形式为{AES}xxxxxx
都是密码。
过程
解密关键步骤是拿到密钥,weblogic密钥位于${DOMAIN_HOME}/security/SerializedSystemIni.dat
中,比如/u01/Middleware/user_projects/domains/portal_domain/security/SerializedSystemIni.dat
,该文件是一个64字节的二进制文件,每个domain都有一个这个文件。
- 本地创建一个新的目录(如/workspace/secret/,把密钥文件SerializedSystemIni.dat下载到该目录下
- 执行以下代码,获取密码明文
package com.definesys.weblogic; import java.io.*; import weblogic.security.internal.*; import weblogic.security.internal.encryption.*; /** * @Description: * @author: jianfeng.zheng * @since: 2020/9/4 1:43 下午 * @history: 1.2020/9/4 created by jianfeng.zheng */ public class Cracker { public static void main(String[] args) { String secretDirectory = "/workspace/secret/"; String password = "{AES}3lQ83x6dp5ZdmtCbLOs+5E8o48nfOK2na5TZD6oMrvi9L5fTbHk+VE6A9bn4xIXl"; ClearOrEncryptedService ces = new ClearOrEncryptedService(SerializedSystemIni.getEncryptionService(new File(secretDirectory).getAbsolutePath())); String pwd = ces.decrypt(password); System.out.println(pwd); } }
- secretDirectory:密钥所在目录
- password:加密后的密码
依赖包
程序需要两个依赖包
- wlfullclient.jar
- cryptoj.jar
这两个依赖包可以从weblogic后台下载,路径如下
- $WL_HOME/server/lib/wlfullclient.jar 如:/u01/Middleware/wlserver_10.3/server/lib/wlfullclient.jar
- $WL_HOME/server/lib/cryptoj.jar 如:/u01/Middleware/wlserver_10.3/server/lib/cryptoj.jar
如果没有wlfullclient.jar需要自行构建,构建方法如下
[oracle]$ cd /u01/Middleware/wlserver_10.3/server/lib [oracle]$ java -jar /u01/Middleware/modules/com.bea.core.jarbuilder_1.7.0.0.jar
一定要在server/lib目录下构建
更方便的方法
如果有服务器后台权限,借助wlst工具,有更简单的方法,如下
[oracle]$ cd /data/Middleware/wlserver_10.3/common/bin [oracle]$ ./wlst.sh ... Type help() for help on available commands wls:/offline> domain = "/data/Middleware/user_projects/domains/portal_domain" wls:/offline> service = weblogic.security.internal.SerializedSystemIni.getEncryptionService(domain) wls:/offline> encryption = weblogic.security.internal.encryption.ClearOrEncryptedService(service) wls:/offline> print encryption.decrypt("{AES}1nZiIY0Fb1BckEaX7F/3V3MR+io2/dxJUfoUm3iH13S=") 这里输出密码
总结就是登录wlst后,执行以下语句,修改为特定环境的domain路径和需要解密的密码即可
domain = "/data/Middleware/user_projects/domains/portal_domain" service = weblogic.security.internal.SerializedSystemIni.getEncryptionService(domain) encryption = weblogic.security.internal.encryption.ClearOrEncryptedService(service) print encryption.decrypt("{AES}1nZiIY0Fb1BckEaX7F/3V3MR+io2/dxJUfoUm3iH13S=")
彩蛋
某个项目没有后台权限,但有jenkins权限,而且jenkins权限还比较大,可以配置job,那么这种情况下要怎么拿到密码呢,核心就是要拿到密码文件和密钥文件,密码文件比较简单在jenkins上配个job直接输出即可,但密钥文件SerializedSystemIni.dat是个二进制文件,当作文本输出就会乱码,可以用base64进行编码输出,然后本地解码即可。
- 用jenkins在服务器上执行base64命令将密钥文件以文本形式输出
$ base64 SerializedSystemIni.dat BMeCNZwCIIzxxxxxxxxxxxxxx==
复制到本地文件base64.txt,也执行base64命令进行解码
base64 -Di base64 >SerializedSystemIni.dat
这样我们就获得了密钥文件
no comment untill now