Как казаки TCP/IP-стек портили,или Краткий обзор DoS-атак для Windows-систем Версия для печати
 

В связи с массовым распространением сетей, построенных на основе TCP/IP, стали возникать всевозможные программы и методы для осуществления различных неправомерных действий в таких сетях. Очевидно, что наиболее распространенной платформой на сегодняшний день являются различные Windows-системы. Это Windows 95, Windows 95 OSR2, Windows 98, Windows NT 3.51, Windows NT 4.0. Старые 16-битные версии практически уже отошли в прошлое. Подавляющее большинство персональных компьютеров сегодня имеет одну из вышеуказанных систем. Поэтому рассмотрение некоторых аспектов безопасности этих систем будет интересно большинству читателей. А поскольку Windows NT позиционируется как серверная платформа, то данная статья может представлять интерес и для начинающих системных администраторов.

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

Из всевозможных видов атак на WINDOWS наиболее распространены DOS-методы (DENIAL OF SERVICE, "отказ от обслуживания"). Возможно, что сравнительно небольшое количество других незаконных способов воздействия на WINDOWS-системы связано со значительно меньшим количеством стандартных сервисов, нежели в UNIX-системах.

NUKE

Нередко различные DOS-атаки называют общим термином "нюк" (NUKE). Одна из самых известных программ так и называется WINNUKE (см. ниже по тексту). Восстановим истину в этом вопросе. Существует метод атаки, называемый просто NUKE. Строго говоря, классический NUKE нельзя называть DOS-атакой. Идея основана целиком на документированных стандартах, а не на ошибках в конкретной реализации TCP/IP.

Суть классического NUKE в следующем. Для служебных целей в IP-сетях используется протокол ICMP (Internet CONTROL MESSAGE PROTOCOL, описание можно найти в RFC-1122). С этим протоколом мы встречаемся, например, когда используем программы PING и TRACEROUTE. Одной из возможностей ICMP является проверка наличия определенного адреса в Сети. В случае возникновения ошибки соединения возвращается достаточно подробная диагностика ситуации. Например: "Сеть недоступна", "Адрес недоступен", "Ошибка маршрутизации" и другие. Стандартные реализации TCP/IP-стека по приходе ICMP-пакета с извещением об ошибке производят определенные действия, в первую очередь перестройку таблицы маршрутизации и т.п. При этом, как побочный эффект, разрываются все установленные соединения с машиной, имеющей адрес, о котором стало известно, что он недостижим. На использовании этого эффекта и строятся диверсии.

Действительно, если знать, что компьютер с адресом X установил соединение с компьютером Y, и послать ICMP-сообщение об ошибке на компьютер X с исходящим адресом компьютера Y, то безусловной реакцией будет разрыв вышеупомянутого соединения. Для осуществления подобной атаки необходимо работать с IP на более низком уровне, нежели стандартные функции операционной системы. Подмена адресов в IP-пакетах имеет устоявшееся название "спуфинг" (от англ. SPOOFING - мистификация, обман). Практический эффект такого рода атаки невелик. Для ее осуществления необходимо знать, что два компьютера установили между собой соединение. Из этого следует, что средний пользователь, гуляющий по Сети, вряд ли столкнется с такой атакой. Диверсии более подвержены люди, которые долго подключены к определенным серверам. Например, любители разговаривать на IRC и WEB-чатах или играть в различные ON-LINE-игры (от MUD до новейших 3D-стрелялок). Классический NUKE является одним из древнейших инструментов ведения "военных действий" на IRC. Самое печальное, что простого противодействия этим атакам не существует.

WINNUKE

