Атака на Windows 95, Windows 98

Ø В этой главе:

Ø Профили пользователей

Ø Разделяемые ресурсы

Ø Механизмы аутентификации Windows 98

Ø Алгоритмы шифровки паролей, атака на пароль

Ø Алгоритмы шифровки файлов PWL, пути извлечения Internet-пароля

Опасности везде подстерегают

Куда, куда мне от беды уйти

То из пельменницы в меня стреляют

То торт кусается, с ума сойти

Шипилов Сергей. «Жертва РЕЛКОМа»

Операционная система Window 95 и ее старшая сестра Windows 98 в настоящее время установлены на миллионах компьютеров, и далеко не все пользователи планируют перебираться на платформу Windows NT (она же Windows 2000). Забавно, но одним из препятствий служат… игрушки. Да, те самые старые игрушки, написанные еще для MS‑DOS и ранних версий Windows. Почти все они напрямую взаимодействуют с «железом» и оказываются неработоспособными в Windows NT, которая не позволяет приложениями обращаться к портам ввода‑вывода. Для корпоративного пользователя это может быть и не существенно (хотя, грех побродить с винчестером по лабиринтам DOOM свойственен всем), но играет огромную роль в выборе операционной системе для «домашнего компьютера».

К минусам Windows NT можно отнести и завышенные требования к аппаратным ресурсам, так, например, если на машине Clarion‑300\64 MB RAM Windows 95 просто «летает», то Windows NT 4.0 не показывает чудес производительности, а по настоящему комфортную работу с Windows 2000 обеспечивают, по крайней мере, 128‑256 мегабайт оперативной памяти[172]! Большинство пользователей просто не понимает, какие выгоды им обеспечивает Windows NT и ради чего стоит отказываться от полюбившейся Windows 98.

Встроенная сетевая поддержка позволяет использовать Windows 95 (Windows 98) для работы в локальных и глобальных коммуникационных сетях. Как правило, эта платформа используется в качестве клиента. Роль сервера ей доверяют редко[173], но часто используют в одноранговых сетях.

Но по сравнению с NT у Windows 95 (Windows 98) степень защищенности намного ниже и для злоумышленника она – легкая добыча. Недопустимо этой операционной системе доверять жизненно важные данные – она вряд ли сумеет их сохранить. Отдельное исключение представляет изолированный компьютер, не подключенный к сети, доступ посторонних лиц к которому физически невозможен. К сожалению, зачастую пользователи пренебрежительно относятся к собственной безопасности, вероятно, полагая, дескать, их-то никакая беда не коснется. Потом, широко распространенно заблуждение, якобы все взломы от «кривых ручек», а «правильная настойка» для злоумышленника все равно, что поднятый мост перед крепостью. Ниже будет показано, почему это не так.

В отличие от рассмотренных выше операционных систем, Windows 95 (Windows 98) не требует аутентификации пользователя перед началом работы. Да, возможность «установить пароль на вход в систему» существует, но играет другую роль, нежели в UNIX или Windows NT. В силу своей архитектуры Windows 95 (Windows 98) – однопользовательская система. Файлы одного пользователя доступы всем остальным, и не существует никаких уровней привилегий – перед Windows 95 (Windows 98) все равны[174]. Ни файловая система, ни системные вызовы не поддерживают атрибутов защиты и не имеют никакого представления ни о пользователях, ни о правах доступа. Поэтому, без серьезных доработок ядра, говорить о «регистрации в системе» бессмысленно!

Какой же смысл имеет пароль, запрашивающийся при входе в Windows? Необходимость делить один компьютер «на двоих» привела к появлению профилей – уникальных конфигураций каждого пользователя, позволяющих одному работать независимо от остальных. В профилях можно хранить содержимое рабочего стола, раскраску окон, путь к папке «Мои Документы», пароль на вход в Internet и многое другое. Важно понять Windows не защищает содержимое папки «Мои Документы» одного пользователя от другого, она лишь обеспечивает независимость конфигураций. Но любой пользователь имеет доступ ко всем файлам, папкам и профилям своих «соседей» и при желании может хозяйничать в «гостях» как у себя дома.

