Один из самых захватывающих аспектов в сетевой безопасности - сбор информации об атакующих. Чтобы правильно оценить угрозу и лучше защищаться от них нужно знать врага. Пассивный сбор информации (passive fingerprinting) - метод, позволяющий узнать больше о враге, так чтобы он не узнал, что его разрабатывают. Говоря конкретно, вы можете узнать тип операционной системы и другие характеристики удаленной системы, используя одни лишь перехваченные фрагменты трафика. Хотя допустимы некоторые неточности, можно получить на удивление достоверные результаты. Craig Smith разработал программу, воплощающую идею, описанную здесь. Также the subterrain crew разработала siphon, инструмент для пассивного пробирования портов и определения операционной системы.
Fingerprinting
Традиционно идентификация операционных систем осуществлялась при помощи активных программ, таких как queso и nmap. Эти программы основываются на принципе, в соответствии с которым устройство IP-стека каждой операционной системы обладает своими внутренними особенностями. Например, каждая операционная система отвечает по-своему на некорректно сформированные пакеты. Все что нужно было сделать, это создать базу данных, описывающую, как различные операционные системы отвечают на различные пакеты. Чтобы определить, какая операционная система стоит на удаленном компьютере, нужно сформировать несколько некорректных пакетов, послать ей, проследить, как она на них отреагирует, и сравнить ответы с базой данных. Самым удачным решением, использующим эту технологию является nmap, написанный Fyodor, который также детально описал этот метод.
Пассивная идентификация основывается на тех же посылках, но осуществляется по- другому. Пассивная идентификация использует перехват пакетов, полученных от удаленной системы. Вместо того, чтобы "активно" запрашивать удаленный компьютер, все что нужно сделать, это перехватить посланные пакеты. В соответствии со структурой этих пакетов можно установить, какая операционная система стоит на удаленном хосте. Также как и активная идентификация, пассивные методы основываются на том, что IP-стеки разных операционных систем устроены по- разному. Проанализировав перехваты снифера и определив природу этих различий, вы сможете определить операционную систему удаленного хоста.
Отличительные особенности
Мы рассмотрим четыре области различий, позволяющих определить удаленную операционную систему (хотя существуют и другие отличительные элементы):
* TTL - Какая операционная система ставит какое Time To Live на исходящих пакетах
* Размер окна - Какая операционная система ставит какой размер окна
* DF - Устанавливает ли операционная система бит Don't Fragment
* TOS – Устанавливает операционная система Type of Service, и если да, во что
Анализируя эти особенности пакетов можно будет определить удаленную операционную систему. Эта методика не очень точна и работает лучше для одних операционных систем, чем для других. Данные, полученные только об одном из этих элементов, не могут служить стопроцентным показателем для определения операционной системы. Однако, сопоставляя несколько показателей и сравнивая информацию, вы увеличиваете вероятность правильного определения удаленного хоста.
Легче всего продемонстрировать это на примере. Ниже представлена трассировка трафика, посылаемого системой. Эта система попыталась запустить эксплоит mountd против моей системы, и я хочу узнать побольше о ней. Я не хочу делать finger или nmap, потому что это может меня выдать. Наоборот, я предпочел изучить информацию пассивно. Эта идентификация была проведена с использованием snort, моего любимого снифера.
04/20-21:41:48.129662 129.142.224.3:659 -> 172.16.1.107:604
TCP TTL:45 TOS:0x0 ID:56257
***F**A* Seq: 0x9DD90553 Ack: 0xE3C65D7 Win: 0x7D78
В соответствии с нашими четырьмя пунктами, мы устанавливаем следующие:
? TTL: 45
? Размер окна: 0x7D78 (или 32120 в десятичном формате)
? DF: бит «не фрагментировать» установлен
? TOS: 0x0
Далее мы сравниваем эту информацию с данными базы. Сначала смотрим TTL, используемый удаленным хостом. Выше указано, что TTL установлен в 45. Скорей всего, это означает, что пакет прошел через 19 узлов и что изначально TTL был установлен в 64. Исходя из TTL, можно заключить, что пакет был послан с Linux или с FreeBSD-машины (однако, необходима большая информация для точного определения). Такой TTL подтверждается traceroute (проверкой маршрута) к удаленной машине. Если вы боитесь, что система, которую вы отслеживаете, засечет ваш traceroute, вы можете установить TTL traceroute (по умолчанию 30) в величину, на один или два шага меньшую, чем удаленный хост (опция –m). Например, в этом случае мы бы трассировали этот хост, разрешив только 18 «прыжков» (traceroute –m 18). Это дает вам информацию о маршруте (включая об их провайдере), не посылая ничего самому хосту. Чтобы узнать больше о TTL, просмотрите документ о стандартных TTL.
Следующий шаг – проверить размер окна. Проверка размера окна оказалась другим очень эффективным методом идентификации ОС, особенно учет данных о том, каков этот размер и как часто он меняется. В приведенном выше примере, мы видим, что он установлен в 0x7D78 – размер окна, устанавливаемый по умолчанию системой Linux. Помимо этого, Linux, FreeBSD и Solaris, как правило, сохраняют один и тот же размер окна на протяжении всей сессии (как было в нашем примере). Однако, маршрутизаторы Cisco (во всяком случае, мой 2514) и Microsoft Windows/NT постоянно меняют размеры окна. Как оказалось, замерять размеры окна, лучше после трехстороннего хэндшейка TCP (поскольку TCP требуется определенное время для инициализации). Для более подробной информации о размере окна см. "TCP/IP Illustrated, Volume 1" Chapter 20, написанный Stevens.
Большинство систем используют установленный бит DF, так что он не многое нам сможет рассказать. Тем не менее, с его помощью гораздо легче идентифицировать некоторые системы, которые его не используют (такие как SCO или OpenBSD). После углубленного изучения оказалось что и TOS тоже малозначим. Он скорее зависит от конкретной сессии, чем от операционной системы. Другими словами, операционная система очень редко диктует TOS. TOS требует более детального изучения. Таким образом, исходя из указанной выше информации, особенно из TTL и размера окна, вы можете сравнить результаты с базой данных стандартных величин и с доверительной вероятностью определить тип операционной системы (в нашем случае Linux kernel 2.2.x).
Не стоит забывать, что точно так же как и активная идентификация, пассивные методы имеют ряд ограничений. Во-первых, программы, которые строят свои собственные пакеты (такие, как nmap, hunt, teardrop и т.п.) не будут использовать те же значения, что и операционная система. Во-вторых, удаленной машине относительно легко сменить установки TTL, размер окна, DF, и TOS для пакетов. Например, способы изменить стандартную величину TTL:
Solaris: ndd -set /dev/ip ip_def_ttl 'number'
Linux: echo 'number' > /proc/sys/net/ipv4/ip_default_ttl
NT: HKEY_LOCAL_MACHINESystemCurrentControlSetServices
TcpipParameters
Однако, учитывая сразу несколько параметров, в данном случае, TTL и размер окна, вы можете с уверенностью определтиь ОС.
Другие параметры и применения
Наши возможности не ограничиваются четырьмя описанными до сего момента параметрами. Есть и другие области, в которых стоит «покапаться», например, начальные номера последовательностей, идентификационные номера IP, и опции TCP или IP. Например, маршрутизаторы Cisco устанавливают идентификационные номера IP в 0, вместо того, чтобы случайным образом присваивать значения. Также можно использовать особенности ICMP. Max Vision описывает возможность изучения типов ICMP и опций TCP для определения удаленного хоста.
Например, запросы ICMP Microsoft состоят из букв, в то время как Solaris и Linux в ICMP REQUESTS используют номера и символы. Что касается опций TCP, то опция Selective Acknowledgement SackOK часто используется Windows и Linux, но, как правило, не применяется в FreeBSD или Solaris. Другим источником уникальных параметров может стать состояния пакетов, какой тип пакета использовался. Fyodor говорит, что «например, начальные SYN запросы могут быть золотой жилой (так же, как и ответы на них). RST пакеты тоже обладают некоторыми интересными особенностями, которые могут быть использованы для идентификации.» Эти и другие параметры могут учитываться на ряду с уже рассмотренными, чтобы облегчить идентификацию операционной системы.
Пассивная идентификация может использоваться в некоторых других целях. Ее могут использовать взломщики для «незаметного» сканирования. Например, чтобы определить опреационную систему потенциальной жертвы, например, веб-сервера, все что нужно сделать – это запросить страничку с него, а потом проанализировать результаты, которые выдает снифер. Это исключает необходимость использования активного программного обеспечения, которое может быть обнаружено с помощью различных IDS. Кроме этого, пассивная идентификация может использоваться для определения удаленных прокси. Поскольку прокси воспроизводят подсоединения к клиента, вероятно, можно идентифицировать прокси, с помощью обсуждаемых методов. организации могут определять «чужие» системы внутри своей сети, то есть системы, которых в сети быть не должно. Например, магазин на базе Microsoft или Sun легко может обнаружить системы на базе Linux и FreeBSD, которые таинственным образом появились в их сети. Пассивная идентификация может быть применена для учеты операционных систем, используемых в системе и их влияния и доли в общей работе сети. Лицам, заинтересованным в области информации, пассивная идентификация также позволяет быстро распознать критичные системы (как Unisys Mainframe).
Заключение
Пассивное сканирование дает вам возможность изучить врага, так, чтобы он этого не заметил. Хотя, несомненно, ни один из отдельных элементов сам по себе не идентифицирует системы, сопоставляя несколько параметры вы сможете сделать выводы, что стоит на удаленном компьютере.