Вернемся все-таки к теме статьи. Начнем, конечно же, с широко известного WINNUKE, дата появления которого - 7 мая 1997 года. Автор метода поместил его описание и исходный текст программы в несколько NEWS-конференций. Ввиду крайней простоты метода каждый человек с IQ немногим большим единицы мог вооружиться новейшим оружием и пойти крушить направо и налево. Первой жертвой был http://www.microsoft.com/. Этот сервер "лежал" более двух суток - в пятницу вечером (9 мая) он прекратил откликаться на обращения и только к обеду в понедельник вновь обрел устойчивость. Приходится только пожалеть его администраторов, которые на протяжении всего уик-энда регулярно нажимали волшебную комбинацию трех клавиш, после чего реанимированный сервер падал вновь. А может быть, после первых нескольких попыток оживить сервер их прекратили, кто знает... Конечно же, наряду с жертвой номер один в мае 97-го пали многие серверы, на которых красовалась надпись "windows nt powered", а также серверы и без оной надписи, но все-таки построенные на windows nt. К чести microsoft, следует отметить, что "заплатки" (patch) появились и стали доступны довольно быстро.

Дадим краткое техническое описание WINNUKE. Наряду с обычными данными, пересылаемыми по TCP-соединению, стандарт предусматривает также передачу срочных (OUT OF BAND, OOB) данных. Предназначаются они для передачи различной срочной информации по соединению, используемому для передачи обычных данных. На уровне форматов TCP-пакетов это выражается в ненулевом URGENT POINTER. На большинстве компьютеров с операционной системой WINDOWS, установленных в локальной сети, присутствует сетевой протокол NETBIOS, который использует для своих нужд три IP-порта: 137, 138, 139. Как выяснилось, если соединиться с WINDOWS-машиной через 139-й порт и послать туда несколько байтов OOB-данных, то первоначальная реализация NETBIOS, не зная, что делать с этими данными, попросту подвешивает или перезагружает машину. Для WINDOWS 95 это обычно выглядит как синий текстовый экран, сообщающий об ошибке в драйвере TCP/IP и невозможности работы с сетью до перезагрузки операционной системы. WINDOWS NT 4.0 без установленных SERVICE PACK перезагружается, NT 4.0 со вторым SERVICE PACK выпадает в синий экран (синий экран, говорящий о необработанном исключении в коде ядра, нередко называют "BSOD" - BLUE SCREEN OF DEATH). Судя по информации из Сети, такая атака фатальна и для WINDOWS NT 3.51, и для WINDOWS 3.11 FOR WORKGROUPS, и для WINFRAME (в основе находится WINDOWS NT 3.51). Официальные "заплатки" от MICROSOFT можно найти по адресам: ftp://ftp.microsoft.com/bussys/winnt/winnt-public/fixes/usa/nt40/hotfixes-postsp2/oob-fix - для nt 4.0 с service pack 2; ftp://ftp.microsoft.com/bussys/winnt/winnt-public/fixes/usa/nt351/hotfixes-postsp5/oob-fix - для nt 3.51 с установленным service pack 5; support.microsoft.com/download/support/mslfiles/vipup11.exe - для windows 95 с winsock версии 1.1; support.microsoft.com/download/support/mslfiles/vipup20.exe - для window95 с winsock 2.0 (service pack 3 для nt 4.0 уже содержит в себе исправление данной ошибки).

Хочется вспомнить достаточно забавную историю. Как выяснилось, вскоре после выпуска SERVICE PACK 3 для WINDOWS NT 4.0, WINNUKE, запущенный с компьютеров APPLE, легко пробивал защиту сервис-пака. Причиной тому послужило существование двух разных стандартов на IP-пакеты, содержащие OOB-данные. Есть стандарт от BERKLEY, а есть стандарт, описанный в RFC. Различие их состоит в том, что URGENT POINTER в двух реализациях вычисляется по-разному, и результаты отличаются друг от друга на единицу. SERVICE PACK 3, защищающий от "своих" OOB-пакетов, оказался беспомощным против пакетов другого стандарта. Поэтому почти сразу вышло дополнительное исправление: ftp://ftp.microsoft.com/bussys/winnt/winnt-public/fixes/usa/nt40/hotfixes-postsp3/oob-fix/.