Если же при входе в систему не вводить пароль, а нажать «отмену», загрузится конфигурация по умолчанию. Таким образом, для доступа к компьютеру злоумышленнику не нужен пароль. Поэтому, Windows 95 (Windows 98) можно использовать в тех, и только в тех случаях, когда среди пользователей доподлинно нет вредителей или на компьютере не хранится ничего ценного[175] и защищать особо и нечего.

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

Меньшей угрозе подвергаются домашние пользователи, не имеющие постоянного соединения с Internet. Однако важно понимать, это лишь уменьшает опасность, но не устраняет ее. Злоумышленник может вычислить адрес узла по информации, содержащийся в заголовке отправленного с него письма, или выследить свою жертву на любом чате, канале IRC или с помощью пейджера ICQ. Существует и возможность сканирования IP‑адресов на предмет поиска незащищенных компьютеров.

Целью атаки может быть нарушение нормальной работы операционной системы («подвешивание») или копирование (модификация) хранящихся на компьютере документов. Вообще, завесить можно все что угодно (дурное дело хитрым не бывает), от этого не защищена ни одна существующая операционная система, (а Windows 98 весьма нехило противостоит потугам вывести ее из строя[176]). От таких атак никуда не уйдешь, но они достаточно безвредны, – после перезагрузки с компьютером вновь можно работать. Да, теряется все не сохраненные документы, и даже существует незначительный риск необратимо потерять их содержимое (если зависание произойдет в момент записи файла на диск), но угроза уничтожения или разглашения приватной информации гораздо неприятнее.

Если не принимать во внимание разнообразные программные закладки, запускаемые самим пользователем[177], возможность удаленного доступа к файлам и папкам компьютера существует только в том случае, если имеется поддержка разделяемых («зашаренных») ресурсов. По умолчанию она отсутствует, но в любой момент может быть включена установкой службы «Доступ к файлам и принтерам сетей Microsoft» («Панель управления» \ «Сеть» \ «Добавить» \ «Служба»).

Эта служба используется не только в локальных сетях, она так же необходима и для установки прямого кабельного соединения – популярного способа связи нотебука с компьютером. Доступ к разделяемым ресурсам осуществляется по прикладному протоколу SMB, работающего поверх любого транспортного протокола, совместимого с интерфейсом NetBIOS, например NBT (NetBIOS over TCP/IP). Поэтому, машина с установленной службой доступа к файлам и принтерам, при подключении к Internet становится полноценным сервером, обслуживающим клиентов!

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

Протокол NBT позволяет анонимному пользователю без предъявления своего имени и пароля получить некоторые сведения об удаленном компьютере. В частности – имена работающих на нем пользователей, групп и многое другое.

Для этого необходимо воспользоваться утилитой nbtstat.exe, поставляемой вместе с Windows.

Для того, чтобы проверить присутствует ли на узле служба доступа к файлам и принтерам достаточно попытаться установить с ним соединение по 139 порту. Если соединение установлено успешно, значит, служба есть.

Программа, приведенная ниже (на диске она содержится в файле “/SRC/139.pl”), работает как раз по такому алгоритму. Она запрашивает у пользователя имя или IP адрес узла и, если 139 порт открыт, выдает список разделяемых ресурсов.

· use Socket;

· print "Введите имя или IP адрес удаленного компьютера:";

· $server=<>;

· $yes="не";

· chomp $server;

· socket(NNTP, PF_INET(), SOCK_STREAM(), getprotobyname("tcp") || 6);

· if (connect(NNTP, sockaddr_in(139,inet_aton($server))))

· {

· open(FX,"|net VIEW \\\\$server");

· $yes="";

· close(FX);

· }

· print "Служба доступа к файлам и принтерам $yes установлена";

Результат ее работы может выглядеть так (жирным шрифтом показан ввод пользователя):

· Введите имя или IP адрес удаленного компьютера:192.168.55.1

· Общие ресурсы на \\192.168.55.1

·

·

· SERVER

·

· Сетевое имя Тип Использовать как Комментарий

·

·

· -------------------------------------------------------------------------------

· ASMLIB Диск

· ATACR Диск

· BLEAK Диск

· C Диск

· D Диск СД РОМ общего доступа

· Команда выполнена успешно.

·

·

· Служба доступа к файлам и принтерам установлена

