Сканирование
Если процесс предварительного сбора данных можно сравнить со скрытым наблюдением, цель которого — добыть как можно больше информации, не выдавая себя, то сканирование — это "разведка боем". Цель сканирования — выявить открытые "окна" и "двери". В предварительно собранной информации содержатся сведения об адресах подсетей и отдельных компьютеров, полученных с помощью запросов whois и переноса зоны. Информация, собранная на этом этапе, очень ценна для взломщика, поскольку содержит такие данные, как имена и фамилии сотрудников, номера телефонов, диапазоны IP-адресов, адреса DNS-серверов и почтовых серверов. Теперь можно приступать к выявлению тех компьютеров, которые подключены к сети и достижимы из Internet. Для этого будут использоваться разнообразные средства и приемы, такие как ping-прослушивание, сканирование портов и различные методы, позволяющие автоматизировать выполнение этих задач.
Необходимо отметить, что факт наличия IP-адреса в перенесенной зоне еще не означает, что к соответствующему узлу можно получить доступ через Internet. Необходимо проверить каждый конкретный компьютер в отдельности и выяснить, подключен ли он к Internet и имеются ли на нем порты, находящиеся в состоянии ожидания запросов. Нам приходилось встречать немало неправильно настроенных DNS-серверов, которые предоставляли всем желающим адреса обслуживаемых ими частных сетей (например, 10.10.10.0). Поскольку такие адреса не маршрутизируются по Internet, вы понапрасну будете тратить время, пытаясь связаться с ними. Более подробная информация о том, какие адреса являются маршрутизируемыми, приведена в RFC 1918(http://www.ietf.org/rfc/rfcl918.txt).
Теперь давайте перейдем ко второму этапу сбора информации — сканированию.
Прослушивание сети с помощью утилиты ping
Одним из основных этапов в определении структуры сети является ее автоматизированное прослушивание с помощью утилиты ping по диапазону IP-адресов или адресам подсетей. Цель такого прослушивания — определить, имеется ли у отдельных компьютеров подключение к Internet. Утилита ping отправляет пакеты ICMP ECHO (тип 8) указанному компьютеру и ожидает ответного пакета ICMP ECHO_REPLY (тип 0). Получение такого ответа говорит о том, что компьютер в данный момент подключен к Internet. Хотя при некоторой настойчивости с помощью утилиты ping можно определить количество постоянно подключенных к Internet компьютеров в небольшой и даже средней сети, ручной перебор сетевых адресов будет малоэффективен, если необходимо обследовать корпоративную сеть крупной организации.
Для выполнения ping-прослушивания можно воспользоваться любым из .G® \*-» многочисленных средств, разработанных как для системы UNIX, так и для i-""""" Windows NT. В мире UNIX одним из самых надежных и проверенных методов такого прослушивания является использование утилиты fping. В отличие от других подобных утилит, которые при переходе к тестированию следующего компьютера ожидают ответа на ранее посланный запрос, утилита fping рассылает все запросы одновременно, а затем ожидает ответа сразу от всех узлов. Именно поэтому утилита fping обеспечивает гораздо более высокую скорость прослушивания большого диапазона IP-адресов, чем обычная утилита ping. Утилита fping была написана специально для использования в сценариях оболочек совместно с утилитой gping, которая входит в пакет, распространяемый вместе с fping. Утилита gping генерирует список IP-адресов, передаваемых на вход fping для прослушивания. Листинг использования утилиты gping для сетей класса А, В или С может показаться слегка непонятным, поэтому рассмотрим его подробнее.
[tsunami ]'$ gping
usage: gping aO aN bO bN cO cN dO dN
gping a bO bN cO cN dO dN
gping a b cO cN dO dN
gping a b с dO dN
gping abcd
В качестве параметров утилите gping необходимо передать диапазон IP-адресов. На основании этого диапазона будет генерироваться листинг, в котором адреса перебираются друг за другом. Каждый октет передаваемого IP-адреса должен отделяться от остальных пробелами. Например, если мы собираемся генерировать IP-адреса для сети класса С, нам необходимо просто добавить 254 в качестве последнего параметра. Это позволит утилите перебрать все адреса от 192.168.1.1 до 192.168.1.254. Предположим, что эта сеть не содержит подсетей и использует маску подсети 255.255.255.0. Кроме того, мы не будем проверять адрес самой сети 192.168.1.0 и адрес широковещательной рассылки 192.168.1.255. Следует избегать применения утилиты ping к адресам широковещательной рассылки, поскольку это может привести к отказу, или так называемому состоянию DoS (denial of service), если ответный пакет одновременно будет сгенерирован многими узлами (более подробная информация о том, как установить маску подсети узла, приведена в документации по запросам ICMP). С использованием утилиты gping можно сгенерировать перечень адресов, которые затем будут использоваться утилитой fping.
[tsunami] gping 192 168 1 1 254
192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.5
192.168.1.251
192.168.1.252
192.168.1.253
192.168.1.254
Теперь в нашем распоряжении имеется список всех узлов, которые могут находиться в исследуемой сети класса С. Осталось лишь перенаправить вывод утилиты gping на вход утилиты fping, которая выполнит прослушивание сети и определит, какие компьютеры в данный момент подключены к сети.
[tsunami]? gping 192 168 1 1 254 | fping -a
192.168.1.254 is alive
192.168.1.227 is alive
192.168.1.224 is alive
192.168.1.3 is alive
192.168.1.2 is alive
192.168.1.1 is alive
192.168.1.190 is alive
Параметр -а утилиты fping предназначен для включения режима, в котором выводится информация обо всех активных в данный момент компьютерах сети. Если нужно, утилита может выводить и информацию об именах узлов. Этот режим включается с помощью параметра -d. По нашему мнению, параметр -а лучше всего использовать в сценариях оболочки, а параметр -d — при исследовании сети на предмет поиска определенных узлов. Среди других параметров необходимо упомянуть -f, который позволяет вводить адреса из заранее подготовленного файла, а также -h, с помощью которого можно получить перечень всех параметров утилиты и режимов их использования. Еще одной утилитой, о которою затронем, является утилита nmap, созданная Fyodor. Более подробно эта утилита будет рассматриваться ниже, однако будет нелишним упомянуть, что, кроме всех остальных возможностей, данная утилита также позволяет выполнить прослушивание сети.
Что касается приверженцев Windows, они также не остались без внимания. В частности, имеется такая бесплатная утилита, как Finger, написанная хакерами из группы Rhino9. Эта утилита является одной из самых быстрых в своем классе. Как и fping, утилита Finger одновременно рассылает несколько ICMP-пакетов ECHO, а затем ожидает поступления ответов. Кроме того, Finger позволяет также получать имена узлов и сохранять результаты своей работы в файле. Такой же скоростью, как и Finger, обладает коммерческий продукт Ping Sweep, предлагаемый компанией SolarWinds (wwwsolarwinds.net). Поразительная скорость работы Ping Sweep объясняется тем, что данная программа позволяет устанавливать время задержки между передаваемыми пакетами (delay time). Установив это значение равным 0 или 1, можно просканировать всю сеть класса С и получить имена ее узлов менее чем за 7 секунд. Однако при использовании этих средств соблюдайте осторожность, поскольку в этом случае можно значительно снизить пропускную способность какого-нибудь низкоскоростного канала, например канала ISDN с пропускной способностью 128 Кбит/с или Frame Relay (не говоря уже о спутниковом или инфракрасном канале).
Среди других утилит Windows, предназначенных для прослушивания сети, можно отметить WS_Ping ProPack (wwwipswitch.com) и Netscan Tools (wwwnwpsw.com). Хотя возможностей этих утилит вполне достаточно для прослушивания небольших сетей, они значительно медленнее Finger и Ping Sweep. Кроме того, не забывайте, что утилиты с графическим интерфейсом, несмотря на удобство их использования, лишают вас возможности их применения в сценариях и автоматизированных процедурах.
Возможно, вы хотите спросить, как поступать, если исследуемый узел блокирует сообщения ICMP? Хороший вопрос. Такой подход зачастую применяется на тех узлах, администраторы которых заботятся о безопасности. Однако, несмотря на блокировку пакетов ICMP, существуют дополнительные средства и методы, позволяющие определить, подключен ли такой узел к сети или нет. Вместе с тем необходимо отметить, что все эти средства оказываются не такими точными и эффективными, как обычные утилиты семейства ping.
Утилита finger — одна из самых быстрых утилит ping-прослушивания, которая к тому же распространяется бесплатно
В тех случаях, когда обмен данными по протоколу ICMP заблокирован, в первую очередь применяется метод сканирования портов (port scanning), который более подробно рассматривается ниже в этой главе. Просканировав стандартные порты каждого потенциального IP-адреса сети, можно определить, какие узлы подключены к сети. Если порт открыт (opened mode) или находится в режиме ожидания (listening mode), значит, по данному адресу находится подключенный к Internet узел сети. Недостатками этого метода являются большие временные затраты и некоторая неопределенность результата (если по какому-то адресу не удалось обнаружить ни одного порта, то это еще не означает, что соответствующий узел не подключен к Internet). Одной из утилит, которые можно использовать для сканирования портов, является nmap. Как уже упоминалось, с помощью этой утилиты можно проводить ICMP-прослушивание, однако этим перечень ее возможностей далеко не исчерпывается. В частности, эта утилита позволяет выполнять так называемое TCP-прослушивание сканированием (TCP ping scan). Данный режим включается с помощью параметра -рт и указания номера порта, например 80. Выбор порта с номером 80 обусловлен тем, что в подавляющем большинстве случаев именно он используется узлами сети для обмена данными через пограничные маршрутизаторы или брандмауэры с компьютерами, расположенными в так называемой демилитаризованной зоне (DMZ — demilitarized zone). При использовании указанного параметра утилита рассылает узлам исследуемой сети пакеты АСК, а затем ожидает поступления пакетов RST, что свидетельствует о том, что узел подключен к Internet.
[tsunami] nmap -sP -PT80 192.168.1.0/24
TCP probe port is 80
Starting nmap V. 2.53
Host (192.168.1.0) appears to be up.
Host (192.168.1.1) appears to be up.
Host shadow (192.168.1.10) appears to be up.
Host (192.168.1.11) appears to be up.
Host (192.168.1.15) appears to be up.
Host (192.168.1.20) appears to be up.
Host (192.168.1.50) appears to be up.
Host (192.168.1.101) appears to be up.
Host (192.168.1.102) appears to be up.
Host (192.168.1.255) appears to be up.
Nmap run completed (10 hosts up) scanned in 5 seconds
Как видно из приведенного выше листинга, этот метод определения подключенных к Internet узлов очень эффективен, даже если на них блокируется передача пакетов ICMP. С помощью утилиты nmap имеет смысл провести несколько подобных проверок, тестируя такие стандартные порты как SMTP (25), POP (110), AUTH (110), IMАР (143) или другие порты, которые, по вашим сведениям, могут быть уникальными на каком-либо компьютере исследуемой сети.
Еще одной утилитой, специально предназначенной для TCP-прослушивания, является утилита hping. По возможностям она даже превосходит утилиту nmap. Утилита hping позволяет пользователям управлять параметрами протокола TCP, что может обеспечить проникновение отправляемых пакетов даже через некоторые устройства управления доступом. Так, установив порт назначения с помощью параметра -р, можно обойти некоторые устройства управления доступом точно так же, как это было сделано с применением утилиты traceroute. Поэтому утилита hping может с успехом служить не только для TCP-прослушивания, но и преодолевать преграды некоторых устройств управления доступом благодаря возможности фрагментации пакетов.
[tsunami] hping 192.168.1.2 -S -p 80 -f
HPING 192.168.1.2 (ethO 192.168.1.2):
S set, 40 data bytes
60 bytes from 192.168.1.2:
flags=SA seq=0 ttl=124 id=17501 win=0 time=46.5
60 bytes from 192.168.1.2:
flags=SA seq=l ttl=124 id=18013 win=0 time=169.1
В некоторых случаях простые устройства управления доступом не могут корректно обрабатывать фрагментированные пакеты, что позволяет им проходить через такие устройства и достигать интересующего взломщика адреса. Обратите внимание, что в случае, когда порт открыт, возвращаются флаги TCP SYN (s) и дек (А). Утилиту hping очень легко использовать в сценариях оболочки с параметром счетчика пакетов -cN, где N — это количество пакетов, которые нужно отправить в Internet, прежде чем переходить к выполнению следующей команды сценария. Хотя данный метод и не обладает такой скоростью, как описанные выше методы ICMP-прослушивания, в некоторых случаях только он может помочь выяснить конфигурацию сети.
Последним из средств прослушивания рассмотрим утилиту icmpenum. Эту утилиту удобно использовать для определения архитектуры сети. Утилита icmpenum позволяет быстро выявить подключенные к сети компьютеры, передавая стандартные ICMP-пакеты ECHO, а также ICMP-запросы TIME STAMP REQUEST и INFO. Если входные пакеты ECHO не пропускаются пограничным маршрутизатором или брандмауэром, то подключенные узлы можно по-прежнему идентифицировать с помощью альтернативных пакетов ICMP.
[shadow] icmpenum -i2 -с 192.168.1.0
192.168.1.1 is up
192.168.1.10 is up
192.168.1.11 is up
192.168.1.15 is up
192,168.1.20 is up
192.168.1.103 is up
В приведенном примере сеть класса С (192.168.1.0) была протестирована с использованием ICMP-запроса TIME STAMP REQUEST. Однако реальная мощь утилиты icmpenum заключается в возможности идентификации узлов с помощью ложных пакетов, что позволяет избежать обнаружения злоумышленника. Это возможно благодаря тому, что утилита icmpenum позволяет генерировать ложные пакеты с использованием параметра -s и пассивно ожидать отклика при указании параметра -р.
Подводя итог, можно отметить, что IСМР- или TCP-прослушивание позволяет точно установить, какие компьютеры сети подключены к Internet. Так, в рассматриваемом примере мы установили, что из 255 потенциальных адресов сети класса С к Internet подключены лишь несколько компьютеров. Выявленные узлы становятся предметом первоочередного внимания в дальнейших исследованиях. Таким образом, мы значительно сузили область поиска, что позволяет сэкономить время и силы для более эффективных действий.
Рассмотрим Типы сканирования
Прежде чем перейти к описанию конкретных средств, используемых для сканирования портов, необходимо уделить немного времени обзору методов сканирования, известных в настоящее время. Многочисленные приемы сканирования реализованы в утилите nmар.
TCP-сканирование подключением (TCP connect scan). При таком типе сканирования осуществляется попытка подключения по протоколу TCP к интересующему нас порту с прохождением полной процедуры согласования параметров (handshake), состоящей в обмене сообщениями SYN, SYN/ACK и АСК. Попытки такого сканирования очень легко выявляются.
TCP-сканирование с помощью сообщений SYN (TCP SYN scan). Этот метод называется также сканированием с незавершенным открытием сеанса (half-open scanning), так как при его использовании полное TCP-соединение не устанавливается. Вместо этого на исследуемый порт отправляется сообщение SYN. Если в ответ поступает сообщение SYN/ACK, это означает, что данный порт находится в состоянии LISTENING. Если же ответ приходит в виде сообщения RST/ACK, то, как правило, это говорит о том, что исследуемый порт отключен. Получив ответ, компьютер, выполняющий сканирование, отправляет исследуемому узлу сообщение RST/ACK, поэтому полное соединение не устанавливается. Этот метод обеспечивает более высокую скрытность по сравнению с полным подключением. Многие системы не регистрируют такие попытки, поэтому они довольно часто могут оставаться незамеченными.
• TCP-сканирование с помощью сообщений FIN (TCP FIN scan). В этом случае исследуемой системе отправляется пакет FIN. Согласно документу RFC 793 (http://www.ieff.org/rfc/rfc0793.txt), в ответ узел должен отправить пакет RST для всех закрытых портов. Данный метод срабатывает только для стека протоколов TCP/IP, реализованного в системе UNIX.
• TCP-сканирование по методу "рождественской елки" (TCP Xmax Tree scan). При использовании данного метода на исследуемый порт отправляются пакеты FIN, URG и PUSH. Согласно документу RFC 793, исследуемый узел в ответ должен отправить сообщения RST для всех закрытых портов.
• TCP нуль-сканирование (TCP Null scan). Этот метод состоит в отправке пакетов с отключенными флагами. Согласно RFC 793, исследуемый узел должен ответить отправкой сообщения RST для всех закрытых портов.
• TCP-сканирование с помощью сообщений АСК (TCP ACK scan). Этот метод позволяет получить набор правил, используемых брандмауэром. Такое сканирование поможет определить, выполняет ли брандмауэр простую фильтрацию пакетов лишь определенных соединений (пакетов с установленным флагом АСК) или обеспечивает расширенную фильтрацию поступающих пакетов.
• TCP-сканирование размера окна (TCP Windows scan). Такой метод позволяет выявить открытые, а также фильтруемые/нефильтруемые порты некоторых систем (например, AIX и FreeBSD), в зависимости от полученного размера окна протокола TCP.
• TCP-сканирование портов RFC (TCP RFC scan). Этот метод применим только для систем UNIX и используется для выявления портов RFC (Remote Procedure Call — удаленный вызов процедур), связанных с ними программ и их версий.
А UDP-сканирование (UDP scan). Данный метод заключается в отправке на исследуемый узел пакетов по протоколу UDP. Если в ответ поступает сообщение о том, что порт ICMP недоступен (ICMP port unreachabie), это означает, что соответствующий порт закрыт. С другой стороны, если такого сообщения нет, можно предположить, что данный порт открыт. В связи с тем, что протокол UDP не гарантирует доставки, точность данного метода очень сильно зависит от множества факторов, влияющих на использование системных и сетевых ресурсов. Кроме того, UDP-сканирование — очень медленный процесс, что особенно сказывается при попытках сканирования устройств, в которых реализован мощный алгоритм фильтрации пакетов. Поэтому, планируя использовать UDP-сканирование, приготовьтесь к тому, что результаты могут оказаться ненадежными.
Некоторые реализации IP-протокола обладают одним неприятным свойством: пакеты RST отправляются обратно для всех сканируемых портов независимо от того, находятся ли соответствующие порты в режиме ожидания запросов. Учитывайте этот факт при использовании описанных методов. Однако в то же время сканирование подключением и сканирование с использованием сообщений SYN могут применяться для всех узлов.
Запросы IСМР
Если говорить о возможностях протокола ICMP для сбора информации о сети, то прослушивание с помощью утилиты ping (или, другими словами, с помощью пакетов ECHO, пересылаемых по протоколу ICMP), — это только верхушка айсберга. Просто обмениваясь пакетами ICMP с интересующей вас системой, о ней можно получить любую информацию. Например, с помощью таких утилит UNIX, как icmpquery или icmpush, можно узнать системное время удаленного узла (т.е. часовой пояс, в котором он находится). Для этого нужно отправить по протоколу ICMP сообщение типа 13 (TIMESTAMP). Точно так же, обратившись к определенному устройству с ICMP-запросом типа 17 (ADDRESS MASK REQUEST), можно узнать маску подсети. Знание маски подсети сетевой карты позволяет определить все существующие подсети. Например, используя маску подсети, усилия можно сосредоточить на определенной подсети и избежать необходимости обращения к адресам рассылки широковещательных сообщений. Утилита icmpquery позволяет запрашивать как системное время, так и маску подсети.
icmpquery <query> [-B] [-f fromhost] [-d delay] [-T time] targets
Здесь параметр query принимает одно из следующих значений:
-t : ICMP-запрос системного времени (по умолчанию);
-m : ICMP-запрос маски подсети.
delay — задержка между пакетами в миллисекундах,
targets — список имен или адресов исследуемых узлов,
time — время в секундах, в течение которого следует ожидать
отклика. По умолчанию используется значение 5 с.
-В — включение режима широковещательной рассылки. В этом режиме
утилита ожидает в течение периода, определенного параметром
time, а затем выводит отчет о поступивших ответах.
Если вы используете модем, установите
значения параметров -d и -Т большими,
чем установленные по умолчанию.
Например, чтобы с помощью icmpquery узнать системное время маршрутизатора, воспользуйтесь следующей командой.
[tsunami] icmpquery -t 192.168.1.1
192.168.1.1 : 11:36:19
Запрос на получение маски подсети выглядит следующим образом.
[tsunami] icmpquery -m 192.168.1.1
192.168.1.1 : OxFFFFFFEO
Далеко не все маршрутизаторы/узлы отвечают на ICMP-запросы TIMESTAMP или NETMASK. Поэтому с помощью утилит icmpquery и icmpush на различных узлах можно получить разные результаты.