Иногда у вас может возникнуть потребность узнать какие сервисы
предоставляет определенный хост. Для этого существует ряд различных
программ сканирования портов
Простейший вариант - это программы типа SATAN (Security Analysis
Tool for Auditing Networks), которые устанавливают соединение с каждым
TCP-портом, открывая полное TCP-соединение. Преимущества этого метода
заключаются в том, что пользователю, занимающемуся сканированием, не
нужно самому составлять ip-пакет, который будет использован для
сканирования, потому что он использует стандартные системные вызовы, и
ему не нужен доступ администратора ( обычно нужен, чтобы использовать
SOCK_RAW или открывать /dev/bpf, /dev/nit и т.д.). Недостатком этого
метода заключается в том, что его легче обнаружить, причем несколькими
способами, в частности TCP Wrapper'ами by Wietse Venema.Для устранения
этого недостатка были придуманы методы сканирования без установления
полного TCP-соединения, т.н. 'полуоткрытое сканирование'.
Процесс установки TCP-соединения состоит из трех фаз: сторона,
устанавливающая соединение, сначала посылает TCP-пакет с установленным
флагом SYN, после чего принимающая сторона посылает TCP-пакет с
установленными флагами SYN и ACK в случае, если порт открыт, или
сбрасывает соединение с флагом RST если порт не активен. Третья фаза
происходит когда сторона,устанавливающая соединение,посылает финальный
TCP-пакет с установленным флагом ACK ( само собой все эти пакеты имеют
соответствующие sequence- и ack-номера, и т.д. ). Теперь соединение
установлено.
Сканирования с SYN-флагом
SYN-сканер посылает только первый пакет из трех и ждет SYN|ACK или
RST. Когда он получит либо то, либо другое, он будет знать, активен
этот порт или нет. Основное преимущество этого метода заключается в
том,что он не обнаруживается программами типа "SATAN" или TCP Wrappers
by Wietse Venema. Основные недостатки этого метода:
Этот метод обнаруживается некоторыми программами,которые проверяют
попытки коннекта с SYN-флагом ( например tcplog ), а также он
обнаруживается netstat(1)'ом.
Сторона,устанавливающая соединение, обычно должна составлять весь
IP-пакет. Для этого необходимо иметь доступ к SOCK_RAW ( в большинстве
операционок: getprotbyname('raw') ) или /dev/bpf (Berkeley Packet
Filter), /dev/nit (Sun 'Network Interface Tap') и т.д. Для этого
необходимо, как правило, иметь уровень администратора.
Stealth-сканирование
Этот метод основан на некорректном сетевом коде в BSD. Учитывая
то,что в большинстве операционных систем используется BSD'шный сетевой
код или производный от него,этот способ работает на большинстве систем
( наиболее очевидное исключение - маршрутиризаторы Cisco ). Этот метод
трудно обнаружить. Даже зная сам метод, разработка обнаруживающего
алгоритма весьма проблематична без устранения самой ошибки. Недостатки
этого способа:
Этот метод основан на ошибках в сетевом коде. Это значит, что
возможно, а точнее скорее всего, эти ошибки будут исправлены. Например
в OpenBSD это уже исправлено.
Нельзя поручиться, что этот способ будет нормально работать
в конкретной обстановке. Результаты могут быть разными в зависимости
от платформы и операционной системы, т.е. э тот способ не вполне
надежен.
Используются TCP пакеты с установленными ACK и FIN флагами.Их надо
использовать,потому что,если такой пакет послать в порт при неоткрытом
соединении,всегда возвратится пакет с флагом RST. Существуют несколько
методов, использующих этот принцип:
метод #1
Послать FIN-пакет. Если принимающий хост возвращает RST, значит
порт неактивен,если RST не возвращается, значит порт активен. Учитывая
тот факт, что этот метод работает на таком количестве хостов,
это - грустное свидетельство тому, какой некорректный сетевой код в
большинстве операционных систем.
метод #2
Послать ACK-пакет. Если TTL возвращаемых пакетов меньше, чем в
остальных полученных RST-пакетах, или если размер окна больше нуля,
то скорее всего порт активен.