В строке “open(“|net VIEW \\\\$server”)” происходит вызов внешней утилиты net.exe, которая поставляется вместе с Windows. Разумеется, использовать ее можно и самостоятельно. Подключить любой из разделяемых ресурсов можно с помощью той же net.exe, передав ей следующие параметры: «net USE \\адрес(имя узла)\имя ресурса “пароль” /USER:”имя пользователя”». Например, подключение диска С узла 192.168.55.1 выглядит приблизительно таким образом:

· net use \\192.168.55.1\C "12345" /USER:"KPNC"

Если операция завершится успешно, то команда “dir \\192.168.55.1\C” выдаст содержимое диска С удаленного компьютера. Аналогичным образом осуществляется копирование и модификация документов. К сожалению, не все приложения поддерживают UNC пути, поэтому приходится подключать удаленный ресурс, как новый логический диск. Для этого достаточно кликнуть правой клавишей мышки по иконке «Сетевое окружение» и во всплывающем меню выбрать пункт «Подключить сетевой диск». Затем необходимо выбрать любую из доступных букв и указать путь к ресурсу. Если установить галочку «восстанавливать при входе в систему», то Windows предпримет попытку подключения к удаленному ресурсу при каждом входе в систему (или в сеть – в зависимости от остальных настоек).

Атака на Windows 95, Windows 98 - student2.ru

Рисунок 071 Подключение сетевого диска

Способна ли защита Windows 95 (Windows 98) противостоять злоумышленникам, и может ли она гарантировать безопасность ресурсов компьютера? Операционная система позволяет назначать раздельные пароли для чтения и модификации содержимого дисков и папок. Но для аутентификации Windows95 (Windows 98) посылают клиенту как NT‑хеш, так и LM‑хеш, поэтому злоумышленник может за короткое время подобрать пароль, получив несанкционированный доступ к системе. (Подробнее об этом написано в главе «Атака на Windows NT») Но, в отличие от Windows NT, для Windows 95 (Windows 98) похоже, не существует никакого легального способа запретить использование LM‑хешей. И даже если бы такой способ и существовал, он бы не здорово помог этой операционной системе. В Windows 95 (Windows 98) максимальная длина пароля ограничена восемью символами, причем строчечные и прописные буквы не различаются. Поэтому, злоумышленник может подобрать пароль за вполне приемлемое время.

Таким образом, категорически не допустимо на компьютерах, управляемых Windows 95 (Windows 98), предоставлять совместный доступ к ресурсам, особенно если существует выход в Internet. Причем, если злоумышленник получит доступ к диску, на котором установлена Windows (как правило, это диск С), его задача значительно упростится. (Многие пользователи разрешают чтение содержимого диска С не требуя пароля).

Пароли на все «зашаренные» ресурсы хранятся в ветке реестра HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurentVersion\Network\LanMan\имя ресурса Параметр “Parn1Erc” хранит зашифрованный пароль для полного доступа, а “Parn2Erc” – для доступа только на чтение. Для выяснения алгоритма шифровки нет необходимости прибегать к трудоемкому дизассемблированию кода. Достаточно исследовать несколько пар открытых и зашифрованных паролей (на своей машине такую операцию можно осуществить без труда).

Оказывается, вся «шифровка» сводится к побайтовой операции XOR каждого символа пароля с некоторым ключом, найти который можно «покскорив» открытый пароль зашифрованным. В результате этого (по крайне мере, в Windows 98) образуется следующая последовательность: {0x35; 0x9A; 0x4D; 0xA6; 0x53; 0xA9; 0xD4; 0x6A}[178].

В двоичной форме каждое из этих чисел представляют собой однородную смесь нулей и единиц, поэтому оказывают наибольшее влияние на шифруемый текст. А отсюда следует – вскрыть зашифрованный пароль, не зная ключа невозможно никаким другим методом, кроме полного перебора[179]. Но ключи идентичны на всех машинах, поэтому заведомо известны злоумышленнику, следовательно, найти оригинальный пароль можно без труда.

Ниже, для иллюстрации всего вышесказанного, приведен фрагмент реестра с компьютера “\\SERVER” (на прилагаемом к книге компакт-диске он содержится в файле “/log/lm.reg”):

· [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Network\LanMan]

·

· [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Network\LanMan\ASMLIB]

