Часть #1.
[HIDE=10]Сканирование как метод вскрытия каналов передачи данных существует уже достаточно долгое время. Идея заключается в том, чтобы исследовать как можно больше каналов и отслеживать те из них, которые находятся в состоянии ожидания соединения и являются полезными для исследующего. Сам по себе термин "сканирование" появился в процессе слияния компьютеров с телефонными системами. В результате была сформирована глобальная сеть телефонных коммуникаций, доступ в которую можно получить, всего лишь набрав номер на телефонном аппарате. С одного телефона доступны миллионы абонентов телефонной сети, однако полезными могут оказаться лишь сотни, а то и десятки абонентов, к телефонам которых подключен модем. Логически верным подходом для поиска телефонных номеров таких абонентов является "атака в лоб" - перебор всех возможных номеров АТС и поиск тона несущей частоты, генерируемого модемом на другом конце линии. Так возникло направление, называемое wardialing. Появилась масса программ типа ToneLoc, предназначенных для исследования большого объема телефонных номеров на наличие абонентов, к телефонам которых подключен модем.. Основная идея проста. Если, набрав номер, модем установил соединение (т.е. на другом конце линии также находится модем), набранный номер запоминается. В противном случае модем "вешает трубку", набирает следующий номер и вновь пробует установить соединение. Wardialing является весьма эффективным методом для поиска входов в различные сети по коммутируемой телефонной линии. С другой стороны, огромное число компьютеров объединены в сеть с помощью специального оборудования (сетевых адаптеров, кабельных модемов) и выделенных линий и не используют коммутируемые линии АТС. В этом случае программы типа ToneLoc оказываются бесполезными, поскольку определить нужно не телефонный номер, а номер порта сервера, ожидающего запрос на соединение. Термин "порт" является абстрактным понятием, используемым для упрощенного описания механизма установления соединения между хостами, и представляет собой потенциальный канал передачи данных. Использование механизма портов существенно облегчает процесс установления соединения и обмена информацией между сервером и хостом. Кроме того, имеется возможность исследования сетевого окружения сервера методом опроса его портов (т.н. "сканирование" портов). На все возможные номера портов (1-65535) сервера посылается "лавина" пакетов, и по тому, от каких портов будут (или не будут) получены ответы, определяются открытые порты и службы, работающие на исследуемом сервере. Техника сканирования портов Было разработано огромное количество различных методов для поиска протоколов и портов, которые "прослушивает" удаленная машина. Все методы имеют определенные преимущества и недостатки. Ниже рассмотрены наиболее часто используемые из них. Сканирование сервера с использованием ICMP-эха Перед непосредственным сканированием портов удаленного хоста необходимо выяснить, какие хосты в сети являются функционирующими, и определить их адреса. Особенно это важно при сканировании группы хостов либо при сканировании определенного сегмента сети. Данный метод работает аналогично команде ping. В качестве запроса хост отправляет серверу ICMP-сообщение и ожидает получения ответа, также представляющего собой ICMP-сообщение (т.н. ICMP-эхо). Варьируя время ожидания ответа на ping-запрос, можно сканировать большие сети. Сканирование TCP-портов функцией connect() Данный метод является основным для сканирования портов по протоколу TCP. Функция connect() позволяет хосту соединиться с любым портом сервера. Если порт, указанный в качестве параметра функции, прослушивается сервером (т.е. порт открыт для соединения), то результатом выполнения функции будет установление соединения с сервером по указанному порту. В противном случае, если соединение не установлено, то порт с указанным номером является закрытым. Этот метод обладает одним серьезным преимуществом: его может применить любой пользователь, не обладающий никакими привилегиями на хосте. Другое преимущество - скорость исследования. Последовательный перебор портов путем вызова функции connect() для очередного номера порта, определение его состояния и закрытие соединения - достаточно долгий процесс. Однако его можно ускорить, применив метод "параллельного просмотра" с использованием неблокированного соединения (non-blocked socket). Такой метод позволяет определить состояние практически всех портов сервера одновременно. Большим недостатком данного метода является возможность обнаружения и фильтрации такого рода сканирования, причем сделать это достаточно легко. Log-файл сканируемого сервера укажет службам, отвечающим за внешние подключения, на наличие многочисленных попыток подключения с одного адреса и ошибок установления соединения (поскольку хост исследующего после соединения с сервером сразу обрывает его), а те, в свою очередь, немедленно заблокируют доступ к серверу для хоста с данным адресом.[/HIDE]