Решив отдать должное автору статьи "Разведка из открытых источников, часть 2" Андрею Бирюкову я публикую еще одну часть из его журнальной серии "Системный администратор". 3-я часть посвящена технической стороне разведки, а именно сканированию сети.
Сканирование сети является неотъемлемой частью сетевых атак. Для успешной защиты необходимо понимать, как осуществляется обнаружение узлов в сети. Мы проведем исследование тех служб, которые применяются в сети. Сначала рассмотрим, как злоумышленник может идентифицировать работающие узлы. Затем перейдем к тому, как определить, какие службы запущены на данных машинах. Для идентификации активных узлов в локальной сети можно использовать различные протоколы сетевого и транспортного уровня, такие как ICMP, UDP и TCP. Но обо всем по порядку.
ICMP как простой инструмент исследования сети
Протокол ICMP служит для выявления проблем, связанных с сетевым уровнем. Как правило,
в локальных сетях его не блокируют, так как он часто используется самими системными
администраторами для поиска неполадок в сети.
Прежде всего рассмотрим основные принципы работы данного протокола. Сообщения ICMP передаются в виде IP- датаграмм, то есть к ним прибавляется заголовок IP.
Существует несколько типов сообщений ICMP, каждый имеет свой формат, при этом все они содержат следующие три поля:
- 8-битного целого числа, обозначающего тип сообщения (TYPE);
- 8-битного поля кода (CODE), который конкретизирует назначение сообщения;
- 16-битного поля контрольной суммы (CHECKSUM).
Все типы сообщений ICMP можно условно поделить на две группы.
- Сообщения об ошибках (например, Destination Unreachable).
- Запросы и ответы (например, Echo Request и Echo Reply).
Начнем с рассмотрения сообщений об ошибках. Они
содержат заголовок и первые 64 бита данных пакета IP, при передаче которого возникла ошибка. Это делается для того, чтобы
узел-отправитель смог более точно проанализировать причину ошибки, так как все
протоколы прикладного уровня стека TCP/IP содержат наиболее важную информацию
для анализа именно в первых 64 битах своих сообщений. Для сообщений об ошибках
задействовано поле кода. В основном для исследования сети используются Echo Reply, Echo Request и Timestamp.
Наилучшим методом определения доступности узла
является посылка сообщения ICMP Echo (Туре 8). Если система работает и отсутствует
фильтрация графика данного типа, то в ответ придет сообщение ICMP Echo Reply (Type 0).
Идентификация (то есть обнаружение) сетевых устройств
с помощью протокола ICMP может быть выполнена двумя способами.
- посылкой запроса, получением ответа;
- вызовом ситуации ошибки, получением сообщения об ошибке.
В основу идентификации заложен следующий
принцип. Узел, отправляющий ICMP-запрос, устанавливает значения полей Identifier, эти значения позволяют определить ответы, пришедшие от
разных узлов. А для того, чтобы отличить несколько ответов, пришедших от
одного узла, используется поле Sequence Number. В поле Code записывается ноль, поле данных произвольно
(например, алфавит). Отвечающая сторона должна заменить значение поля Туре на
0 и отправить датаграмму обратно.
Для выполнения обнаружения узла обычно
используется утилита ping, входящая в состав большинства ОС. В качестве
параметра ping указывается IP/имя, и в результате получаем ответ удаленной
системы. Однако у нее есть существенный недостаток - все узлы опрашиваются
последовательно, что заметно увеличивает продолжительность опроса.
Обращение сразу
к нескольким узла (диапазона) с использованием ICMP-запросов (Echo) называется ICMP Sweep или Ping Sweep. Для исследования большой сети потребуется утилита, способная посылать ICMP-запросы параллельно. Однако, говоря о Ping Sweep, стоит отметить, что из-за параллельной
отправки множества ICMP-запросов системы обнаружения атак легко
определят такое сканирование. Рассмотрим некоторые из них в качестве примера.
Утилита fping
Утилита fping позволяет производить исследование сети с помощью протокола ICMP, также возможен параллельный опрос сразу нескольких узлов, список которых
может быть задан пользователем или получен из файла.
Синтаксис:
fping [опции ] [ узлы... ]
Список наиболее используемых опций:
-с - количество
отправляемых пакетов к каждому из узлов;
-bn - количество
байт в отправляемом пакете;
-g - указание списка сканируемых узлов;
-f - указание
файла со списком сканируемых узлов.
Сканирование сети класса С (192.168.1.0/24.) можно
осуществить с помощью задания маски:
fping -g 192. 168. 1. 0/24
а можно с помощью задания диапазона сканируемых
адресов:
fping -g 192.168.1.1 192.168.1.254
Также с помощью данной утилиты можно
осуществить сканирование с использованием посылки одного пакета:
fping -g 192.168.2.1 192.168.2.254 -с 1 > alive-hosts
Такой способ
сканирования менее заметен для систем обнаружения вторжений и анализаторов
трафика.
Утилита Nmap
Широко известная утилита Nmap также может быть использована для опроса устройств. Вообще она может применяться
для исследования сетевых служб не только с помощью ICMP, поэтому мы еще неоднократно будем к ней возвращаться.
Вот пример ее использования для сканирования
все той же сети 192.168.2.0/24:
nmap -sP -PI 192.168.2.1-254
где:
ключ sP - это указание
производить посылку запросов ICMP Echo.
ключ PI - это отключение АСК-сканирования (оно включено по
умолчанию).
Broadcast ICMP
Еще одним способом определения доступности множества узлов
является посылка запроса ICMP Echo по широковещательному адресу или адресу сети.
Данный прием именуется Broadcast ICMP.
Если предыдущие способы исследования сети с помощью ICMP требовали использования специальных утилит, то Broadcast ICMP можно реализовать с помощью команды ping. Например:
ping
192.168.1.255
или
ping 192.168.1.0
Такой запрос будет получен всеми узлами сети, и
теоретически ответ от каждого из них должен прийти узлу, пославшему запрос.
На практике машины под управлением ОС Windows на такие запросы не откликаются. Зато ОС семейства UNIX и некоторые модели сетевого оборудования (например, бюджетные Wi-Fi-роутеры) могут ответить на запросы, где в качестве адреса
получателя указан широковещательный адрес или адрес сети.
В частности, у меня в сети на такой запрос ответили машины
под управлением Debian Linux, файловый сервер Synology и Wi-Fi-роутер Asus.
Но и здесь исследователю сети не стоит забывать о том, что
системы обнаружения атак обычно фиксируют такие запросы ICMP Echo, как атака smurf. Действительно, подобный запрос, будучи запущен в цикле, порождает
большое количество ответов, направленных на один узел, что может создать
ситуацию отказа в обслуживании.
Еще одним более надежным средством исследования
с помощью ICMP являются сообщения об ошибках.
ICMP-пакеты,
сообщающие об ошибках
ICMP-сообщения об ошибках отправляются тогда, когда не удалось выполнить
какое-либо действие в сети, например, доставить пакет по назначению. В определенных
ситуациях это может оказать существенную помощь при выявлении работающих в
сети машин.
Приведу небольшой пример. Сообщение ICMP Destination Unreachable (Port Unreachable), полученное в ответ на сетевой пакет,
указывает на то, что требуемый порт на узле закрыт, но сам узел доступен,
поскольку ответ нам все-таки пришел.
Использование
ICMP-сообщений
об ошибках для обнаружения устройств сводится к вызову сообщения об ошибке на
тестируемом узле. Поскольку это осуществляется, как правило, с помощью других
протоколов (не ICMP), данные методы
упоминаются далее. Начнем с использования UDP.
Исследование с помощью UDP
Метод определения доступности узла с использованием
протокола UDP называется UDP Discovery. Если в ответ на пакет было получено
сообщение ICMP Destination Unreachable (Port Unreachable), это означает, что узел доступен (и порт,
указанный в UDP-пакете, закрыт).
Если ответ от узла не получен, возможны следующие варианты:
- узел выключен или недоступен;
- фильтрация трафика;
- указанный в UDP-пакете порт открыт.
Использование протокола UDP для обнаружения устройств неэффективно в силу следующих причин:
- Во-первых, это высокая степень фильтрации UDP-трафика. Так как из-за архитектурных особенностей (отсутствие механизма
подтверждения доставки) UDP используют мало служб (самыми известными
являются DNS, SNMP, Syslog), то этот
протокол часто фильтруется в сети.
- Вторым недостатком
использования UDP является
непредсказуемое поведение системы при получении UDP-пакета на открытый порт.
Дело в том, что многие сканеры отправляют при сканировании
пустые пакеты. Допустим, такой пакет отправили на 53-й порт сервера DNS. Получив его на открытый порт, система попытается прочитать содержимое.
При этом на уровне приложений будут ожидаться данные определенного формата
(команды, параметры и т.д.). Но так как там никаких данных нет, сервис вполне
может повести себя не совсем корректно или, что еще хуже для исследующего,
отразить данный инцидент в своих журналах событий и уведомлениях
администратору.
Но некоторые разработчики смогли обойти второй недостаток UDP-сканирования. В сканере Retina этот метод реализован с учетом указанных
недостатков. На данные порты отправляется не пустой UDP-пакет, а осмысленный запрос, на который должен прийти ответ. Реакция
будет в любом случае (открыт порт или закрыт), что повышает достоверность
этого метода при идентификации сетевых объектов.
В следующем примере используется утилита Nmap:
Nmap -sU -р <номер UDP-nopтa> <узел>
Также для обнаружения узлов можно воспользоваться уже
знакомой нам утилитой hping.
Например, для проверки определенного порта на узле
192.168.10.30 необходимо выполнить:
hping -2 192.168.10.30 -с 1 -р 137 -п
Получение
сообщения Port Unreachable будет означать, что узел
включен, но порт 137 на нем закрыт.
Рассмотрев протокол транспортного уровня UDP, перейдем к TCP.
Протокол TCP часто используется различными службами и приложениями. По сути, в нашем
случае это основной инструмент исследования сети, т.к. средства межсетевого
экранирования и системы обнаружения вторжений, как правило, разрешают отправку
пакетов на наиболее распространенные сетевые порты. Например, вряд ли где-то
будут запрещать электронную почту или веб.
Метод определения доступности узла с
использованием протокола TCP называется TCP ping.
Критичным является выбор значений некоторых полей:
- Source Port.
- Destination Port.
- Сочетание флагов (поле Flags).
Выбор
порта источника зависит от фильтрации трафика различного типа, а выбор порта
получателя осуществляется также из соображений возможной фильтрации (обычно
это порты 21, 22, 23, 25, 80, последний - HTTP - это наиболее
распространенный вариант). Но основным при исследовании сети с помощью TCP является выбор правильного
сочетания флагов.
hping
<узел> [опции]
Список наиболее используемых опций приведен далее:
-с - количество
отправляемых пакетов
-0 - режим RAW IP
-1 - режим ICMP
-2 - режим UDP
По умолчанию используется режим TCP:
-s - порт источника
-d - порт получателя
Флаги TCP:
-F - fin флаг FIN
-S - syn флаг SYN
-R - rst флаг RST
-P - push флаг PUSH
-А - аск флаг АСК
-U-urg флаг URG
-X - xmas флаг X неиспользуемый (0x40)
-Y - ymas флаг Y неиспользуемый (0x80)
Посылка TCP-пакета с установленным флагам SYN может быть
использована для определения доступности узла следующим образом: если в ответ
на такой запрос пришел пакет с установленными в заголовке флагами SYN - АСК или RST, то узел доступен. Если же ответ не приходит,
то узел либо недоступен, либо данный тип трафика фильтруется.
Пример посылки пакета с установленным флагом SYN на 80-й порт указанного узла с использованием hping:
hping <узел> -S -р 80 -с 1
Поскольку ответ приходит в любом случае (открыт
порт или закрыт), этот способ определения доступности узла довольно эффективен
(особенно в условиях фильтрации ICMP). Данный метод и называют TCP ping.
Возможны варианты сканирования и с помощью
других флагов, однако здесь возникает ряд сложностей. При получении такого
пакета система может неоднозначно на него отреагировать, т.к. реализация стека
TCP/IP в разных, особенно старых, ОС может существенно отличаться. Кроме
того, пакетные фильтры с технологией Stateful Inspection считают такие пакеты ошибочными и «молча» отбрасывают их.
В качестве
примера приведу сканирование утилитой hping с
использованием флагов SYN+ACK и АСК. SYN-ACK:
hping <узел> -S -А -р 80 -с 1
АСК:
hping <узел> -А -р 80 -с 1
Вообще TCP-сканирование является достаточно мощным инструментом при исследовании
сети, поэтому стоит очень ответственно подойти к настройке средств обнаружения
вторжений для борьбы с ним.
Исследование с помощью IP
Помимо применения протоколов ICMP, UDP и TCP, при исследовании сети можно также воспользоваться протоколом IP. Основа методов обнаружения узлов с помощью протокола IP - посылка ошибочных IP-датаграмм. При этом ошибка вносится в заголовок IP. Признаком доступности узла служит получение ICMP- сообщения об ошибке. Для работы с пакетами на уровне заголовков IP можно использовать рассмотренную выше утилиту hping.
Посылки
фрагмента IР-датаграммы
Суть метода в
том, что отправляется первый фрагмент IP- датаграммы и
не посылаются остальные. В ответ должно прийти сообщение ICMP об ошибке Fragment Reassembly Time Exceeded (Type=l1, Code=l).
Пример с
использованием hping:
hping 192.0.2.254 -с 1 -х -р 80
-S -V –D
Здесь посылается SYN-запрос на 80-й порт узла с указанием, что это не последний фрагмент (опция
-х). Дополнительно включены режимы для вывода максимально подробной
информации (опции -V и -D).
В случае если в
ответ было получено сообщение Fragment Reassembly Time Exceeded, можно смело утверждать, что исследуемый узел
включен.
В заголовке
посылаемой IP-датаграммы указывается ошибочная длина. В ответ должно
прийти сообщение Parameter Problem Message (Туре=12, Code=2). Это сообщение также является признаком активности исследуемого узла.
В отправляемой IP-датаграмме указывается тип протокола, не поддерживаемый удаленной
системой. В ответ приходит сообщение ICMP Protocol Unreachable (Туре=3, Code=2). Пример с использованием hping:
hping <узел> -0 -Н 255 -с 1
В данном случае посылается один пакет с типом протокола
255 (ключ -0 в данном случае означает работу с протоколом IP). Получение сообщений с
указанными выше типами ошибок будут свидетельством того, что данный узел
включен.
В
локальной сети довольно эффективный способ обнаружения узлов - посылка
запросов ARP. При этом
узел ответит в любом случае, даже если блокируется весь трафик. В качестве
примера программы, использующей такую технику выявления доступных узлов, можно
привести утилиту ettercap.
Вот так выглядит сканирование
сети с помощью утилиты arping:
nmap –SP –PA
192.168.1.2 -n –vv –oN results
No comments:
Post a Comment
А что вы думаете по этому поводу?