· "Flags"=dword:00000102

· "Type"=dword:00000000

· "Path"="E:\\ASMLIB"

· "Parm2enc"=hex:

· "Parm1enc"=hex:

· "Remark"=""

·

· [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Network\LanMan\C]

· "Flags"=dword:00000101

· "Type"=dword:00000000

· "Path"="C:\\"

· "Parm2enc"=hex:04,a8,7e,92,66

· "Parm1enc"=hex:

· "Remark"=""

·

· [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Network\LanMan\D]

· "Flags"=dword:00000191

· "Type"=dword:00000000

· "Path"="D:\\"

· "Parm2enc"=hex:

· "Parm1enc"=hex:

· "Remark"="СД РОМ общего доступа"

·

· [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Network\LanMan\BLEAK]

· "Flags"=dword:00000193

· "Type"=dword:00000000

· "Path"="F:\\BLEAK"

· "Parm2enc"=hex:

· "Parm1enc"=hex:

· "Remark"=""

·

· [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Network\LanMan\ATACR]

· "Flags"=dword:00000191

· "Type"=dword:00000000

· "Path"="J:\\ATACR"

· "Parm2enc"=hex:

· "Parm1enc"=hex:

· "Remark"=""

Анализ позволяет установить – все ресурсы (доступные ресурсы указаны в параметрах “Path”), за исключением диска “C” не защищены паролем ни для чтения, ни для записи (об этом говорят пустые параметры “Parm1enc” и “Param2enc”). Для полного доступа к диску “C” требуется пароль, который в зашифрованном виде выглядит так: “0x4 0xA8 0x7E 0x92 0x66”. Один из способов его расшифровки демонстрирует программа, приведенная ниже (на прилагаемом к книге компакт диске она расположена в файле “/SRC/win9x.xor.c”):

· #include <stdio.h>

·

· main(int argc, char **argv)

· {

· int a=1,tmp;

· char xore=0x35;

· for (;a<argc;a++)

· {

· sscanf(argv[a],"%x",&tmp);

· printf("%c",tmp ^ xore);

· __asm

· {

· rol xore, 7;

· }

· }

· printf("\n");

·

· }

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

Пример использования программы содержится в файле “/SRC/win9x.xor.bat” – необходимо передать в командной строке зашифрованный пароль в шестнадцатеричной форме, отделяя числа друг от друга пробелом, скажем так: win9x.xor.exe 0x5 0xAA 0x7D 0x96 0x63 0x99 0xE4 0x5A. А в ответ программа возвратит расшифрованный пароль (в данном случае “0000000”).

Конечно, получить доступ к реестру удаленного компьютера, имея лишь право на чтение диска, штатными средствами Windows невозможно. Поэтому, необходимо использовать утилиту, которая бы в отличие от стандартного «Редактора реестра» позволяла бы указывать путь к файлам реестра и умела бы работать с избранными ветвями, не считывая весь реестр целиком. (В большинстве случаев из-за низкой пропускной способности коммуникационных каналов прочитать все несколько мегабайт реестра оказывается чрезвычайно затруднительно, а то и вовсе невозможно).

Среди «домашних» пользователей широко распространено заблуждение, что на их компьютерах не содержится никакой секретной информации, и, следовательно, злоумышленнику воровать нечего. На самом же деле, большинство пользователей при входе в Internet не набирают пароль вручную, а используют возможность его сохранения в собственном профиле.

Похищение чужого пароля позволяет злоумышленнику пользоваться Internet за чужой счет, пока владелец пароля не догадается его сменить. Поэтому, способ хранения паролей в Windows представляет интерес не только для злоумышленников, но и для пользователей. Способна ли операционная система их защитить? К сожалению, в очередной раз, в алгоритме шифровки паролей (а они хранятся в зашифрованном виде) разработчики допустили грубые ошибки, позволяющие подобрать исходный пароль за приемлемое время.

Пароли по-разному хранятся в зависимости от версии Windows (Windows 95, Windows 95 OSR2), поэтому ниже каждый из них будет рассмотрен отдельно.

Пароли на вход в Internet (если только они не набираются каждый раз вручную), сохраняются в PWL файлах, причем имя пользователя совпадает с именем файла, т.е. пароли пользователя “KPNC” сохраняются в файле “KPNC.PWL”, расположенного в каталоге Windows. Содержимое PWL файлов зашифровано производным значением от пароля, под которым пользователь входит в систему.

