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

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

Аннотация: Сканирование портов - первый шаг в процессе взлома или предупреждения взлома, поскольку он помогает определить потенциальные цели. Вокруг каждого хоста - независимо от аппаратного и программного обеспечения или выполняемых функций - имеется некоторое количество идентифицируемых особенностей. Внимательный наблюдатель, вооруженный соответствующим инструментарием, может исследовать работающие на машине службы (Web-сервер, FTP-сервер, mail-сервер, и т.д.), номера версий и даже операционную систему, посылая им пакеты данных и анализируя то, как они отвечают

В лекции "NETCAT и CRYPTCAT" вы узнали, что Netcat можно разнообразно использовать в качестве сканера TCP (Transmission Control Protocol) и UDP (User Datagram Protocol) портов. Однако возможности Netcat по сканированию портов достаточно ограничены, поскольку он разработан для работы с использованием TCP-соединения (без использования специальных скрытых методов). Он может поддерживать соединение только с одним хостом одновременно, и форма вывода выходной информации выглядит весьма убого. Если вы захотите заняться сканированием портов, вам потребуются инструментальные средства, специально предназначенные для сканирования портов и передачи большого объема информации о группе хостов. В настоящей лекции описывается несколько таких инструментальных средств. Каждая из программ может нумеровать TCP- или UDP-порты из заданного промежутка и позволяет посылать на каждый порт специально созданные пакеты для сбора информации. Однако методы, используемые каждым из программных средств, и их возможности могут несколько отличаться.

Сканирование портов - первый шаг в процессе взлома или предупреждения взлома, поскольку он помогает определить потенциальные цели. Вокруг каждого хоста - независимо от аппаратного и программного обеспечения или выполняемых функций - имеется некоторое количество идентифицируемых особенностей. Внимательный наблюдатель, вооруженный соответствующим инструментарием, может исследовать работающие на машине службы (Web-сервер, FTP-сервер, mail-сервер, и т.д.), номера версий и даже операционную систему, посылая им пакеты данных и анализируя то, как они отвечают.

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

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

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

В третьем примере вы узнаете, как можно определить тип операционной системы, просто наблюдая за ее взаимодействием с сетью.

Nmap

Nmap - один из наиболее доступных сканеров портов. Вы можете загрузить его по адресу http://www.insecure.org/ и с легкостью установить его на большинстве Unix-систем (используя последовательность configure, make, make install ). И, по всеобщему мнению, "кривой" порт nmap для Windows, созданный фирмой eEye, который называется nmapNT, доступен по адресу http://www.eeye.com/html/Research/Tools/nmapnt.html. Для нашего обсуждения мы будем использовать версию nmap для Unix номер 2.54 beta 30.

Реализация

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

Когда для определенного порта создано TCP-соединение, клиент посылает TCP-пакет с установленным флагом SYN для инициализации соединения. Если сервер прослушивает этот порт, он посылает пакет с установленными флагами SYN и ACK, подтверждая клиентский запрос на соединение, одновременно запрашивая установление обратного соединения. Затем клиент может послать пакет с установленным флагом ACK, подтверждая запрос SYN от сервера. Такой способ известен как трехходовое установление связи TCP. Когда одна из сторон выполнит передачу другой, она может послать пакет FIN. Другая сторона должна подтвердить этот пакет FIN и послать свое собственное сообщение FIN, ожидая от другой стороны подтверждения того, что соединение действительно закрыто. Для экстренного прерывания соединения любая из сторон может передать пакет с флагом RST. Простое TCP-взаимодействие между клиентом и сервером представлено ниже.

  1. Клиент посылает серверу сообщение SYN: "Я запрашиваю соединения".
  2. Сервер посылает SYN/ACK -клиенту: "Okay; мне необходимо соединение с тобой".
  3. Клиент посылает сообщение ACK -серверу: "Okay".
  4. Клиент и сервер посылают информацию вперед-назад, подтверждая каждую передачу сигналом ACK. Если одна из сторон посылает сообщение RST, соединение прерывается немедленно.
  5. Клиент желает завершить взаимодействие; клиент посылает серверу сообщение FIN: "Goodbye".
  6. Сервер посылает сообщение ACK -клиенту (подтверждая получение сообщения FIN ). Затем сервер посылает собственное сообщение FIN: "Okay. Goodbye".
  7. Клиент посылает подтверждение ACK -серверу (подтверждая получение его сообщения FIN ): "Okay".

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

