среда, 22 июля 2009 г.

Oracle authentication

Пытались меня тут убедить, что oracle-клиент посылает, по умолчанию, пароли в чистом виде. Задавленный авторитетом убеждающих, на словах согласился, но в душе затаил черную злобу! И вот моя месть.

Итак, есть хост с бд (db-host), и есть хост с клиентом(cl-host), все что нам нужно это запустить на db-host какой-нибудь сниффер и попытаться залогиниться с cl-host в базу.

db-host:

#:>tcpdump -X -s 1500 port 1522 and host cl-host

cl-host:

$:>sqlplus db_user_name/db_user_pwd@db_connect_str

смотрим в вывод tcpdump:

.....A
0x0080: 5554 485f 5345 5353 4b45 5940 0000 0040 UTH_SESSKEY@...@
0x0090: 4239 4636 3939 3634 4143 4137 3334 3341 B9F69964ACA7343A
0x00a0: 4134 3435 3338 4644 3735 4546 3044 3935 A44538FD75EF0D95
0x00b0: 3541 3331 3732 3139 3343 3435 3146 3638 5A3172193C451F68
0x00c0: 3846 4630 3241 3634 3746 3637 4337 3643 8FF02A647F67C76C
0x00d0: 0100 0000 0d00 0000 0d41 5554 485f 5041 .........AUTH_PA
0x00e0: 5353 574f 5244 4000 0000 4033 3531 3744 SSWORD@...@3517D
0x00f0: 3533 3736 3235 3044 4636 4642 3042 3337 5376250DF6FB0B37
0x0100: 3642 3646 4430 4546 3945 3331 4636 3037 6B6FD0EF9E31F607
0x0110: 3339 3946 4535 3231 4643 3630 3246 4334 399FE521FC602FC4
0x0120: 3843 3137 3035 4132 4435 3600 0000 0008 8C1705A2D56.....


Что же мы видим? Не только AUTH_PASSWORD непонятно, что из себя представляет, но и присутствует некий AUTH_SESSKEY, что совершенно недвусмысленно указывает на наличие какого-то шифрования этого самого пароля. Какое разочарование!

Заинтересовавшись темой нагуглил следующее:

  1. Сервер проверяет наличие юзера.
  2. Достает хэш пароля, хранящийся в бд, на основе хэша и системного времени генерится секретная последовательность чисел. Эта последовательность криптуется DESом, ключем является хэш пароля пользователя.
  3. Получившуюся кашу сервер шлет клиенту, как AUTH_SESSKEY.
  4. Клиент расшифровывает AUTH_SESSKEY (это легко ключ-то это хэш пароля, который он знает) и получает секретную последовательность чисел которую сгенерил сервер.
  5. Дальше клиент закриптовывает свой пароль, используя секретную последовательность, как ключ, и результат отдает серверу, как AUTH_PASSWORD.
  6. Сервер раскриптовывает его, используя секретную последовательность (этим он получает clear-text pass) хеширует и сравнивает с хешем который хранится в базе, сошлось -- круто, не сошлось -- всего доброго.

Придумывали это реально хитрожопые (smart-ass) ребята. Получить пароль пользователя можно только если перехватил AUTH_SESSKEY, AUTH_PASSWORD и знаешь хэш пароля, что в общем случае очень непросто.

В жизни больше никому не поверю.

Ссылочка на источник моего всезнания:
http://www.freelists.org/post/dbsec/Sniffing-Oracle-authentications,1

Комментариев нет:

Отправить комментарий