Следует заметить: если для написания оригинального WINNUKE достаточно самых тривиальных функций работы с TCP/IP (программа на PERL занимает 7 строк), то для того, чтобы пробить защиту SERVICE PACK 3, требуется работать с TCP на низком уровне, либо запускать стандартный WINNUKE с платформы, поддерживающей другую реализацию OOB. Само существование OOB-данных, безотносительно к WINNUKE, вызывает достаточно много проблем именно из-за существования двух стандартов, вернее, из-за отсутствия стандарта. Поэтому гарантировать правильную работу программы, использующей OOB, не может никто. Многие умные люди рекомендуют вообще не использовать OOB-данные в своих программах. Собственно, обычно так и поступают. Поэтому весь смысл OOB сегодня - это наличие потенциальных "дыр", позволяющих злоумышленникам изобретать все новые и новые методы атак. Попросту постреляв OOB-данными по открытым TCP-портам, можно попытаться найти какую-либо новую "дырку" в очередной программе. Некоторым, говорят, это удается...

ICMP

Следующая широко известная ошибка обнаружилась буквально через месяц после нашумевшего WINNUKE (хотя атаки, основанные на схожей идее, были известны еще годом раньше). Объектом атаки на сей раз стал ICMP-протокол, точнее - его реализация. ICMP-протокол издавна привлекал любителей различных сетевых диверсий. Поскольку он является внутренним механизмом поддержки работоспособности IP-сетей, то, с точки зрения злоумышленника, является очевидным объектом атаки. В качестве одного из методов можно упомянуть PING с большим размером пакета, так называемый PING-FLOOD. Поскольку ICMP-пакеты имеют определенные привилегии в обработке, то PING большого размера может абсолютно парализовать работу конкретного компьютера или даже целой сети, IP-каналы которых будут передавать только ICMP-пакеты. Такой способ часто используется людьми, имеющими мощные каналы связи, против людей, располагающих более слабыми каналами. Метод этот, основанный на грубой силе, очевидно, не требует большого ума (точнее сказать, не требует никакого ума и, видимо поэтому, так любим молодыми сотрудниками различных провайдерских организаций). Защиты от него в общем случае не существует, самый распространенный метод реакции - установив адрес злоумышленника, написать жалобы куда только можно.

Следующим объектом нашего исследования будет более хитроумный метод, называемый SPING (JOLT, SSPING, ICENUKE, ICEPING, ICENUKE, PING OF DEATH...) Множество названий вовсе не означает наличия множества различных модификаций. Просто почему-то разные люди назвали один метод разными именами, и встретить программу можно под всеми вышеперечисленными названиями. Как выяснилось, WINDOWS-системы неадекватно реагируют на получение сильно фрагментированного ICMP-пакета (кусочками до одного килобайта) большого размера (на пару байт больше 64 килобайт). Реакция заключается в безоговорочном "повисании". В конце июня 1997 года жертвой SPING пал многострадальный сервер компании MICROSOFT, после чего его окончательно закрыли каким-то хитрым экраном.

В отличие от WINNUKE, жертвами SPING могут стать не только WINDOWS-системы, но и MAC OS и некоторые версии UNIX (заплатки, к счастью, имеются уже для всего).

Официальная "заплатка" от MICROSOFT для NT 4.0 с установленным SERVICE PACK 3 (далее везде по тексту будет подразумеваться, что NT 4.0 имеет установленный SERVICE PACK 3) - ftp://ftp.microsoft.com/bussys/winnt/winnt-public/fixes/usa/nt40/hotfixes-postsp3/icmp-fix/

Следует заметить, что атака данного типа намного серьезнее, нежели предыдущего, поскольку использует ICMP-пакеты, которые часто не фильтруются FIREWALL, а даже если и фильтруются, то, используя приемы SPOOFING, можно преодолеть такого рода защиту.

LAND

Следующий метод атаки, называемый LAND (по слухам, фамилия первооткрывателя была LAND), замечателен в первую очередь огромным количеством поражаемых систем. Кроме любимой народом (за наличие MINESWEEPER) WINDOWS NT, здесь и MAC OS, и множество UNIX (от бесплатных до серьезных), и такие экзотические системы, как QNX и BEOS, и даже многие аппаратные маршрутизаторы (в том числе и продукция фирм CISCO и 3COM). Практически для всех систем уже имеются исправления, хотя, конечно же, далеко не все установили их в систему.