В Windows 95 алгоритм шифрования в общих чертах выглядит следующим образом: пароль, заданный при регистрации нового пользователя в системе, приводится к верхнему регистру и посредством хеш-функции сворачивается к двойному слову (32 бита), используемого в качестве ключа для генерации гаммы по алгоритму RC4[180]. Полученной гаммой и зашифровывается содержимое файла PWL.

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

Таким образом, ни хеш - значение, ни сам пароль нигде не хранятся и при условии правильной реализации криптоалгоритма, расшифровать содержимое PWL файла невозможно. На самом же деле, все происходит не так.

Слишком короткая длина ключа (32 бита) позволяет злоумышленнику воспользоваться тривиальным перебором. Поскольку алгоритм RC4 достаточно прост и допускает эффективную реализацию, уже на младших моделях процессора Pentium хорошо оптимизированная программа способна достичь скорости перебора от нескольких сотен тысяч ключей в секунду и выше. Поэтому, приблизительное время, за которое гарантированно удастся расшифровать PWL файл равно: 232 / 500 000 = 8 590 секунд или меньше двух с половиной часов[181]. В среднем же потребуется вдвое меньше времени, то есть что-то около часа. Другими словами – практически мгновенно.

Однако разработчиками были допущены и другие ошибки, позволяющие расшифровать файл даже не прибегая к перебору. Так, например, алгоритм «сворачивая» представляет собой пример очень слабой хеш-функции. Плохое рассеяние порождает множество паролей-двойников, т.е. различных паролей, но дающих одинаковые ключи. А некоторые пароли в результате свертки обращаются в нуль, что равносильно отсутствию пароля вообще!

Поэтому, представляет интерес взглянуть на алгоритм хеширования поближе. Он невероятно прост. Пароль приводится к верхнему регистру, затем над каждым его символом (включая нуль, завершающий строку) выполняются следующие операции:

· сложить значение ключа с очередным символом пароля

· выполнить циклический двоичный сдвиг ключа на семь позиций влево

Легко видеть насколько слабо взаимное влияние соседних символов друг на друга. В самом деле, схематично этот алгоритм можно записать как: 27*sym1+27*sym2+27*sym3,.. где symn N-ый символ пароля. Поскольку 2 в степени 7 равно 128, то для смежных символов из интервала 0‑127 взаимное влияние друг на друга полностью отсутствует, только на четверном символе циклический сдвиг приводит к наложению второй половины пароля на первую, в результате чего некоторое взаимное влияние между символами все же возможно. Стоить заметить, в качественных хеш функциях изменение одного бита исходной строки способно изменить все биты полученного результата. Рассматриваемый алгоритм, к таковым, очевидно не принадлежит.

Программа, приведенная ниже, демонстрирует одну из возможных реализаций этого алгоритма (на диске она находится в файле “/SRC/win95.hashe.c”). Она рассчитывает «свертку» пароля, указанного в командной строке.

· #include <stdio.h>

· #include <string.h>

· main (int argc, char ** argv)

· {

· int a=0,key=0;

· if (argc<2)

· printf ("USAGE: win95.hashe.exe MyGoodPassword\n");

· else

· {

· _strupr(argv[1]);

· for (;a<(strlen(argv[1])+1);a++)

· {

· key+=(unsigned char) argv[1][a];

· __asm

· {

· ROL key,7

· }

· }

· printf("%08X \n",key);

· }

· }

Если в качестве пароля задать «FFFFKKKKL», то хеш-функция возвратит нулевое значение[182]! И подобных паролей существует достаточно много (их точное количество можно вычислить математически или установить перебором).

Алгоритм шифрования тоже реализован с грубыми ошибками – одна и та же гамма используется несколько раз, – как для шифровки имени пользователя, так и для шифровки ресурсов. Но имя пользователя заранее известно (оно совпадает с именем файла). Поэтому, можно мгновенно восстановить первые 20 байт гаммы (а именно 20 символов отведено под имя пользователя). Причем, PWL файлы содержат множество избыточной (дублирующейся) и предсказуемой информации, поэтому существует возможность вычислить (без всякого перебора!) и остаток гаммы.

