| |
Сканирование портов
Иногда у вас может возникнуть потребность узнать какие сервисы предоставляет
определенный хост. Для этого существует ряд различных программ сканирования
портов.
Простейший вариант - это программы типа 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-пакетах, или если размер окна больше нуля, то скорее всего
порт активен.
|