Основной темой данной части будет сканирование и сбор данных о хостах в сети. Рассмотрим основные методы определения наличия рабочих хостов и сервисов в сети. Первую часть можно прочитать здесь.

Сканирование

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

Каждый протокол, который может использоваться для передачи информации, хранит данные в двух частях. Первая — заголовок, на основании которого работают служебные алгоритмы протокола. Здесь могут быть перечислены настройки соединения, описаны основные правила для обработки и передачи информации. Схематично эти части можно представить так:

Самый распространенный протокол, который позволяет производить сканирование и может быть обнаружен практически во всех современных сетях, это протокол TCP. Протокол является одним из основополагающих протоколов самой популярной модели TCP/IP. Протокол позволяет настраивать соединение и контролировать соединение на протяжении всего взаимодействия. И именно данный механизм контроля состояния соединения используется большинством способов сканирования. На сегодняшний день известны следующие варианты сканирования с помощью TCP протокола в порядке убывания эффективности:

  1. Connect Scan — обычный алгоритм настройки соединения, реализуется сетевыми функциями операционной системы.

  2. SYN Scan — сканирование, которое основано на отправке пакетов, содержащих только один установленный флаг контроля соединения — SYN.

  3. ACK Scan — сканирование, которое основано на отправке пакетов, содержащих только один установленный флаг контроля соединения — ACK.

  4. Maimon — сканирование, которое основано на отправке пакетов, содержащих несколько установленных флагов контроля соединения — FIN/ACK.

  5. Null scan — сканирование, которое основано на отправке пакетов не содержащих ни одного флага, который отвечает за контроль соединения.

  6. FIN scan — сканирование, которое основано на отправке пакетов, содержащих только один установленный флаг контроля соединения — FIN.

  7. Xmas Scan — сканирование, которое основано на отправке пакетов, содержащих на каждый запрос разные флаги из всех доступных для контроля соединения.

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

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

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

Попробуем провести несколько сканирований.

TCP сканирование

Для тестов будем использовать виртуальный стенд на базе VBox, топология сети будет построена на основании типа соединения Nat Network. По сути, это обычная сеть с Gateway, который может обращаться в сеть. В сети будут находиться 3 хоста — Kali Linux, Server Debian 20.04 и Windows 10. Для проведения сканирования будем использовать:

rustscan

Сканер написанный на языке программирования Rust, по заверениям авторов является одним из самых быстрых бесплатных сканеров, доступных на сегодняшний день. И отчасти это правда, но на самом деле этот сканер — просто обертка над nmap. Из заявленных фич:

  • сканирование всех портов за 3 секунды;

  • поддержка движка для автоматизации процесса сканирования, можно перенапрявлять результаты в Nmap;

  • адаптивное обучение для улучшения процесса сканирования;

  • возможность работать с адресами введенными в различных форматах IPv6, CIDR и т.д.

Из неочевидных недостатков стоит привести ограничение — пулами и CIDR сканировать с помощью этого инструмента не получится. Будет вываливаться ошибка `thread 'main' panicked at 'Too many open files.` Решить эту проблему можно путем использования флага -b, но в итоге получится сканировать только по одному адресу за один запуск.

Сканер можно установить различными способами, как готовый пакет или как Docker image. Проведем сканирование сети:

Трафик в таком случае выглядит вот так:

Инструмент может создавать высокую нагрузку на сеть. Основные запросы, выполняемые по умолчанию, это запросы SYN. Поэтому блокировать его действия можно достаточно просто, например, средствами операционной системы через файерволл. Для iptables правила могут выглядеть вот так:

IPTABLES -A INPUT -p tcp –tcp-flags SYN,ACK SYN,ACK -m state –state NEW -j DROP

IPTABLES -A INPUT -p tcp –tcp-flags ALL NONE -j DROP

masscan

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

Инструмент полезен для выявления доступных хостов в сети. Запустить его можно вот так:

Трафик, который генерирует инструмент, содержит большое количество пакетов с установленным SYN флагом.

Для блокирования такой активности можно использовать те же правила на файерволле, которые предоставлены в разделе rustscan.

nmap

Самый популярный инструмент для сканирования и, пожалуй, самый старый среди доступных. Он может быть запущен для сканирования всеми способами, которые были описаны в разделе `Сканирование`. Для этого можно использовать флаг, который принимает в качестве значения первую букву в названии типа сканирования. Например, SYN сканирование можно выполнить вот так:

А трафик для этих типов сканирования выглядит вот так:

SYN Scan и Connect Scan, в nmap это объединенные типы сканирования.

Maimon Scan

Ack Scan

Null Scan

Fin Scan

Xmas Scan

Большую часть типов сканирований можно перекрыть, если воспользоваться вот такими правилами для файерволла:

IPTABLES -A INPUT -p tcp –tcp-flags SYN,FIN SYN,FIN -j DROP

IPTABLES -A INPUT -p tcp –tcp-flags SYN,RST SYN,RST -j DROP

IPTABLES -A INPUT -p tcp –tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP

IPTABLES -A INPUT -p tcp –tcp-flags FIN,RST FIN,RST -j DROP

IPTABLES -A INPUT -p tcp –tcp-flags ACK,FIN FIN -j DROP

IPTABLES -A INPUT -p tcp –tcp-flags ACK,PSH PSH -j DROP

IPTABLES -A INPUT -p tcp –tcp-flags ACK,URG URG -j DROP

naabu

Сканер, написанный на языке программирования Go. Упрощает процес сканирования и по сути использует только один тип сканирования — SYN Scan. Запустить можно так:

Трафик соответственно будет такой:

Защита от такого сканирования возможна с использованием правил из пункта rustscan.

В следующей статье рассмотрим оставшиеся методы атак и методов защиты от них.


Автор статьи — Александр Колесников. А мы приглашаем всех желающих на открытое занятие «SSL сертификаты», которое состоится в OTUS 21 апреля. На этом уроке мы узнаем, что такое SSL сертификат, как используется и где применяется; а также развернем CA сервер и создадим цепочку доверенных сертификатов для защиты веб-приложения. Регистрация по ссылке.

Комментарии (3)


  1. VovaQbinskiy
    07.04.2022 07:52

    Спасибо за пост

    Жду следующую часть:)


  1. VladislavVladimir
    07.04.2022 10:05

    жду следующие статьи!


  1. damprog
    07.04.2022 11:04

    вот так понатыкают эти безопасники правил в иптаблесах, потом интернеты тормозят!