В начале создания TCP-соединения посылается пакет с установленным флагом SYN. Нормальной реакцией на получение SYN-пакета является подготовка необходимых ресурсов для нового соединения, посылка SYN-ACK пакета (подтверждение) и ожидание реакции с другой стороны. В случае, когда реакция отсутствует определенное время, SYN-ACK пакет передается повторно несколько раз, как правило, с увеличивающимся периодом задержки. Очевидным методом атаки, использующим вышеописанный механизм, является классический SYN-FLOOD, заключающийся в следующем. На компьютер-жертву посылается множество SYN-пакетов с искаженными адресами отправителя. Компьютер-жертва тратит массу своих вычислительных ресурсов на попытки подтвердить соединения с абсолютно ничего не подозревающими или даже с несуществующими компьютерами. При достаточно большом количестве фальшивых запросов ресурсы компьютера-жертвы могут быть исчерпаны, а все другие процессы в системе будут просто заморожены, либо аварийно завершены, либо будут "сброшены" все имеющиеся TCP-соединения. Но это очень старый метод, основанный на грубой силе. Механизм работы LAND хитрее: посылается SYN-пакет с адресом отправителя, совпадающим с адресом получателя, жертвы. Пакет посылается на любой открытый порт. Для WINDOWS-систем это почти всегда может быть 139-й порт (старый знакомый по WINNUKE). Для других систем это может быть любой известный порт (21-й, 80-й и др.). Реакцией WINDOWS-компьютера на LAND является абсолютное "зависание".

Официальный ответ MICROSOFT для WINDOWS NT 4.0 на данный способ диверсии - ftp://ftp.microsoft.com/bussys/winnt/winnt-public/fixes/usa/nt40/hotfixes-postsp3/land-fix/. Для других операционных систем "заплатки" могут быть найдены на сайтах компаний-производителей.

TEARDROP

Найденный в том же многострадальном 97-м году метод атаки TEARDROP основан на ошибках в реализации TCP/IP-стека. Подверженными такой атаке оказались WINDOWS-системы, а также компьютеры с установленным LINUX.

"Заплатка" MICROSOFT для WINDOWS NT, появившаяся достаточно быстро, - ftp://ftp.microsoft.com/bussys/winnt/winnt-public/fixes/usa/nt40/hotfixes-postsp3/simptcp-fix/. Строго говоря, эта "заплатка" предназначалась для защиты от другого типа атак. Метод заключался в посылке большого количества udp-пакетов с искаженным адресом отправителя на 19-й порт, что приводило к повышению udp-трафика. Фурора, подобного появлению winnuke, произведено не было, возможно потому, что общественное мнение свыклось с регулярным возникновением новых dos-атак. Тем не менее teardrop отличается тем, что стал первым в семействе себе подобных клонов (об этом будет рассказано ниже). Также teardrop является прекрасной демонстрацией того, что любые программы, даже состоящие из нескольких строчек, содержат ошибки. Совершим небольшой экскурс в тайны реализации tcp/ip-стека.

Поскольку передача данных в IP-сетях производится не в идеальной среде, а по вполне реальным каналам различного качества, то естественно, что в стандарт заложили возможность передачи больших пакетов фрагментами, которые на принимающей стороне преобразуются в исходный пакет. Речь идет о том, что некий единый пакет на уровне TCP- или UDP-протоколов может быть фрагментирован на уровне IP - протокола более низкого уровня. При этом каждый фрагмент будет характеризоваться смещением от начала исходного пакета и своей длиной. Драйвер TCP/IP-стека собирает все фрагменты на принимающей стороне до тех пор, пока не получит их все (или, во всяком случае, пока не решит, что принял их все). Безусловно, при передаче возможны различные ситуации, которые "умная" реализация TCP/IP должна понимать. В частности, может оказаться, что несколько полученных фрагментов будут пересекаться. Нас интересует ситуация, когда очередной фрагмент имеет смещение, лежащее внутри уже полученного фрагмента. Что же происходит в этом случае? Прежде всего вычисляется размер пересечения. А затем в буфер копируется только та часть нового фрагмента, которая "выступает за границу" старого фрагмента. Все просто и очевидно, за исключением того, что возможна еще одна нестандартная ситуация. А именно - когда новый фрагмент не только начинается внутри старого, но и оканчивается в нем же. По идее, такой фрагмент должен быть просто пропущен, но как раз такую возможность программисты, писавшие WINDOWS NT и LINUX, и не предусмотрели. Что же происходит в результате? Пусть у нас есть уже полученный фрагмент A, начинающийся с A_OFFS и имеющий длину A_LEN. Затем пришел новый фрагмент B, начинающийся с B_OFFS и с длиной B_LEN. Причем A_OFFS (A_OFFS + A_LEN), то есть фрагмент B лежит внутри фрагмента A. проследим действия принимающей стороны по шагам. начало нового фрагмента лежит внутри имеющегося. хорошо! пересекающаяся часть: ((A_OFFS + A_LEN) - B_OFFS). а тот кусочек, что нужно добавить в буфер, начинается с (A_OFFS + A_LEN) и имеет длину ((B_OFFS + B_LEN) - (A_OFFS + A_LEN)). о-ля-ля! длина-то меньше нуля! если вспомнить о машинной зацикленной арифметике, легко понять, что в результате будет скопирован очень большой блок памяти. при этом будет уничтожено все попадавшееся на пути (обычно на пути попадается операционная система). собственно, вышеописанное и есть TEARDROP ("слезинка", англ.). объяснение, приведенное выше, абсолютно верно для LINUX, поскольку его исходный код открыт. но, вероятно, аналогичный механизм делает и WINDOWS NT потенциальной жертвой для TEARDROP-атаки.

Позже возникло несколько модификаций TEARDROP, которые были способны пробивать WINDOWS NT с установленной против обычного TEARDROP "заплаткой". Известность получили BONK (BOINK), NEWTEAR, SYNDROP. Все эти атаки закрываются одной "заплаткой": ftp://ftp.microsoft.com/bussys/winnt/winnt-public/fixes/usa/nt40/hotfixes-postsp3/teardrop2-fix/. Наиболее оригинальным оказался метод syndrop. По сути, он представляет собой оригинальный teardrop, с тем отличием, что в посылаемых фрагментах устанавливается syn-флаг (снова этот излюбленный флаг).

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

Новая атака не влечет за собой фатальных последствий типа "зависания" или перезагрузки, но способна вызвать существенную загрузку процессора и повышенный сетевой трафик. На сей раз объектом нападок стала реализация RPC-протокола в WINDOWS NT. Идея чрезвычайно проста: в 135-й порт посылается некая "левая" датаграмма с адресом отправителя, измененным на адрес другой NT-машины. Реакцией атакуемой машины будет посылка REJECT-пакета на подмененный адрес.

Другая NT-машина ответит не менее гневным REJECT-пакетом, после чего такой пинг-понг будет продолжаться некоторое время, до тех пор, пока неправильный пакет не будет уничтожен как устаревший. Понятно, что посылая совсем небольшой поток фальшивых датаграмм, можно практически парализовать работу сети и заставить компьютеры тратить значительную долю своих вычислительных ресурсов на обработку RPC-ошибок. Изощренный злодейский ум может легко додуматься до простой модификации метода, при которой на несколько компьютеров посылаются поддельные UDP-пакеты с одинаковым адресом отправителя. В этом случае пинг-понг превращается в массированную артиллерийскую атаку несчастной жертвы.

