Не так давно стало известно о новой уязвимости (получила номер CVE-2012-3137 ) в протоколе аутентификации O5Logon, используемом в базе данных Oracle версий 11.1 и 11.2. Уязвимость позволяет удаленному пользователю получить пароль доступа путем перебора зашифрованного идентификатора сеанса, полученного с сервера.
Эта функция позволяет угадать пароль пользователя локально, не отправляя дополнительные сетевые запросы на сервер базы данных.
Краткий обзор того, как работает O5Logon
Взаимодействие с сервером происходит по следующей схеме:- Клиент подключается к серверу и отправляет имя пользователя
- Сервер генерирует идентификатор сеанса и шифрует его с помощью AES-192. В качестве ключа используется SHA1-хеш пароля пользователя и добавленная к нему соль.
- Сервер отправляет клиенту зашифрованный идентификатор сеанса и соль.
- Клиент генерирует ключ, получая хэш своего пароля и полученную соль.
Используя этот ключ, клиент расшифровывает данные сеанса, полученные от сервера.
- На основе расшифрованного идентификатора сеанса сервера клиент генерирует новый общий ключ, который используется в дальнейшем.
С самого начала соединения сервер передает всю информацию, необходимую для подбора пароля.
Ключевая особенность Session Id позволяет осуществить атаку: последние 8 байт идентификатора открытой сессии всегда состоят из восьмерок.
Этой информации достаточно, чтобы определить правильность расшифровки.
Еще одной особенностью данной проблемы является то, что при разрыве соединения после 3-го этапа факт попытки подключения не будет отражен в журналах, т.е.
атака может быть проведена совершенно незаметно.
Практический аспект
Для проверки уязвимости используется свободно распространяемый дамп виртуальной машины , используемый Oracle для обучения разработчиков и содержащий предустановленную базу данных версии 11.2.0.2. После установки можно попробовать подключиться к базе данных через стандартный порт, используя, например, Python и библиотеку cx_Oracle. В качестве теста был проведен выбор для встроенной пользовательской системы.Достаточно знать только имя пользователя, чтобы получить все необходимые данные для дальнейшей атаки:
Чтобы получить зашифрованный идентификатор сеанса и соль в этом случае, проще всего было использовать Wireshark:>>> import cx_Oracle >>> con = cx_Oracle.connect('system/[email protected]/orcl') Traceback (most recent call last): File "<stdin>", line 1, in <module> cx_Oracle.DatabaseError: ORA-01017: invalid username/password; logon denied
Здесь будут полезны следующие значения: Идентификатор сеанса (AUTH_SESSKEY) : EA2043CB8B46E3864311C68BDC161F8CA170363C1E6F57F3EBC6435F541A8239B6DBA16EAAB5422553A7598143E78767 Соль (AUTH_VFR_DATA) : A7193E546377EC56639E
Доказательство концепции
Для расшифровки сессии и перебора пароля был написан на коленке следующий код: #-*-coding:utf8 -*-
import hashlib
from Crypto.Cipher import AES
def decrypt(session,salt,password):
Теги: #информационная безопасность #oracle #o5logon #CVE-2012-3137 #информационная безопасность
-
Adsense Приходит В Онлайн-Игры
19 Oct, 24 -
Браузер По Выбору? Не В России
19 Oct, 24 -
Музыка Звуков, Бесконечность Простоты
19 Oct, 24