Таблица 6.1. Определение флагов TCP
Признак Описание
SYN Используется для обозначения начала соединения TCP.
ACK Используется для уведомления о получении предыдущего пакета или цикла передачи.
FIN Используется для закрытия соединения TCP.
RST Используется для внезапного прекращения соединения TCP.
Сканирование хостов

Если вы интересуетесь только определением, какие хосты в сети работают, то можете использовать метод сканирования с использованием Ping (-sP). Этот метод работает также как fping, когда он посылает ICMP эхо-запросы по заданному промежутку IP-адресов и ожидает ответа. Однако многие хосты на сегодняшний день блокируют ICMP-запросы. В этом случае nmap дает возможность установить с хостом TCP-соединение по 80 порту (по умолчанию). Если он получает что-либо ( SYN/ACK или RST ), значит хост работает. Если он ничего не получает, хост маркируется как не работающий или отключенный от сети. Если вы хотите всего лишь получить список имен хостов для заданного IP-интервала, попытайтесь использовать опцию -sL.

Примечание. Важно понимать, как работает TCP Ping-сканирование для IP-адреса. Если сервис прослушивает порт, и кто-то пытается установить соединение с ним (посылая SYN пакет), сервис может послать в ответ пакет SYN/ACK. Это наглядно показывает, что по этому IP-адресу есть машина. Однако если отсутствует сервис, который прослушивал бы указанный порт, а машина находится в сети, в ответ будет послан пакет RST. Независимо от того, отвечает машина на запрос, или по заданному порту нет работающего сервиса, сам факт такого ответа подтверждает, что по заданному IP-адресу есть машина. Если в ответ на посланный SYN -пакет ничего не получено, это может означать, что по заданному IP-адресу нет никакой машины, или что такой трафик блокируется брандмауэром. 80 порт задан по умолчанию, поскольку большинство брандмауэров и фильтров пропускают Web-трафик. Если никакого ответа не получено, nmap с достаточной степенью уверенности может предположить, что хост не работает. Вы можете изменить номер порта, используемого nmap для TCP Ping, задав в командной строке -PT <port_number>.
Сканирование TCP-портов

Основной метод сканирования TCP-портов - это установление TCP-соединения connect() (-sT) с портом, чтобы посмотреть, будет ли получен ответ. То же самое делает TCP-клиент, желая установить соединение (законченное трехходовое соединение), за исключением того, что nmap может разорвать соединение, послав пакет RST, как только соединение будет установлено. Можно использовать сканирование RPC (-sR) для сканирования любого открытого для RPC-сервиса порта (такого, как portmapper ). Ниже приведены несколько примеров этих способов сканирования.

[bjohnson@originix ~]$ nmap -sT 192.168.1.109

Starting nmap V. 2.53 by fyodor@insecure.org ( www.insecure.org/nmap/ )
Interesting ports on cauliflower (192.168.1.109):
(The 1518 ports scanned but not shown below are in state: closed)
Port        State       Service
22/tcp      open        ssh
111/tcp open        sunrpc
884/tcp open        unknown
889/tcp open        unknown
6000/tcp    open        X11

Nmap run completed - 1 IP address (1 host up) scanned in 0 seconds
[bjohnson@originix ~]$ nmap -sR 192.168.1.109

Starting nmap V. 2.53 by fyodor@insecure.org ( www.insecure.org/nmap/ )
Interesting ports on cauliflower (192.168.1.109):
(The 1518 ports scanned but not shown below are in state: closed)
Port        State       Service (RPC)
22/tcp      open        ssh
111/tcp open        sunrpc (rpcbind V2)
884/tcp open        (mountd V1-2)
889/tcp open        (mountd V1-2)
6000/tcp    open        X11
Nmap run completed - 1 IP address (1 host up) scanned in 3 seconds