Существует ряд программ (например, Glide), которые, используя описанную выше «дырку», мгновенно извлекают из PWL файлов хранящуюся в них информацию, в том числе и пароль доступа в Internet.

Уже в Windows 95 ORS 2 механизм шифрования был существенно усовершенствован. Вместо вращения битов для свертки пароля разработчики использовали алгоритм MD5, с помощью которого получали четыре двойных слова – хеш значения имени и пароля. Поэтому, перебором хеш значений расшифровать PWL файл стало не быстрее, чем перебором исходных паролей. Простой подсчет показывает, что всего существует 2128 возможных хеш-значений, полный перебор которых потребует весьма длительного времени. При скорости 250 000 комбинаций в секунду (ниже объяснено почему) в худшем случае понадобится порядка 15 753 813 283 376 780 715 896 972 566 дней, а в среднем в два раза меньше[183].

Ошибка с повторным использованием той же самой гаммы оказалась устранена. Теперь в генерации гаммы помимо хеш – значения имени и пароля пользователя участвует некая случайная величина, варьирующаяся от случая к случаю. Для того, чтобы зашифрованный однажды текст было возможно расшифровать обратно, она сохраняется в заголовке файла. Но, ее значение не дает никаких преимуществ злоумышленнику, поскольку не позволяет ни восстановить хеш, ни получить другую гамму.

Скорость же перебора паролей (по сравнению с предыдущей версией Windows) падает приблизительно в два раза, за счет использования более громоздких алгоритмов получения хеш-значений пароля и проверок его подлинности. Подробное описание потребовало бы много места и, поэтому, здесь не приводится. Вся необходимая информация может быть получена путем дизассемблирования файла MSPWL32.PWL. Весьма вероятно, что в реализации механизмов шифрования оказались допущены грубые ошибки, не описанные здесь. Автор не проводил детальных исследований и ни за что поручиться не может.

Отличия Windows 98 от Windows 95 ORS 2 незначительны: снято ограничение на максимальную длину пароля, вот, пожалуй, и все. Однако, простые пароли, выбираемые пользователями, по-прежнему позволяют вскрыть PWL за короткое время, но в целом, защиту можно считать удовлетворительной.

Протоколы Internet

Ø В этой главе:

Ø Протокол telnet

Ø Протокол rlogin

Ø Протокол SMTP

Ø Протокол POP3

Ø Протокол IMAP4

Ø Протокол NNTP

Ø Протокол HTTP

Ø Протокол CGI

Ø Атака на telnet-сервер

Ø Атака на SMTP-сервер

Ø Атака на POP3-сервер

Ø Атака на NNTP-сервер

Ø Атака на HHTP-сервер

Ø Атака на telnet-клиента

Ø Атака на SMTP\POP3 клиента

Ø Атака на NNTP-клиента

Ø Атака на HTTP-клиента

Ø Устройство почтового сервера

Ø Анонимная рассылка корреспонденции

Ø Анонимное получение корреспонденции

Ø Постиг сообщений в модерируемые конференции

Ø Безопасность Java-приложений

“…документация подобна сексу: просто великолепно, когда она хороша; но если даже она несовершенна, то это все же лучше, чем ничего.”

Дик Брандон

В основе межсетевого общения лежат протоколы – соглашения, выполняемые сервером и клиентом. А сетевые атаки, в свою очередь, базируются либо на ошибках реализаций протоколов, либо используют уязвимости самих протоколов. В главах «Атака на Windows NT» и «Атака на Windows 95» уже упоминался прикладной протокол SMB, слабости реализации которого позволяют злоумышленнику подбирать пароль для входа в систему, устанавливать подложный именной канал и т.д.

Реализации других протоколов также порой далеки от совершенства и часто позволяют злоумышленнику выполнять действия никак не запланированные ни разработчиками, ни администратором системы. Следует различать понятия «протокола» от «реализации протокола». Сам протокол – это только набор соглашений, правил и договоренностей, записанный на бумаге[184]. Реализация протокола – «живая» действующая программа, со всеми присущими ей программными ошибками.

