Recuperación de contraseñas en Weblogic

Weblogic es una plataforma creada por Oracle en la que se integran varios productos de la misma familia, que tienen por objetivo ayudar a la gestión de procesos de las empresas que lo utilizan. Desde el punto de vista más técnico podemos decir que se trata de una plataforma basada en java EE y compuesta por servidores de aplicaciones, middlewares, servidores web, etc. que permiten gestionar la configuración de cada uno de ellos de una forma totalmente integrada. Para acceder a esta plataforma se requiere un usuario, el cual se crea durante la fase de instalación del producto. Este usuario permite configurar todos los componentes y complementos necesarios para cada caso.

Durante la instalación en modo desarrollo, es decir, previo a paso a producción, el asistente de configuración genera un archivo de identidad de arranque (boot.properties) necesario para la administración inicial del servidor. La cuestión es que este archivo contiene el nombre de usuario y la contraseña del usuario administrador, aunque de forma cifrada.

Una vez establecidos el usuario y la contraseña, se puede ver cómo quedan guardados:

En este fichero, a simple vista, se puede observar que se almacenan las credenciales de forma segura. A pesar de ello, debemos saber que si un usuario malintencionado o intruso accediera al sistema donde reside, podría obtener los credenciales en claro.

Los pasos que se tendrían que realizar desde el propio sistema son los siguientes:
1.- Acceder al directorio [FMW_HOME]/wlserver_XX.Y/server/bin/
2.- Ejecutar el script setWLSEnv.sh para configurar las variables del entorno.
3.- Descargar el script en python (jython) decrypt.py y ejecutarlos de la siguiente manera:

~$ java weblogic.WLST decrypt.py

Ejemplos:
Obtener el password:

~$ java weblogic.WLST decrypt.py /opt/oracle/Middleware/user_projects/
      domains/base_domain {AES}TV0pZXXXXXXXXXXXXXXXXXXXXXXXXXXXXXFjI6/zM\=

Initializing WebLogic Scripting Tool (WLST) ...

Welcome to WebLogic Server Administration Scripting Shell

Type help() for help on available commands

RESULT: micontrasenyacifrada

Obtener el usuario:

~$ java weblogic.WLST decrypt.py /opt/oracle/Middleware/user_projects/
     domains/base_domain {AES}MhcB2XXXXXXXXXXXXXXXXXXXXXXXXXXXXXFGHi5/jI\=
Initializing WebLogic Scripting Tool (WLST) ...

Welcome to WebLogic Server Administration Scripting Shell

Type help() for help on available commands

RESULT: miusuariocifrado

En este caso, es importante eliminar el fichero una vez hayamos terminado de parametrizar el servidor en modo desarrollo. De esta forma nos evitaremos que caiga en manos de quien no debe.

decrypt.py

#============================================================================= 
# Jython Script for displaying de-crypted WebLogic boot.properties files 
# 
# To run, change to a WebLogic domain directory and execute: 
# 
# 
# Add parameter '-?' to the end of the command line to display more help 
#============================================================================= 

import os 
from java.io import FileInputStream 
from java.util import Properties 
from weblogic.management import EncryptionHelper 
from weblogic.security.service import SecurityManager 
from weblogic.security.subject import SubjectManager 

#============================================================================= 
# Main 
#============================================================================= 
def main(): 
#for arg in sys.argv: 
# if arg.count(arg.strip()): 
# printUsageAndExit() 
saltFilePath=os.path.join('security', 'SerializedSystemIni.dat') 
if not os.path.exists(saltFilePath): 
print "Error: The script must be run from a WebLogic domain direcotry or 
    a directory containing '%s'" % saltFilePath 
printUsageAndExit() 
try: 
open(saltFilePath, 'r').close() 
except IOError: 
print "Error: The file '%s' is not readable - check file permissions" % saltFilePath 
printUsageAndExit() 
processBootFiles(os.curdir, descryptPropsFile) 

#============================================================================= 
# Decrypt (Note, to encrypt just use: EncryptionHelper.encrypt(text)) 
#============================================================================= 
def decrypt(text): 
getKernelIdMethod = SecurityManager.getDeclaredMethod('getKernelIdentity', None) 
getKernelIdMethod.accessible=1 
return EncryptionHelper.decrypt(text, getKernelIdMethod.invoke(SecurityManager, None)) 

#============================================================================= 
# Process Boot Files 
#============================================================================= 
def processBootFiles(rootPath, processFunc): 
if not os.path.isdir(rootPath): 
return 
fileNames = os.listdir(rootPath) 
for fileName in fileNames: 
path = os.path.join(rootPath, fileName) 
if os.path.isfile(path): 
if fileName == 'boot.properties': 
processFunc(path) 
elif os.path.isdir(path): 
processBootFiles(path, processFunc) 
processFunc("./boot.properties") 

#============================================================================= 
# Decrypt Props File 
#============================================================================= 
def descryptPropsFile(filepath): 
print 
print '----- Decrypting %s -----' % filepath 
try: 
properties = Properties() 
file = FileInputStream(filepath) 
properties.load(file) 
file.close() 
for entry in properties.entrySet(): 
print '%s = %s' % (entry.key.strip(), java.lang.String(decrypt(entry.value.strip()))) 
except IOError: 
print "Error: Unable to read file '%s' - check file permissions" % filepath 
print 

#============================================================================= 
# Print Usage And Exit 
#============================================================================= 
def printUsageAndExit(): 
print 
print 'wlsdecrypt.py' 
print '-------------' 
print 
print "Jython Script for displaying de-crypted boot.properties files from a 
    WebLogic domain. Before running the script, change directory to the directory 
    that contains a WebLogic domain (or a directory containing 'security/
    SerializedSystemIni.dat' and one or more associated 'boot.properties' files). 
    Run this script via WLST or directly via the Java/Jython launch command (the 
    latter option requires both 'jython.jar' and 'weblogic.jar' to be added to 
    the classpath)." 
print 
print 'Example Usage:' 
print 
print '> /opt/weblogic/wlsadm/weblogic92/common/bin/wlst.sh ~/home/chordadm/
    wlsdecrypt.py (Unix)' 
print 
print '> C:\\bea\\weblogic92\\common\\bin wlst.cmd C: myscripts 
    wlsdecrypt.py (Windows)' 
print 
exit() 

# 
# Invoke main and end 
# 
main()

Comments

  1. Gracias por la información. A mi, personalmente, todo lo que tenga que ver con la plataforma Java me da alergia por los problemas de seguridad asociados ^^