Читаем Атака на Internet полностью

Упрощенно можно считать, что в Windows NT существует две принципиально разные процедуры регистрации на сервере – локальная и удаленная. Для первой, так же как и в UNIX, хэш от введенного пароля пользователя сверяется с эталонным хэш-значением, хранящимся в базе данных диспетчера учетных записей (SAM – Security Account Manager). Для удаленной процедуры можно было применить ту же схему, но тогда значение хэша пользователя передавалось бы по каналам связи на сервер и в принципе могло быть перехвачено кракером. Поэтому здесь, в отличие от UNIX, используется механизм «запрос-отклик», при котором в общедоступные каналы связи передается только зашифрованное на случайном ключе хэш-значение.

Функции хэширования паролей

В ОС Windows NT для защиты паролей используются две однонаправленные хэш-функции: хэш Lan Manager (LM-хэш) и хэш Windows NT (NT-хэш). Наличие двух функций, выполняющих одно и то же, говорит о совместимости со старыми ОС. LM-хэш был разработан Microsoft для операционной системы IBM OS/2, он интегрирован в Windows 95/98, Windows for Workgroups и частично в Windows 3.1. Хэш Windows NT был разработан специально для ОС Microsoft Windows NT, и его умеют вычислять только последние версии ОС этого семейства, начиная с Windows 95. Функция LM-хэш основана на алгоритме DES; NT-хэш является не чем иным, как известной хэш-функцией MD4.

Обычно в базе данных SAM хранятся, будучи дополнительно зашифрованными по алгоритму DES с ключом, зависящим от RID пользователя, оба хэш-образа пароля. Но иногда в системе может храниться только один из них. Очевидно, это будет происходить в случае, когда пользователь меняет пароль из ОС, не поддерживающей NT-хэш, – тогда в базу SAM записывается только LM-хэш (а поле NT-хэша обнуляется). И наоборот, если пароль пользователя превышает 14 байт, то туда попадет один лишь NT-хэш.

...

В документации Microsoft сказано, что длина паролей Windows NT может достигать 128 символов. Однако User Manager (диспетчер пользователей) ограничивает длину до 14 символов.

При обоих способах входа в систему (локальном и удаленном) процедура аутентификации сначала пытается сверить NT-хэш. Если его не оказывается (либо в базе SAM, либо в переданной информации), тогда она пытается проверить подлинность по LM-хэшу. Такая схема призвана обеспечить большую надежность сетей Windows NT, но в то же время и совместимость со старыми сетевыми клиентами. Однако первое ей не удается по той простой причине, что часто клиент не знает, какой хэш следует передавать серверу, в результате оба хэша передаются одновременно, и стойкость их равна стойкости наиболее слабого из них. Какого же?

Функция хэша Lan Manager вычисляется таким образом:

1. Пароль превращается в 14-символьную строку путем либо усечения более длинных паролей, либо дополнения коротких паролей нулевыми элементами.

2. Все символы нижнего регистра переводятся в верхний регистр. Цифры и специальные символы остаются без изменений.

3. Полученная 14-байтовая строка разбивается на две 7-байтовых половины.

4. Каждая половина строки используется в роли ключа DES при шифровании фиксированной константы, что дает две 8-байтовых строки.

5. Эти строки сливаются для создания одного 16-разрядного значения хэш-функции.

Из этого можно сделать вывод, что атаки на функцию LM-хэша достигают успеха по следующим причинам:

1. Преобразование всех символов в верхний регистр ограничивает и без того небольшое число возможных комбинаций для каждого (26 + 10 + 32 = 68).

2. Две «половины» пароля хэшируются независимо друг от друга. Таким образом, обе 7-символьные части пароля могут подбираться перебором независимо друг от друга, и пароли длиной более семи символов не сильнее паролей длиной в семь символов. Следовательно, для гарантированного нахождения пароля необходимо перебрать вместо 940 + 941 + … + 9414 = 4 х 1027 всего лишь 680 + 681 + … + 687 = 7 х 1012 = 243 комбинации (то есть почти в 1015 раз меньше).

...

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

Кроме того, пароли, длина которых не превышает семи символов, очень легко распознать, поскольку вторая половина хэша будет одним и тем же значением AAD3B435B51404EE, получаемым при шифровании фиксированной константы с помощью ключа из семи нулей.

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже