Глава 3. Что необходимо знать для понимания хакинга
Глава 3. Что необходимо знать для понимания хакинга
В этой главе я постараюсь очень кратко наметить то, что нужно знать хакеру и грамотному системному администратору, на которого легла задача по обеспечению безопасности сети. В рамках данного руководства невозможно описать все эти вещи полностью.
3.1. Языки программирования
Основой хакерства является вовсе не умение картинно сидеть перед экраном монитора, азартно топча клавиатуру, а знание языков программирования. Каких именно? Кратко расскажем о языках, которые используются для хакинга.
Год рождения ARPANET был также годом, когда хакер из «Bell Labs» по имени Кен Томпсон (Ken Thompson) создал Unix. Томпсон был вовлечен в работу по разработке операционной системы, называемой Multics. Multics должна была облегчить использование и программирование ЭВМ, чтобы увеличить производительность работы. Этот проект был выставлен на продажу, но никогда не пользовался таким успехом, как операционная система. Томпсон отказался от среды Multics и начал обыгрывать смесь идей Multics’a со своими собственными.
Другой хакер по имени Деннис Ричи (Dennis Ritchie) придумал новый язык, названный «С», для использования под «изначальным» Unix’oM Томпсона. Подобно Unix, «С» был разработан, чтобы быть естественным и гибким. Интерес к этим инструментам распространился в Bell Labs, и они получили популярность в 1971 г., когда Thompson и Ritchie выиграли тендер на то, что мы теперь называем системой автоматизации делопроизводства для внутреннего использования в фирме.
Традиционно операционные системы писались на ассемблере, чтобы извлечь максимально возможную эффективность (КПД) из хост-машин. Томпсон и Ричи были среди первых, кто понял, что аппаратные средства и технология компилирования стали достаточно хороши, чтобы операционная система полностью могла быть написана на «С», и к 1974 г. среда целиком была успешно перенесена на несколько машин различных типов.
Такого раньше никогда не было, и результаты были впечатляющими. Раз Unix мог представлять одинаковый интерфейс, одинаковые возможности на машинах многих различных типов, то он мог стать средой стандартного программного обеспечения для всех них. Пользователям не надо было больше платить за разработку нового программного обеспечения всякий раз, когда машины устаревали.
Помимо переносимости, Unix и «С» имели еще одну важную силу. Они были сконструированы как философия «для самых тупых». Программист мог легко удерживать полную логическую структуру «С» в своей голове (в отличие от большинства других языков), вместо того чтобы постоянно обращаться к справочникам; и Unix был структурирован как гибкий инструментарий простых программ, разработанных для комбинирования друг с другом в необходимых направлениях.
В начале 1996 г. появился новый язык программирования – «Java». На домашней странице Consortium Java была внесена в список так называемых Мобильных кодов – одного из перспективных направлений развития технологии World Wide Web. И вот в конце 1996 г. на Западе начался бум Java, который к моменту проведения выставки Unix-Expo-96 докатился и до нашей страны. Согласно истории технология Java (кофе) роди-лась из проекта Oak (дуб), основной целью которого была разработка объектно-ориентированных средств описания и коммуникации различного рода электронных устройств. Из-за неудачи Oak в 1994 г. опыт, накопленный в рамках его реализации, было решено применить к продуктам, ориентированным на применение в Интернете. С апреля 1995 г. по сети свободно распространяется Hotjava – интерфейс просмотра страниц World Wide Web для платформ Sun.
Буквально через месяц Netscape Communication – тогдашний законодатель моды в разработке программ-интерфейсов Интернета – покупает лицензию на Java. С этого момента начинается золотое время для этой технологии. В настоящее время Hotjava реализована не только для Sun-. OS и Solaris, но и для многих других платформ и Windows.
Система программирования на Java позволяет компилировать программы для компьютерной платформы, на которой она стоит в том же ключе, как и любая другая, например С или C++. В этом случае основным отличием Java-программ, которые называются Java-applications, является использование библиотеки Java-классов, которые обеспечивают разработку безопасных, распределенных систем. При этом утверждается, что язык позволяет делать гораздо меньше ошибок при разработке программ. Главным при этом является тот факт, что в Java напрочь отсутствует адресная арифметика. Гораздо более интересным является разработка мобильных Java-байт-кодов, которые в терминах Java-технологии называются applets.
Известный в свое время язык программирования Модула-2 был создан Н. Виртом в 1979 г. и впервые реализован на мини-ЭВМ PDP-11. В 1970-х гг. Паскаль получил широкое признание у пользователей ЭВМ и преподавателей, однако первоначально он был разработан для обучения программированию и как язык разработки програмного обеспечения имел много недостатков. В Модуле-2 эти недостатки были устранены, но при этом сохранены логическая структура и характерные черты его предшественника. Кроме того, в Модуле-2 были введены новые мощные языковые средства.
Язык программирования Модула-2 относится к так называемым машинонезависимым языкам. Н. Вирт применил Модулу-2 в написании полной операционной системы для мини-ЭВМ Lilith. Характерной чертой Модулы-2 является раздельная компиляция, позволяющая разрабатывать и хранить в библиотеках программы, которые можно использовать повторно.
Первые версии языка программирования Си++ (тогда он назывался «Си с классами») были разработаны в начале 1980-х гг. Бьярном Страуструпом, сотрудником знаменитой AT&T Bell Labs, где ранее были разработаны операционная система Unix и язык программирования Си. По признанию самого автора языка, Си++ никогда не разрабатывался на бумаге. Проектирование, реализация и документирование новых возможностей происходили фактически одновременно. Единственной целью разработки было создание языка, на котором было бы удобно программировать автору и его друзьям. За основу был взят популярный в среде профессиональных разработчиков язык программирования Си. Первыми средствами, которыми был расширен Си, стали средства поддержки абстракций данных и объектно-ориентированного программирования. Как это принято в AT&T, описание нового языка не было опубликовано сразу. Первыми его пользователями стали сами сотрудники Bell Labs.
Perl. Когда встает вопрос о создании приложений системного уровня, в частности сценариев Web-cepвepoв, на первый план выходит язык программирования Perl -прежде всего благодаря своей проверенности и богатству возможностей. Perl (Practical Extraction and Reporting Language, или, как иногда расшифровывают это название создатель Perl и другие его фанатичные приверженцы, – Pathologically Eclectic Rubbish Lister) является одним из наиболее мощных и популярных языков программирования.
История «Perl» началась в 1987 г., когда человек по имени Ларри Уолл занялся разработкой языка, необходимого ему для решения проблем системного программирования, с которыми он сталкивался как администратор Unix-систем. Несмотря на такое скромное начало, Perl вырос в полнофункциональный сложный язык. Он привлекателен тем, что заполняет разрыв между методами программирования коммандного процессора Unix и С-приложениями, обладая простотой первых и функциональностью последних. Уолл характеризует его так: «Perl – это интерпретируемый язык, оптимизированный для сканирования произвольных текстовых файлов, извлечения информации из этих файлов и печати отчетов на основе этой информации. С его помощью также можно решать многие задачи системного управления. При разработке этого языка целью была не столько красота (небольшой объем, элегантность и оптимальность), сколько практичность (простота в использовании, эффективность и полнота)». Уолл указывает также, что синтаксис выражений Perl находится в полном соответствии с синтаксисом выражений языка С; Perl не ограничивает произвольно объем ваших данных – «если вы располагаете памятью, Perl может загрузить в нее весь ваш файл как одну строку»; рекурсия может быть неограниченной глубины, а кроме того, язык применяет изощренные методы сопоставления с образцом для быстрого сканирования больших объемов данных.
3.2. Почему ломают сети?
Сильными сторонами российских взломщиков по-прежнему остаются коллективизм и взаимопомощь, а также мощный полет воображения, чего в большинстве случаев их западные коллеги лишены. Действуют они дружной толпой (стадом), которой и батьке навалять можно. Рассчитанные по большей части на достаточно инфантильные западные стандарты, системы защиты от взлома лихих и невероятно изобретательных россиян обычно бессильны. Охраннику с резиновой дубинкой нипочем не остановить банду, вооруженную монтировками и гвоздодерами. Как таковой кражей денег со счетов пока занимаются единицы, и то от случая к случаю. Но вот через пару лет с расширением в России компьютерных коммуникаций такие вещи могут быть поставлены на поток. Предвидя такой оборот событий, руководители ФБР и иже с ними уже сейчас поднимают шум и соответственно требуют дополнительных ассигнований. И, как ни странно, наши хакеры выступают здесь в роли добровольных и весьма эффективных помощников.
Несколько лет назад по сети «Фидонет» прошла информация, что некий ее участник забрался в компьютер управления сетью международных спутников «Иммарсат» (обслуживает навигацию, космос, связь, сигналы «SOS» и т. д.). Он не только сам там «погулял», но и выдал в сеть все инструкции и пароли по вхождению в базу данных. Чем это может обернуться для спутниковой сети, пока неясно.
Нахальство наших компьютерных хулиганов не в последнюю очередь обусловлено фактическим отсутствием борьбы с ними на родине. Причем нельзя сказать, что совсем ничего не делается. В 2001 г. вышел специальный указ Президента о защите информации. Россия обязалась сотрудничать с Интерполом в этой области. В начале 1995 г. при МВД было создано специальное подразделение по борьбе с хакерами в количестве восьми человек. По этому вопросу было даже специальное заседание Совета безопасности. Хорошей иллюстрацией эффективности подобных мер является то, что на вопрос корреспондента о результатах поимки злодеев ответственный работник МВД ответил прямо: «Молодой человек, арестовывают и судят у нас по законам, а не по указам».
В 1997 г. ФБР обратилось к правоохранительным органам России. Дело в том, что американские глобальные коммерческие информационные сети, такие как America Online и Microsoft Network, за 4 месяца 1996 г. понесли ощутимые убытки от хакеров, использующих для входа в сеть фальшивые кредитные карточки. Проследив линки, службы безопасности указанных сетей передали всю информацию ФБР, так как было выявлено, что большинство незаконных подключений производится со стороны России. Если честно, то в Интернете определить источник подключения достаточно просто, но дорого (приходится держать дополнительный штат сотрудников). В АОЛ и МСН такие подразделения существуют. Ну и что? Первым делом начинается проверка всех официальных точек входа в сеть, т. е., если в городе имеется официальное представительство сети со своим номером телефона для подключения к конкретной сети, все подключения начинают контролировать автоматически. При этом работает АОН или CID (если набор тональный). Если абонент официально подключен к сети – все нормально. Если номер не определяется – абонента «выкидывает с линии». Если номер телефона не совпадает с базой данных официальных пользователей – соединение автоматически берется на контроль. Не спасает и подключение через Интернет (через промежуточные сети), так как текущий линк всегда фиксируется при соединении (этот момент используется сетью для автоматического роуминга пакетов данных). Только в Москве в 1996 г. было выявлено более 360 человек, незаконно использующих коммуникационные услуги. Тут есть юридическая тонкость – сидя дома, человек совершает преступление на территории США. Требование привлечь их к ответственности в соответствии с законодательством США даже в наши маразматические времена – дикость. Тут можно годами разбираться. Теоретически здесь применимы статьи УК РФ, касающиеся финансовых преступлений, т. е., если хакера нельзя привлечь за взлом сети, его можно привлечь к уголовной ответственности по другим статьям (например, за хулиганство, подделку денежных знаков и т. п.).
На данный момент все выявленные абоненты продолжают гулять по коммерческим сетям через Интернет, чаще всего совершенно не подозревая, что они уже на контроле. В любом случае, для того чтобы бороться с хакерством и его последствиями, надо понять, что в руках и хакеров, и обычных пользователей находится, в принципе, одно и то же оружие. Надо лишь правильно его применять.
3.3. Протокол TCP/IP
Семейство протоколов TCP/IP широко применяется во всем мире для объединения компьютеров в сеть Интернет. Более подробную информацию о протоколах TCP/IP можно найти в RFC (Requests For Comments) – специальных документах, выпускаемых Сетевым Информационным Центром (Network Information Center – NIC).
Каждая машина в сети, работающей по протоколу TCP/IP (IP-сети), имеет уникальный адрес, который присваивается администратором, и все данные передаются и получаются машиной с использованием этого уникального адреса. Вторым, не менее важным параметром, характеризующим машину, является маска подсети – величина, определяющая максимальное число машин, которые могут находиться в одном локальном сегменте сети.
Администратор присваивает IP-адреса машинам в соответствии с тем, к каким IP-сетям они подключены. Старшие биты 4-байтного IP-адреса определяют номер IP-сети. Оставшаяся часть IP-адреса – номер узла (хост-номер). Существуют 5 классов IP-адресов, отличающиеся количеством бит в сетевом номере и хост-номере. Класс адреса определяется значением его первого байта. Из этих 5 классов широко используются только первые три.
Адреса класса «А» предназначены для использования в больших сетях общего пользования. Они допускают большое количество номеров узлов. Адреса класса «В» используются в сетях среднего размера, например в сетях университетов и крупных компаний. Адреса класса С используются в сетях с небольшим числом компьютеров.
Внутри диапазона адресов каждого класса существуют так называемые «фиктивные» или «зарезервированные» диапазоны адресов, данные из которых в глобальную сеть не передаются, и вы можете использовать их для своих целей.
Класс Начало диапазона Конец диапазона Маска А 10.0.0.0 10.255.255 255.255.0.0.0 В 172.16.0.0 172.31.255 255.255.255.0.0 С 192.168.1120 192.168.112.255 255.255.255.0
Прежде чем вы начнете использовать сеть с TCP/IP, вы должны получить один или несколько официальных сетевых номеров. Выделением номеров (как и многими другими вопросами) в Интернете занимается DDN Network Information Center (NIC). Выделение номеров производится бесплатно и занимает около недели. Вы можете получить сетевой номер вне зависимости от того, для чего предназначена ваша сеть. Даже если ваша сеть не имеет связи с объединенной сетью Интернет, получение уникального номера желательно, так как в этом случае есть гарантия, что в будущем при включении в Интернет или при подключении к сети другой организации не возникнет конфликта адресов. Адрес для вашей сети может предоставить ваш провайдер. Чаще всего так и делается.
Адресное пространство сети может быть разделено на непересекающиеся части – «подсети», с каждой из которых можно работать, как с обычной сетью TCP/IP. Таким образом, единая IP-сеть организации может строиться как объединение подсетей.
Как правило, подсеть соответствует одной физической сети, например одной сети Ethernet. Использование подсетей необязательно. Можно просто назначить для каждой физической сети свой сетевой номер, например номер класса «С». Однако такое решение имеет два недостатка. Первый заключается в пустой трате сетевых номеров. Более серьезный недостаток состоит в том, что если ваша организация имеет несколько сетевых номеров, то машины вне ее должны поддерживать записи о маршрутах доступа к каждой из этих IP-сетей. Таким образом, структура IP-сети организации становится видимой для всего мира. При каких-либо изменениях в IP-сети информация о них должна быть учтена в каждой из машин, поддерживающих маршруты доступа к данной IP-сети.
3.4. Порты
Взаимодействие между прикладными процессами в сети осуществляется через так называемые порты. Порты нумеруются начиная с нуля. Прикладной процесс, предоставляющий какие-либо услуги другим прикладным процессам (сервер), ожидает поступления сообщений в порт, выделенный специально для этих услуг.
Сообщения должны содержать запрос на предоставление услуг. Они отправляются процессами-клиентами. Например, сервер SMTP всегда ожидает поступлений сообщений в порт 25. Если клиент SMTP желает получить услугу, он посылает запрос в порт 25 на машину, где работает сервер. Данный номер порта является общеизвестным, т. е. фиксированным номером, официально выделенным для услуг SMTP. Подобные общеизвестные номера определяются стандартами Интернета.