Обратите внимание, как при сканировании -sR используются RPC -команды для определения, есть ли в наличии работающий RPC-сервис. Nmap исследует тип и версию работающих сервисов rpcbind и mountd. Следующая таблица показывает, как выполняется сканирование -sT, -sR и -sP типов.

Nmap посылает на порт хоста Nmap получает от порта хоста Nmap отвечает Nmap принимает решение
SYN SYN/ACK ACK следом за RST Порт открыт; хост работает.
SYN RST - Порт закрыт; хост работает.
SYN Nothing - Порт блокирован брандмауэром или хост не работает.

Это великолепно, но поскольку вы всего лишь создали TCP-соединение, оно, скорее всего, будет зарегистрировано службой, предоставившей его.

Nmap позволяет сделать много интересного с TCP-пакетами, которые вы используете для сканирования портов. Во-первых, есть SYN -сканирование ( -sS ), которое создает первую половину TCP-соединения (посылая TCP-пакет с установленным флагом SYN ) но затем ведет себя несколько иначе. Если приходит TCP-пакет с установленным флагом RST, nmap решает, что порт закрыт и ничего больше не предпринимает. Однако если приходит ответ (о чем свидетельствует пакет с установленным флагом SYN/ACK ), вместо того чтобы подтвердить получение этого пакета, как это было бы при установлении нормального соединения, посылается RST -пакет, как это показано в следующей таблице. Поскольку трехходовое TCP-соединение не завершено, многие сервисы не регистрируют соединение. Поскольку вы осуществляете манипуляции с некоторыми из этих TCP-флагов на низком уровне, вы не можете реализовать эти типы сканирования, не имея полномочий пользователя root в системе.

Nmap посылает на порт хоста Nmap получает от порта хоста Nmap отвечает Nmap принимает решение
SYN SYN/ACK RST Порт открыт; хост работает.
SYN RST - Порт закрыт; хост работает.
SYN Nothing - Порт блокирован брандмауэром или хост не работает.

Так же как сервисы могут не регистрировать "незавершенное" соединение, некоторые брандмауэры или системы определения вторжений (IDSs) могут быть настроены на поиск таких типов сканирования. У Nmap есть несколько способов сканирования, но и хорошие IDSs-системы могут поймать вас. Вдобавок, брандмауэр может фильтровать подозрительные пакеты и искажать результаты сканирования.

Вы должны были уже понять, что в любой момент, как только вы посылаете TCP-пакет на закрытый порт, стек TCP/IP на другой стороне готов послать в ответ RST -пакет. Что же в этом случае происходит с разрешенными TCP пакетами? Если закрытый порт всегда отвечает пакетами RST, почему бы просто не посылать не имеющие смысла пакеты и не смотреть, что придет в ответ?

FIN -сканирование ( -sF ) посылает пакеты FIN, которые обычно используются для закрытия соединения. Однако, поскольку мы посылаем его прежде, чем соединение было установлено, открытый порт должен игнорировать такой мусор. Закрытый порт по-прежнему будет отвечать пакетом RST, как это показано в следующей таблице. Nmap предлагает два способа мусорного сканирования: Xmas tree (-sX) (рождественское) сканирование (которое устанавливает FIN, URG, и PUSH флаги TCP-пакета, расцвечивая его подобно новогодней елке) и null -сканирование ( -sN ) (которое выключает все флаги, подобно тому, как это делает hping по умолчанию). Поскольку мы совершаем некоторые манипуляции с пакетами на низком уровне, то такое сканирование также требует полномочий пользователя root. Имейте в виду, что не все стеки TCP/IP реализованы корректно. Даже притом, что открытые порты не посылают RST -пакеты в ответ на такие виды проверок, некоторые стеки TCP/IP не следуют этим правилам и посылают ответ в любом случае. Это означает, что вы можете ошибочно сделать положительное предположение при использовании такого сканирования для некоторых типов хостов. Также любой хост, защищенный брандмауэром, может вернуть ложный ответ. Nmap предполагает, что порт открыт, если не получает ничего в ответ. Что если брандмауэр блокирует этот ответ? Такое сканирование более скрытое, но оно и менее аккуратное.

