12.03.2003

Оценка риска защиты Интернета, часть 3: Методика оценки Интернета. Продолжение

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

Оценка риска защиты Интернета, часть 3: Методика оценки Интернета. Продолжение
Карл Ван-Дер.-Уолт

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

Видимость

К началу этой стадии мы имеем список IP адресов, которые являются  целями для нападения или, как в нашем случае, для анализа. Наш подход к анализу машины зависит от того, какие функции данная машина выполняет. Например, машина может быть почтовым сервером, Web сервером, DNS сервером или всеми тремя. В каждом из этих трех случаев, наш подход будет немного отличаться. Кроме того, наша стратегия изменится в зависимости от операционной системы рассматриваемой машины и точного списка служб, запущенных на машине. Точные цели этой стадии могут быть сформулированы следующим образом:

  1. Определить, какие службы являются активными на исследуемой машине (т. е. какие порты открыты).
  2. Определить тип активных служб.
  3. Определить операционную систему исследуемой машины.

Эта информация позволит нам спланировать и выполнить оставшуюся часть оценки.

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

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

Клиент

Посылает пакет запроса связи (SYN),  запрашивая установление соединения с указанным портом.

SYN

Сервер

Если порт открыт, сервер отвечает своим SYN пакетом, и пакетом подтверждения связи (ACK).

SYN/ACK

Клиент

При получении ответа от сервера, клиент отвечает  подтверждением, после чего связь устанавливается.

ACK

Это - точное описание процесса, который сканер порта использует для определения открытых портов. Подтверждение выполняется для каждого порта из указанного диапазона. Если подтверждение произошло, порт регистрируется как открытый. Для выполнения этой процедуры можно использовать программу Nmap.

Вы, наверное, уже утомлены длинными списками, но нам нужно отметить еще несколько фактов:

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

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

3.       Поскольку,  для того, чтобы признать данный порт открытым, сканер порта требует только, SYN/ACK- ответ сервера, вы не можете быть на 100 % уверены, что на данном порту действительно функционирует какая-нибудь служба. Бывают случаи, когда сервер посылает  подтверждение связи, даже если вы, фактически, не можете связаться с рассматриваемой службой. Для того чтобы окончательно определить, является ли действительно служба, с которой мы соединились, активной, нужно применить интуицию. Но имеется еще один автоматический способ, который может помочь нам увеличить шансы - это захват баннера. Захват баннера позволяет рассеять сомнения относительно проверяемой службы, узнать ее тип и версию.  Это является следующим шагом нашей проверки, который мы исполняем на этой стадии.

Кроме TCP-подтверждения, большинство сетевых приложений имеют свои протоколы подтверждения связи, которые начинают работать только после того, как TCP связь установлена. Во время подтверждения  обычно можно узнать название службы и версию. Действительно, некоторые службы показывают детали своих  версий сразу же до подтверждения.

Таким образом, мы используем простую утилиту под названием захватчик баннера (banner grabber). Захватчик  предназначен для извлечения информации о версиях большого количества обычных сетевых служб. Мы нацеливаем его на список адресов, и он будет вытягивать баннерную информацию о любой службе, которую он распознает. Этим же способом мы можем лучше понять, действительно ли приложение, которое мы проверяем, находится на данном порте. Имеется много программ, которые смогут сделать захват баннера. Многие сканеры порта тоже смогут сделать это (например, SuperScan), также как и некоторые сканеры уязвимостей (типа Xspider). Вы можете также проделать эту операцию при помощи  обычного сеанса связи по телнету, если вы разбираетесь в протоколах достаточно хорошо.

Итак, теперь мы знаем, какие порты открыты у исследуемого хоста. Мы также знаем тип и версию приложения, которое использует каждый из этих портов. Во многих случаях этого достаточно, чтобы определить операционную систему. Например, порт  телнета (23) открыт на данном IP-адресе. Воспользуемся телнетом, чтобы соединиться ним:

# telnet 196.3x.2x.7x

Trying 196.3x.2x.7x...

Connected to xxx.xx.co.za.

Escape character is '^]'.

HP-UX u46b00 B.10.20 A 9000/831 (ttyp1)

login:

Очевидно? Имеются также другие немного менее очевидные способы. Например, IIS Web Server может быть запущен только на Windows машинах, Sendmail – скорее всего почтовый Unix сервер, а порты 264 и 265 - незадействованные, на них устанавливают контрольно-пропускной пункт firewall-1.

В дополнение к простым трюкам, описанным выше, для определения операционной системы можно также использовать более изощренную технику под названием "снятие отпечатков пальцев операционной системы". Отличные ссылки по этой теме можно получить на нашем сайте. В целом, снятие отпечатков пальцев операционной системы напоминает определение национальности по акценту. Многие операционные системы  при подключении имеют свои уникальные характеристики, которые позволяют отличать их от других операционных систем. Программы типа Nmap и Queso и многие коммерческие сканеры безопасности имеют базы данных «акцентов» операционных систем, с которыми "акцент" данной операционной системы может быть сравнен. К проверяемым  характеристикам относятся уникальные комбинации открытых портов (см. наш пример, упомянутый ранее), последовательность TCP инициализации и ответы на неожиданные запросы.

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

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

Сканирование Уязвимостей

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

Мы начали наши поиски с расследования, целью которого было выяснить всю инфраструктуру целевой организации. Мы сделали это за несколько шагов. Во-первых, используя различные ресурсы, мы создали список всех DNS доменов, которые могли бы принадлежать цели. Затем, пользуясь обычным набором DNS -инструментов, мы определили IP адреса, предполагая, что IP адреса одиночной организации данной системы чаще всего расположены в одном месте в Интернет.