Доступно исправление, после которого WINDOWS NT внимательнее относится к ошибочным RPC-пакетам и не спешит с ответной реакцией на них (FTP://FTP.MICROSOFT.COM/BUSSYS/WINNT/WINNT-PUBLIC/FIXES/USA/NT40/HOTFIXES-POSTSP3/SNK-FIX/SNK-FIXI.EXE).

135-й порт довольно давно зарекомендовал себя в качестве слабого места NT-платформы. Известна очень старая атака, заключавшаяся в посылке в этот порт нескольких строчек текста, что приводило к постоянной стопроцентной загрузке процессора. Спасал только перезапуск операционной системы. К счастью, эта "дырка" была закрыта в SERVICE PACK 3.

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

Заключение

На этом список широко известных DOS-атак на TCP/IP-стек WINDOWS-систем заканчивается. Что принесет нам будущее - неясно, внушает оптимизм лишь то, что чем больше ошибок находят и исправляют, тем меньше их остается. Конечно, при условии, что эти исправления сами не привносят новых ошибок.

Процедура установки всех "заплаток" для WINDOWS NT 4.0 с SERVICE PACK 3 давно превратилась в нетривиальное занятие, поскольку их количество исчисляется уже несколькими десятками, и порядок "латания" системы нередко имеет большое значение. Существует опасность установить "заплатки" в такой последовательности, что операционная система окажется в нерабочем состоянии. Следует отметить, что "заплатки" от DOS-атак, как правило, выпускались кумулятивными, то есть последняя "заплатка" содержала в себе все предыдущие. По крайней мере, это касается WINNUKE, SPING, LAND и TEARDROP с модификациями.

WINDOWS 95 также имеет кумулятивные исправления: support.microsoft.com/download/support/mslfiles/vipup11.exe, ftp://ftp.microsoft.com/softlib/mslfiles/vipup11.exe для winsock 1.1; support.microsoft.com/download/support/mslfiles/vipup20.exe; ftp://ftp.microsoft.com/softlib/mslfiles/vipup20.exe для winsock 2.0.

После этих исправлений следует поставить support.microsoft.com/download/support/mslfiles/vtcpup11.exe, ftp//ftp.microsoft.com/softlib/mslfiles/vtcpup11.exe для winsock 1.1; support.microsoft.com/download/support/mslfiles/vtcpup.exe, ftp://ftp.microsoft.com/softlib/mslfiles/vtcpup20.exe для winsock 2.0, которые закроют систему от land-атак.

WINDOWS 98 пока выглядит непоколебимой перед DOS-атаками.

Последнее замечание по технической стороне вопроса следующее. Программы для осуществления перечисленных видов атак по иронии судьбы, как правило, не реализованы для WINDOWS-платформ. Причина этого в том, что WINDOWS-реализация интерфейса сокетов не в полной мере соответствует общепринятому стандарту. При этом лишь для WINNUKE достаточно использования простейших системных процедур работы с сокетами. Остальные методы требуют непосредственной работы с заголовками IP-пакетов, для чего необходимо использовать не потоковый или датаграммный сокет, а так называемый "сырой" (SOCK_RAW, если в терминах констант). WINSOCK 1.1 попросту не поддерживает RAW-сокеты. Они появились в WINSOCK 2.0, но и тут потенциальных злоумышленников ждало разочарование, "сырые"-то они "сырые", но возможности менять заголовок так и не появилось. Соответствующая процедура просто не была реализована. Для того чтобы все-таки использовать WINDOWS в качестве платформы для атаки, необходимо создавать свой NDIS-драйвер, который, перехватывая все IP-пакеты, открывал бы доступ к их внутренней структуре, но, к счастью, люди, обладающие необходимой для этого квалификацией, находят для себя более интересные занятия.

В заключение приведем выдержку из Уголовного кодекса Российской Федерации, соответствующую тематике:

Статья 273:
1. Создание программ для ЭВМ или внесение изменений в существующие программы, заведомо приводящих к несанкционированному уничтожению, блокированию, модификации либо копированию информации, нарушению работы ЭВМ, системы ЭВМ или их сети, а равно использование либо распространение таких программ или машинных носителей с такими программами - наказываются лишением свободы на срок до трех лет со штрафом в размере от двухсот до пятисот минимальных размеров оплаты труда или в размере заработной платы или иного дохода осужденного за период от двух до пяти месяцев.
2. Те же деяния, повлекшие по неосторожности тяжкие последствия, - наказываются лишением свободы на срок от трех до семи лет.

Автор советует отнестись к данной статье как к образовательной, каковой она и является.

 
Автор: Максим Степин
 
Оригинал статьи: http://woweb.ru/publ/51-1-0-396
 
Рейтинг@Mail.ru
© Студия WEB-дизайна PM-Studio, 2005. Все права защищены.