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

這樣咱們就得到了密鑰文件

相關文章
相關標籤/搜索