Ошибкам подвержены как сами протоколы, так и их реализации (причем реализации гораздо чаще). Но ошибки реализации устраняются программными заплатками, а недостаток защищенности протокола можно рассматривать как концептуальную уязвимость. Например, UDP протокол работает без установки соединения и не гарантирует, что полученный пакет был действительно отправлен отправителем, а не кем-то еще, кто вздумал подделать его адрес. Это создает возможность внедрения ложных объектов в сеть, и часто приводит к успешным атакам.

Собственно, незащищенность UDP протокола еще не повод объявлять этот протокол «плохим», ведь ничто не хорошо и не плохо само по себе. А вот бездумное применение UDP протокола, в ответственных ситуациях, чувствительных к подделке адреса отправителя – плохо, ибо приводит к уязвимости. Так, DNS сервер, работающий на UDP протоколе, позволяет злоумышленнику отправлять ответы от имени DNS, и программное обеспечение жертвы вместо соединения с положенным сервером, неожиданно (и незаметно!) для нее подключается к машине злоумышленника! И жертва, не подозревая подлога, доверчиво передаст свой пароль на «вражеский» узел!

Другой пример: протокол SMTP не требует авторизации и позволяет злоумышленнику рассылать письма, используя чужие сервера. Исправление этой очевидной ошибки (хотя при разработке протокола она не была такой очевидной, ведь в то время спамеров еще не существовало) оказалось сопряжено со значительными трудностями.

Устранение недостатков протоколов автоматически не исправляет существующее программное обеспечение! Любой мало-мальски популярный протокол может иметь многие тысячи реализаций серверных и клиентских приложений, созданных различными, никем не координированными, разработчиками. Нужны очень веские доводы, чтобы склонить всех разработчиков, администраторов и пользователей перейти на новый стандарт. Даже если он имеет неоспоримые преимущества, его внедрение может растянуться на несколько лет. Но появление новых протоколов не приводит к полному отказу от старых, и они мирно уживаются рядом друг с другом.

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

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

Протоколы telnet и rlogin (глава для профессионалов)

Ø В этой главе:

Ø История возникновения telnet

Ø Задачи, решаемые с помощью протокола telent

Ø Виртуальные терминалы

Ø Передача команд в потоке

Ø Краткое описание команд telnet

Ø Алгоритм Нагла

Ø Перехват и расшифровка сессии telnet-клиента с сервером

Ø Краткая история возникновения протокола rlogin

Ø Задачи, возлагаемые на rlogin

Ø Передача команд протокола rlogin

Ø Кратное описание команд протокола rlogin

Ø Обзор telnet-клиентов

Ø Конфигурирование telnet-клиента, входящего в поставку Windows 2000

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

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

Протокол telnet один из старейших в сети. Он разрабатывался в конце шестидесятых годов, когда слово “Internet” еще не существовало, а кабель, соединяющий несколько узлов, гордо именовался «сетью ARPANET». Тогда telnet составлял основу сети, и относился к фундаментальным протоколам – большинство узлов общались друг с другом именно посредством telnet. Со временем его вытеснили новые специализированные протоколы, и он потерял свою главенствующую роль. Сегодня telnet используется практически только для удаленного администрирования UNIX-серверов.

Telnet – прикладной протокол, реализуемый поверх транспортного TCP‑протокола. Он обеспечивает дуплексный, 8‑битный канал между участниками соединения и поддерживает виртуальные терминалы. По умолчанию для подключения к telnet‑серверу необходимо установить соединение по 23 порту.

Врезка «информация» *

Виртуальный терминал (NVT – Network Virtual Terminal) это мнимое символьное устройство с клавиатурой и принтером. Данные, набранные на клавиатуре, отправляются серверу, а ответ сервера печатается на принтере. Под «клавиатурой» и «принтером» подразумеваются некие мнимые устройства. В действительности ответ сервера вовсе не обязательно выводить на настоящий принтер, вместо этого обычно используется экран.

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

Подробнее о виртуальном терминале рассказано ниже, в конце этой главы.

Протокол telnet использует довольно оригинальный способ передачи команд, называемый команды в потоке (in-band signaling), заключающийся в следующем: любой байт из интервала [0x0, 0xFF)[185] интерпретируется как данные, а байт 0xFF, называемый IAC (Interpret As Command – интерпретировать как команду), указывает на то, что следующий за ним байт является командным байтом. Если возникнет необходимость передать байт данных, равный 0xFF, его следует продублировать, т.е. отправить два байта 0xFF 0xFF.

