Decrypting the config.xml
The script below is enhanced from various other scripts found on the web to perform decryption of WebLogic encrypted strings. This script uses a sax parser and scans through the config.xml and decrypts all XML tags containing the word "encrypted".All the code below is free to use and modify as you wish.
Downloads:
WLSDecryptor.py
runwlst.sh
Script Runner: runwlst.sh
#!/bin/bash
WORKDIR=$PWD
export JAVA_HOME=/usr/java/latest
if [ "$#" -lt 1 ]
then
echo "runwlst.sh [path to cfgfile]"
exit
fi
export DOMAIN_DIR="$1"
if [ "$#" -eq 2 ]
then
export CFGFILE="$2"
fi
. $DOMAIN_DIR/bin/setDomainEnv.sh
echo "Starting wlst script"
${JAVA_HOME}/bin/java weblogic.WLST $WORKDIR/WLSDecryptor.py
Run this as:
./runwlst.sh <abs path to domain> [path to cfg file]
For example:
./runwlst.sh /WLSDomains/dom1
or to decrypt the jdbc connection xml
./runwlst.sh /WLSDomains/dom1 /WLSDomains/dom1/config/jdbc/dbpool.xml
Where dbpool.xml is the cfg file containing the jdbc connection information.
Script: WLSDecryptor.py
from weblogic.security.internal import *
from weblogic.security.internal.encryption import *
import os
import sys
from xml import sax
from xml.sax import xmlreader, saxutils
from xml.sax.handler import ContentHandler
class wlsCfgParser(ContentHandler):
"""this runs through the wls file looking for
tags with string 'encrypted' in them"""
encStr=""
def __init__(self,domainDir, cfgfile):
assert(os.path.exists(domainDir))
if cfgfile == None:
self.cfgfile=os.path.join(domainDir,"config","config.xml")
else:
self.cfgfile=cfgfile
if os.path.exists(self.cfgfile):
print "Decrypting :",self.cfgfile
self.Parser = sax.make_parser()
self.Parser.setContentHandler(self)
self.decrypter = WeblogicDecrypter(domainDir)
def parse(self):
self.Parser.parse(open(self.cfgfile,"r"))
def startElement(self,name,attrs):
if name.lower().find("encrypted") >= 0:
self.encStr=""
def endElement(self,name):
if name.lower().find("encrypted") >= 0:
decryptStr = self.decrypter.decrypt(self.encStr)
# print results:
print "Tag Name: ",name
print "Enc Str : ",self.encStr
print "Dec Str : ",decryptStr
def characters(self,data):
self.encStr += saxutils.escape(data)
class WeblogicDecrypter:
decrypted = None
ces = None
def __init__(self, domainDir, encryptedStr=None):
domainDirFullPath = os.path.abspath(domainDir) # get absolute path in case relative is passed
self.ces = ClearOrEncryptedService(SerializedSystemIni.getEncryptionService(domainDirFullPath))
if encryptedStr != None:
self.decrypted = self.ces.decrypt(encryptedStr)
def decrypt(self, encryptedStr):
self.decrypted= self.ces.decrypt(encryptedStr)
return self.decrypted
def __str__(self):
return self.decrypted
# wlst jython does not understand : if __name__ == '__main__':
domainDir=os.getenv("DOMAIN_DIR")
cfgfile=os.getenv("CFGFILE")
print "Domain Dir: "+str(domainDir)
if cfgfile != None:
print "File to decr : "+str(cfgfile)
wcp = wlsCfgParser(domainDir, cfgfile)
wcp.parse()
yesno=raw_input("Do you want to decrypt a custom encrypted string? [y/n]")
if yesno != "y":
sys.exit()
encStr = raw_input("Enter encrypted Str [Q to quit]: ")
wd40 = WeblogicDecrypter(domainDir)
while encStr.lower() != "q":
print wd40.decrypt(encStr)
encStr = raw_input("Enter encrypted Str [Q to quit]: ")
Notes:
This script will decrypt each encrypted string, and at the end also asks for a custom encrypted string if there is one that you wish to decrypt that was not in the config.xml or whichever xml file that was passed.