После этого мы проверили, являются ли обнаруженные  IP адреса активными в Интернете для того, чтобы сузить наш список подсетей до более точного списка  IP адресов, которые действительно являются  активными в Интернете. Для этого  мы применяем  набор тестов на живучесть, предназначенные для определения, насколько возможно, можно ли  до данного IP адреса добраться через Интернет. Испытания живучести включали в себя трассировку запросов, ping и сканирование TCP хостов.

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

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

1.       Разрешенные каналы: Часто, нападающему нужно получить доступ к вашим системам прямо во время вашей работы. Интернет, по своей сути, является коммуникабельным. Часто коммуникативные службы дают достаточное количество информации, которую можно использовать для ослабления системы.

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

3.        Ошибки программирования: Компьютерные программисты – всего лишь люди, и подобно другим        людям они иногда делают ошибки. Современные программы и операционные системы невероятно сложны и очень быстро развиваются. Иногда программисты не в состоянии обслужить некоторый сценарий. Нападающий, который может определить этот сценарий, может воспользоваться им, чтобы ввести программу в состояние, с которым программист никогда не встречался. В этом бесконтрольном состоянии программа может прекратить функционировать правильно, выдавать неправильную информацию или выполнять команды нападающего.

4.       Процедурные ошибки: Иногда ошибки имеются не в технологии непосредственно, а в способе ее использования. Эти слабые места – являются целями социотехнических атак, когда нападающий манипулирует людьми и их сознанием, чтобы получить информацию или некоторый другой незаконный  доступ к системе.

5.       Ошибки Близости: Интернет - весьма связанная система. Следствие этого чрезвычайного уровня взаимозависимости: сильные системы, ослабляются из-за того, что они имеют доверительные отношения со слабыми системами.

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

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

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

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

Как мы можем определить, имеют ли анализируемые системы какую-нибудь из известных уязвимостей? Давайте вспомним информацию, которую мы получили ранее: для каждой видимой машины мы имеем операционную систему, список активных служб, а также типы и версии этих служб. Все, что мы должны - это проверить базу данных известных уязвимостей. Где найти такую базу данных? Конечно, в Интернете!

Имеется много сайтов, которые открыто издают базы данных известных уязвимостей. Фактически, сам Интернет - огромный склад информации об известных уязвимостях. Просто воспользуйтесь вашей любимой службой поиска,  и ищите в такой последовательности:  <название операционной системы >, <название службы>, <номер версии> и слово "эксплоит", и вы должны найти то, что ищете. Попробуйте,  будете поражены.

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

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

Имеется много коммерческих программ всех видов сканеров. Я не хочу упомянуть все такие программы, но среди ведущих продавцов этих продуктов нужно отметить Positive Technologies, ISS, Axent (теперь Symantec), eEye, Next Generation Software, BindView и Foundstone. Есть еще много других коммерческих программ, но список не будет полон без одного свободно распространяемого программного обеспечения- Nessus от Ренода Дерайсона. Общедоступный сканер Nessus может посоперничать с самыми лучшими коммерческими сканерами почти по всем позициям, кроме, возможно, поддержки и отчетов. Большинство общедоступных сканеров концентрируют свое внимание на обнаружении только определенных типов или видов уязвимостей (типа уязвимостей Web сервера) и список таких сканеров чрезвычайно велик.

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

  1. Обычно такие сканеры могут только проверить известные уязвимости безопасности. Их эффективность зависит в значительной степени от точности и быстродействия источника информации об уязвимостях. Иногда эта информация не может быть получена в формате, который сканеры могут понять или такой формат еще не общедоступен.
  2. Испытание на известную уязвимость может пройти неудачно. Иногда единственный способ определения, действительно ли система имеет некоторую известную слабость, состоит в том, чтобы пробовать задействовать это слабое место и понаблюдать, как система будет себя вести. Такой способ наиболее эффективен, но может иметь вредные последствия для системы. Альтернативой является следующее: собрать самую важную информацию (например, тип службы и версию) и на этом основании принять решение. Этот подход, весьма безопасен, но намного менее точен и часто ведет к большому количеству "ложных подозрений". Сообщение об уязвимости, которое базируется на поверхностной информации, часто оказывается неверным после дальнейшего исследования.

Сканерное программное обеспечение нового поколения использует более интеллектуальные методы сканирования, и может помочь уменьшать зависимость от знания предыдущих атак. Xspider  - пример сканера такого типа.

Хотя интеллектуальное сканирование находится в стадии бурного развития, я думаю, что неудачи автоматических сканеров свидетельствуют о более фундаментальных недостатках в концепции сканирования  уязвимостей. Из этого мы должны извлечь важный урок: Нельзя отключать мозг, когда включаете сканер. Нужно всегда помнить, что сканер не обнаружит все уязвимости системы, и будет часто сообщать о проблемах, которых, на самом деле, нет. Кроме того, сканер никогда не будет полностью понимать взаимозависимости между системами, контекст, в котором компьютерные системы существуют, и роль, которую люди играют в действии компьютерных систем. Хотя сканеры уязвимости - ценный инструмент в течение этой стадии нашей оценки, каждый отчет должен быть тщательно проверен.

Эпилог: анализ безопасности Web приложений

Кроме технических неудач сканеров безопасности, есть большое количество потенциально уязвимых мест, которые едва только начинают оценивать – обычные Web приложения. HTTP - возможно самый распространенный сегодня протокол в Интернете и, наверное, нет такого приложения, которое не было бы написано для Web. Безопасность Web приложений - относительно новая область, и программисты часто полностью не понимают значения безопасности программ, которые они пишут.