Опубликован: 20.02.2007 | Уровень: специалист | Доступ: платный
Лекция 6:

Сканеры портов

Пример из жизни. Распознавание заголовков

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

Операционные системы Unix увлекались разглашением своих биографий при простом TCP-соединении с сервером telnet. Люди могли собирать информацию о хостах в сети, получая список IP-адресов, живущих в сети (вероятно, с помощью fping ) и устанавливая TCP-соединение на порте 23 с каждым хостом, чтобы собирать ответы. Сейчас многие системные администраторы не позволяют приложениям своей сети сообщать так много информации об операционной системе без предшествующей идентификации или авторизации. Однако информация о версии специфических приложений по-прежнему доступна.

Telnet был заменен на Secure Shell ( SSH ). Когда SSH-соединение установлено, сервер выдаст свою версию протокола SSH без запрашивания какой-либо информации от клиента. Сервер обычно ожидает, что клиент идентифицирует себя своей версией SSH-протокола. Этот обмен версиями часто необходим в общении клиент/сервер, чтобы убедиться, что обе стороны говорят на одном языке. Следовательно, раскрытие информации о специфической версии приложения часто неизбежно. Использование почтового клиента, чтобы присоединиться к почтовому серверу, или Web-клиента, чтобы присоединиться к Web-серверу, не обязательно выдаст вам эту информацию. Но использование программы типа Telnet или Netcat, чтобы установить TCP-соединение непосредственно с почтовым или Web-сервером, обычно позволяет получить информацию, которой вы, как правило, не увидите при использовании клиентов, взаимодействующих с этим сервером.

Давайте попробуем кое-что. Во-первых, посмотрим, достаточно ли добра моя Linux-машина, чтобы сообщить нам, с какой версией FTP-сервера она работает (если вообще работает с какой-либо).

[bjohnson@originix ~]$ telnet 192.168.1.100 21
Trying 192.168.1.100...
Connected to 192.168.1.100.
Escape character is '^]'.
220 originix FTP server (Version wu-2.5.0(1) 
  Tue Sep 21 16:48:12 EDT 1999) ready

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

[bjohnson@originix ~]$ telnet 192.168.1.100 80
Trying 192.168.1.100...
Connected to 192.168.1.100.
Escape character is '^]'.
GET / HTTP

HTTP/1.1 200 OK
Date: Tue, 29 Jan 2002 07:18:07 GMT
Server: Apache/1.3.14 (Unix) (Red-Hat/Linux)
Last-Modified: Sat, 05 Aug 2000 04:39:51 GMT
ETag: "3a107-24-398b9a97"
Accept-Ranges: bytes
Content-Length: 36
Connection: close
Content-Type: text/html

I don't think you meant to go here.
Connection closed by foreign host.

Это было немного сложнее. Когда мы впервые установили соединение, Web-сервер ответил (указывая, что что-то действительно работало на Web-порте), но затем он просто остановился, как будто ждал чего-то от нас. Обычно Web-клиенты запрашивают страницы HTML с Web-сервера. Проведя небольшое исследование на HTTP, я обнаружил, что мне нужно было послать запрос GET на сервер (завершаемый двумя нажатиями клавиши enter ), чтобы получить значимую информацию. Сделав это, я мог увидеть детали заголовка HTTP, которые обычно скрыты Web-клиентом. Этот сервер появляется при запуске версии Apache 1.3.14. Ох! Посмотрите на это! Он также сказал нам, что он работает под RedHat Linux!

Черт возьми, давайте посмотрим, какой заголовок мы получим, когда применим telnet к telnet-серверу хоста.

[bjohnson@originix ~]$ telnet 192.168.1.100 23
Trying 192.168.1.100...
Connected to 192.168.1.100.
Escape character is '^]'.
Dobbylan Linux release 8.1 (Cauliflower)
Kernel 2.5.38-02 on an i986
login:
telnet close
Connection closed.
[bjohnson@originix ~]$

Dobbylan Linux? Kernel 2.5? i986? Это не имеет смысла. Последний сеанс с telnet дал нам важный урок: не всегда доверяйте информации, которую дают эти заголовки. Например, редактируя файл /etc/issue.nete на RedHat Linux 6.1, я смог изменить мой заголовок telnet в неидентифицируемую тарабарщину. Однако Web-сервер по-прежнему выдавал секрет о том, что у меня RedHat. Некоторые заголовки сетевых приложений могут быть модифицированы только при изменении действительного исходного кода, но обычно это не сложно сделать.

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

Пример из жизни. ОС вручную

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

Большинство систем нельзя определить по схемам портов. Однако, как и по акценту человека можно определить географический регион, из которого он происходит, так и способ, на котором система говорит на TCP/IP, может быть идентифицирующим признаком. Действительные спецификации протокола TCP/IP находятся в комплекте документов, называемом RFCs ( Request For Comments ). Эти документы описывают структуру фактических пакетов данных и то, как реализация стека сети должна упаковывать, передавать, получать и распаковывать пакеты данных.

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

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

Конкретный пакет TCP/IP может быть связан с конкретным поставщиком еще многими способами. IP-пакеты могут содержать 16-ти разрядное идентификационное поле. За исключением того, что эти номера должны быть уникальными, в RFC нет ничего о том, как эти номера должны выбираться (за исключением ограничения размеров поля в байтах). Также пакеты TCP должны содержать сходную информацию в своих заголовках (относящуюся к порядковым номерам). Порядок номеров помогает TCP отслеживать соединение. Каждая сторона соединения TCP выбирает свой исходный порядок номеров в начале соединения. Методы выбора этого начального порядкового номера предложены в спецификации, однако он также может быть выбран разработчиком, поскольку номера не часто повторяются (в противном случае соединения легко путаются). Есть еще две области для настройки и достижения гибкости в реализации пакета TCP/IP. Реализация каждого продавца может быть проанализирована на конфигурацию, обеспечивая больше способов, чтобы снимать отпечатки пальцев конкретной операционной системы по ее сетевому трафику. Nmap применяет эту технику, чтобы сделать обоснованные предположения об операционной системе каждого сканируемого хоста.

Другие протоколы в TCP/IP могут быть использованы для идентификации операционной системы. Большинство пакетов TCP/IP поставляются со своими собственными утилитами Ping. Эхо-сообщения Internet Control Message Protocol ( ICMP ) имеют поля для необязательных данных, что позволяет использовать эхо-сообщения разного размера, чтобы увидеть, как управляются большие по размеру пакеты данных. Когда пользователь указывает размер данных для эхо-сообщения, утилита Ping затем должна заполнить это сообщение соответствующим количеством данных. Она может заполнить поле данных одними нулями, может использовать повторяющуюся последовательность алфавитно-цифровых символов, или случайные цифры. Смысл в том, что каждая реализация Ping имеет опцию заполнения поля данных чем угодно. Если вы знаете, какой метод использует конкретный Ping операционной системы, то можете идентифицировать это, просто посмотрев, как взаимодействует Ping с хостом.

Сергей Хлюкин
Сергей Хлюкин
Россия, Москва, Московский Государственный Открытый Университет, 2007
Игорь Касаткин
Игорь Касаткин
Россия, Москва