Nmap посылает на порт хоста Nmap получает от порта хоста Nmap принимает решение
FIN Nothing Порт открыт, если хост работает и не защищен брандмауэром.
FIN RST Порт закрыт; хост работает.

Иногда nmap может сообщить вам, что порт подвергается фильтрации. Это означает, что влияние брандмауэра или фильтра накладывается на возможность nmap точно определить, открыт или закрыт порт. Некоторые брандмауэры, тем не менее, могут только фильтровать входящие соединения (это означает, что они просматривают только входящие SYN -пакеты на конкретном порту). Если вы хотите проверить правила брандмауэра, запустите ACK -сканирование для хоста, находящегося за брандмауэром. Всякий раз, как ACK -пакет (подтверждение) посылается не как часть существующего соединения, принимающая сторона предположительно посылает пакет RST. Сканирование ACK (-sA) может использовать этот факт для определения, осуществляется ли блокирование или фильтрация порта. Если получен пакет RST, порт не фильтруется; в противном случае, осуществляется фильтрация, как это показано в следующей таблице. Именно сканирование ACK может показать вам, что конкретный хост защищен брандмауэром.

Nmap посылает на порт хоста Nmap получает от порта хоста Nmap принимает решение
ACK RST Порт не защищен брандмауэром; порт может быть открыт или закрыт; хост работает.
ACK Nothing or ICMP unreachable Порт блокирован брандмауэром и хост работает.

Поскольку такое сканирование не может сказать, закрыт ли на самом деле порт или открыт, возможно, вы захотите использовать другие виды сканирования в комбинации с ACK -сканированием. Например, вы можете использовать ACK -сканирование в комбинации с SYN -сканированием ( -sS ), чтобы определить, что хост защищен брандмауэром, который использует полную проверку пакетов или только проверку входящих соединений ( SYN -флаг). В следующем примере используется SYN сканирование только 80 порта, открытого на машине 192.168.1.40. Там также сообщается, что порты 21 и 22 фильтруются и nmap не может определить их статус. ACK -сканирование сообщает нам, что все порты на машине открыты, в то время как SYN -сканирование говорит о том, что производится фильтрация! Это означает, что SSH и FTP на машине 192.168.1.40 подвергаются фильтрации с использованием неполной схемы; поскольку SYN -пакеты блокируются, а ACK - пропускаются.

# nmap -sS 192.168.1.40

Starting nmap V. 2.54BETA30 ( www.insecure.org/nmap/ )
Interesting ports on (192.168.1.40):
(The 1546 ports scanned but not shown below are in state: closed)
Port        State       Service
21/tcp      filtered        ftp
22/tcp      filtered        ssh
80/tcp      open        http
Nmap run completed - 1 IP address (1 host up) scanned in 8 seconds
# nmap -sA 192.168.1.40

Starting nmap V. 2.54BETA30 ( www.insecure.org/nmap/ )
All 1549 scanned ports on (192.168.1.40) are: Unfiltered

Nmap run completed - 1 IP address (1 host up) scanned in 7 seconds

Помните, как мы использовали hping в лекции "Системные средства с открытым программным кодом: основы" для подмены исходящего IP-адреса, сканирующего порты и, тем не менее, получали результат? Nmap позволяет вам сделать нечто подобное, применяя Idle-сканирование ( -sI ). Для этого необходимо найти хост, который не пропускает никакого трафика и имеет TCP/IP-стек с известным IP ID-инкрементом (например, Windows всегда использует 256). За подробной информацией о таком сканировании обращайтесь к примеру использования hping в лекции "Системные средства с открытым программным кодом: основы" .

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