Командный байт может принимать следующие значения, перечисленные в таблице (необходимые объяснения даны ниже).

Имя Код Пояснения
EOF 0xEC Конец файла
SUSP 0xED Приостановить текущий процесс
ABORT 0xEE Прекратить процесс
EOR 0xEF Конец записи
SE 0xF0 Конец подопции
NOP 0xF1 Нет операции
DM 0xF2 Маркер данных
BRK 0xF3 Прерывание
IP 0xF4 Прервать процесс
AO 0xF5 Прекратить вывод
AYT 0xF6 Есть кто живой?
EC 0xF7 Удалить последний введенный символ
EL 0xF8 Стереть строку
GA 0xF9 Идти дальше
SB 0xFA Начало под опции
WILL 0xFB Обсуждение опции
WONT 0xFC Обсуждение опции
DO 0xFD Обсуждение опции
DONT 0xFE Обсуждение опции
IAC 0xFF Байт данных 0xFF

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

· EOF

· End Of File – конец файла. Получатель команды уведомляет процесс, подсоединенный к NVT терминалу, что был достигнут конец файла. В настоящее время эта команда не используется.

· SUSP

· (сокращение от Suspend – приостановить) «замораживает» связанный с NVT процесс и передает управление другому процессу. «Замороженный» процесс позднее сможет продолжить свое выполнение с той же самой точки. Эта команда в настоящее время игнорируется большинством получателей.

· EOR

· End of Record - конец записи. Аналогично EOF. Подобно эта команда описана в RFC‑885.

· NOP

· No operation – нет операции. Эта команда обычно используется для проверки работоспособности сессии. Если соединение с получателем разорвано, то попытка посылки NOP приведет к ошибке TCP/IP. Некоторые сервера периодически посылают NOP, чтобы убедится в активности клиента.

· DM

· Data Mark – маркер данных. Используется в качестве сигнала синхронизации, который передается в виде срочных данных TCP. Когда получатель принимает уведомление о том, что отправитель вошел в режим срочности, он начинает читать поток данных, отбрасывая все, кроме telnet‑команд. Команда DM сообщает принимающему о необходимости вернуться в обычный режим работы.

· BRK

· Break – прерывание. Уведомляет о нажатии клавиши «Break» и приводит к прерыванию сессии с очисткой буферов ввода вывода.

· IP

· Interrupt Process – Прервать Процесс. Прервать, приостановить или завершить процесс, связанный с NVT терминалом

· AO

· Abort Output – Прервать Вывод. Принудительное завершение вывода с очисткой буферов.

· AYT

· Are You There – Есть кто живой? Эта команда приписывает получателю вернуть отправителю нечто читабельное для подтверждения факта своей активности.

· EC

· Erase Character – Удалить Символ. Эта команда предписывает получателю удалить последний символ, полученный им от отправителя.

· EL

· Erase Line – Удалить Строку. Эта команда предписывает получателю удалить последнюю строку, полученную им от отправителя.

· GA

· Go Ahead – Далее. Эта команда передает управление получателю (используется в полудуплексном режиме)

Для согласования дополнительных параметров используются квиточки WILL, WONT, DO, DONT. Отправитель может попросить получателя изменить требуемые опции или уведомлять его об изменении своего состояния.

· Квиток WILL, посылаемый отправителем, говорит, что отправитель хочет включить некую опцию для себя. Если получатель согласен, он отправляет квиток DO, в противном случае DONT.

· Квиток DO, посылаемый отправителем, просит получателя включить некую опцию. Если получатель согласен, он отправляет квиток WILL или WONT в противном случае.

· Квиток WONT, посылаемый отправителем, уведомляет получателя, что отправитель выключил у себя некую опцию. Получатель обязан подтвердить это квитком DONT

· Квиток DONT, посылаемый отправителем, приказывает получателю выключить некую опцию. Получатель обязан подтвердить это квитком WONT.

Существует множество опций, подробно описанных в “Assigned Numbers RFC”, ниже для примера описаны лишь некоторые, наиболее часто употребляемые, из них.

<

Наши рекомендации

Код опции   Назначение