Техника сетевых атак
Шрифт:
Хеш-суммы, привязки и некоторая другая информация в UNIX обычно хранится в файле “/etc/passwd”, состоящего из строк следующего вида:
· kpnc:z3c24adf310s:16:13:Kris Kaspersky:/home/kpnc:/bin/bash
Разберем, что этот дремучий лес обозначает. Первым идет имя пользователя (например, “kpnc”), за ним, отделенное двое точением, следует то, что начинающими по незнанию называется «зашифрованным паролем». На самом деле это никакой не пароль - первые два символа представляют собой сохраненную привязку, а остаток - необратимое преобразование от пароля, то есть хеш. Затем (отделенные двоеточием) идут номер пользователя и номер группы, дополнительная информация о пользователе (как правило, полное имя), а замыкают строй домашний каталог пользователя и оболочка, запускаемая по умолчанию.
Устройство
Шифрование паролей происходит следующим образом, - случайным образом выбираются два символа привязки [100], использующиеся для модификации алгоритма DES. Затем шифруется строка пробелов с использованием пароля в качестве ключа. Полученное 64 битое значение преобразуется в одинадцатисимвольную строку. Спереди к ней дописываются два символа привязки, и на этом весь процесс заканчивается.
Продемонстрировать работу функции crypt поможет следующий пример (на диске он расположен в файле “/SRC/ctypt.c”). Его компиляция потребует библиотеки ast.lib, распространяемой вместе с “UWIN” (смотри главу «Как запускать UNIX приложения на Windows»), если же такой библиотеки у читателя нет, можно воспользоваться готовым к работе файлом “/SRC/crypt.exe”. Для запуска программы в командной строке необходимо указать шифруемый пароль и отделенную пробелом привязку.
· #include «windows.h»
· extern char *crypt(const char*, const char*);
·
· int main(int argc, char *argv[])
· {
· printf("%s\n", crypt (argv[1],argv[2]));
· return 0;
·}
Прототип функции crypt выглядит следующим образом: char * crypt(char *passwd, char *solt), где passwd - пароль для шифрования, а solt - два символа привязки. При успешном выполнении функция возвращает 13-символьный хеш готовый к употреблению - два символа привязки и 11-символьная хеш-сумма пароля.
Теперь можно реализовать некое подобие подсистемы аутентификации UNIX. Сперва необходимо добавить нового пользователя в файл passwd. Одни из вариантов реализации приведен ниже (на диске он находится в файле “/SRC/crypt.auth.add.new.user.c”). Для упрощения, поддерживается только один пользователь.
· #include «stdlib.h»
· #include «stdio.h»
· #include «time.h»
·
· extern char *crypt(const char*, const char*);
·
· int main(int argc, char *argv[])
· {
· int a;
· char salt[3];
· FILE *f;
·
· salt[2]=0;
· srand((unsigned)time(NULL));
· for(a=0;a«2;a++) salt[a]=0x22+(rand % 0x40);
· if (!(f=fopen("passwd","w"))) return -1;
· fputs(crypt(argv[1], amp;salt[0]),f);
· fclose(f);
· return 0;
·}
Запустим откомпилированный пример
· #include «stdio.h»
· extern char *crypt(const char*, const char*);
·
· int main(int argc, char *argv[])
· {
· int a=1;
· char salt[2];
· char passwd[12];
· char *x;
· FILE *f;
·
· passwd[11]=0;
· while(a++) if (argv[1][a]«0x10) {argv[1][a]=0;break;}
·
· if (!(f=fopen("passwd","r"))) return -1;
· fgets( amp;salt[0],3,f);
· fgets( amp;passwd[0],12,f);
· fclose(f);
·
· if (strcmp( amp;passwd[0],crypt(argv[1], amp;salt[0])+2))
· printf("Wrong password!\n");
· else
· printf("Password ok\n");
·
· return 0;
·}
Запустим “crypt.auth.exe”, указав в командной строке пароль “12345”. Программа подтвердит правильность пароля. А теперь попробуем ввести другой пароль, - и результат не заставит себя долго ждать.
· crypt.auth.exe 12345
· Password ok
· crypt.auth.exe MyGoodPasswd
· Wrong password!
Время выполнения функции crypt на PDP-11 доходило до одной секунды. Поэтому, разработчики посчитали вполне достаточным ограничить длину пароля восьми символами. Попробуем посчитать какое время необходимо для перебора всех возможных комбинаций. Оно равно (nk– 0+ nk– 1+ nk– 2+ nk– 3+ nk– 4… nk)), где n - число допустимых символов пароля, а k - длина пароля. Для 96 читабельных символов латинского алфавита перебор пароля в худшем случае потребует около 7x1015 секунд или более двух сотен миллионов лет! Даже если пароль окажется состоящим из одних цифр (коих всего-навсего десять) в худшем случае его удастся найти за семь лет, а в среднем за срок вдвое меньший.