weblogic密码破解全攻略

背景

相信作过oracle中间件的同窗确定都会遇到这样的状况java

  • 忘记weblogic管理员密码
  • 忘记数据库schema密码

项目就像流水同样永不停息,每一个项目又有多套环境,每一个环境又有超级多的服务器,就产生了超级多的密码,程序员又懒又自负,自觉得能记住全部密码,结果每每是悲剧的,幸运的是weblogic帮咱们记住了全部的密码,虽然是加密的,但因为weblogic自己也要使用密码进行验证,所以加密必然是可逆的,这篇文档介绍如何进行解密。程序员

在weblogic后台配置文件中,有不少是包含密码的,好比boot.properties,config.xml等,这些密码都被加密过,你看到的形式为{AES}xxxxxx都是密码。web

过程

解密关键步骤是拿到密钥,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:加密后的密码

依赖包

程序须要两个依赖包bash

  • 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

[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工具,有更简单的方法,以下dom

[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进行编码输出,而后本地解码便可。ui

  • 用jenkins在服务器上执行base64命令将密钥文件以文本形式输出
$ base64 SerializedSystemIni.dat 

BMeCNZwCIIzxxxxxxxxxxxxxx==

复制到本地文件base64.txt,也执行base64命令进行解码

base64 -Di base64 >SerializedSystemIni.dat

这样咱们就得到了密钥文件

相关文章
相关标签/搜索