Как просканировать большую сеть

Как просканировать большую сеть

Если диапазон внешних IP-адресов около 10 тысяч единиц или меньше, nmap прекрасно справляется со своей работой в случае со всеми вышеперечисленными нуждами. Однако в больших компаниях, владеющих сотнями тысяч IP-адресов, задача определения «живых» хостов за разумное время (например, в течение нескольких часов) усложняется.

Автор: Jeff McJunkin

Часто при выполнении пентестов клиент просит меня просканировать внешнюю сеть (надеюсь, что ваши клиенты хорошо осведомлены о рисках, и помимо сканирования внешней сети дадут вам доступ во внутреннюю сеть, но эта тема отдельной статьи). В случае с небольшими организациями я в основном использую nmap на всех этапах сканирования. Когда речь заходит о больших сетях, попробуем вначале разделить процедуру сканирования на отдельные этапы:

  1. Общее сканирование сети: поиск адресов IPv4, которые имеют рабочие службы (поиск «живых» хостов).
  2. Сканирование портов: поиск открытых TCP и UDP портов на целевых системах.
  3. Определение версии: определение версии служб и протоколов, использующих открытые TCP и UDP порты.

Если диапазон внешних IP-адресов около 10 тысяч единиц или меньше, nmap прекрасно справляется со своей работой в случае со всеми вышеперечисленными нуждами. Однако в больших компаниях, владеющих сотнями тысяч IP-адресов, задача определения «живых» хостов за разумное время (например, в течение нескольких часов) усложняется. По умолчанию nmap отсылает несколько пробных запросов. В случае неудачи хост помечается как «неживой», и последующие запросы не отсылаются. Мы можем не делать общее сканирование сети при помощи опции –Pn, однако затем nmap начнет проверять все указанные порты для каждого IPv4-адреса. Поскольку на большинстве внешних IPv4-адресов работающие службы отсутствуют, проверка большой сети может занять недели, месяцы или даже годы. Таким образом, наша задача - найти эффективный способ поиска IP-адресов с работающими службами. Далее найденный список уже будет детально проверяться на предмет конкретных портов и версий протоколов.

У nmap возникают сложности с большим диапазоном адресов, поскольку эта утилита работает по принципу синхронного сканнера, отслеживает запросы на соединение и ожидает ответа. Если на TCP-запрос на соединение (SYN) не приходит ответа, время ожидания истекает, и nmap присваивает службе статус filtered (находится под фильтром). Nmap параллельно запускает несколько пробных запросов, однако службы со статусом filtered (и неактивные IP-адреса) сильно замедляют общий процесс.

Помимо утилит, работающих с использованием синхронизации, одной из которых является nmap, существует несколько асинхронных сканеров, которые не отслеживают соединения: scanrand, ZMap и мой любимый masscan.
Я предпочитаю пользоваться masscan по нескольким причинам. Первая, и самая главная причина заключается в том, что синтаксис masscan во многом схож с nmap. Во-вторых, masscan является одним из самых быстрых даже среди асинхронных сканеров. При наличии правильных сетевых интерфейсов и драйверов эффективность этого сканера ограничивается шириной вашего канала. При использовании двух 10 гигабитных Ethernet-адаптеров, выпускаемых Intel, можно просканировать весь диапазон IPv4-адресов за шесть минут, когда ежесекундно будут передаваться 10 миллионов пакетов.  

Вначале рассмотрим базовый синтаксис masscan в применении к сканированию TCP-портов в большом диапазоне сети (например, 16 миллионов IPv4-адресов, используемых Apple).

$ sudo masscan 17.0.0.0/8 -p0-1023

Скорость сканирования

По умолчанию masscan будет отсылать 100 пакетов в секунду. В каждом пакете 18 байт отводится под Ethernet-заголовок, 20 байт под TCP-заголовок и более 20 байт под IPv4-заголовок. В итоге отсылается 5800 байт (или примерно 46 килобайт) в секунду. Поскольку masscan при сканировании портов и хостов распределяет ресурсы равномерно, соответственно, полоса также будет распределяться равномерно. На широкой полосе может случиться непреднамеренная DDOS атака в случае во время сканирования небольшой сети, но при 1-10 мегабит в секунду (или 20 тысячах пакетов в секунду, параметр --rate 20000) проблем возникнуть не должно. На виртуальных машинах скорость может легко доходить до 200 тысяч пакетов в секунду (--rate 200000), что эквивалентно 93 мегабитам в секунду исходящего трафика. Однако следует согласовать с клиентом необходимость использования столь высоких скоростей.

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

Как же мы можем определить, что на определенном IPv4-адресе есть рабочие TCP-службы? Самый простой способ – просканировать 65536 портов (от 0 до 65535). Однако в больших сетях этот метод будет отнимать слишком много времени даже на больших скоростях. Я обычно выбираю 100 или 1000 наиболее популярных портов по версии nmap. Если IP-адрес отвечает на любой SYN-пакет (в ответ посылается либо RST, что свидетельствует о закрытом порте/соединении, или SYN-ACK, что свидетельствует об открытом порте/соединении), то мы сохраняем этот IP-адрес в отдельный список для последующего анализа при помощи nmap или, например, сканера уязвимостей Nessus.
Воспользуемся небольшим трюком для получения списка наиболее популярных портов. Мы будем сканировать нашу собственную систему и выводить на экран перечень портов в XML-формате. В XML-формате отображаются параметры, используемые при сканировании, и, что более важно, выводится перечень портов в удобочитаемой форме. Я выбрал первые 100 портов, но вы можете легко поменять это значение (например, вывести первые 10 или 1000 портов).

$ nmap localhost --top-ports 100 -oX - | grep services
<scaninfo type="connect" protocol="tcp" numservices="100" services="7,9,13,21-23,25-26,37,53,79-81,88,106,110-111,113,119,135,139,143-144,179,199,389,427,443-445,465,513-515,543-544,548,554,587,631,646,873,990,993,995,1025-1029,1110,1433,1720,1723,1755,1900,2000-2001,2049,2121,2717,3000,3128,3306,3389,3986,4899,5000,5009,5051,5060,5101,5190,5357,5432,5631,5666,5800,5900,6000-6001,6646,7070,8000,8008-8009,8080-8081,8443,8888,9100,9999-10000,32768,49152-49157"/>

Далее используем полученный список как значения параметра –p при сканировании целевого диапазона. В качестве примера все также используем сеть компании Apple. Скорость 100000 пакетов в секунду эквивалентна трафику 32 мегабит в секунду.

$ sudo masscan 17.0.0.0/8 -oG apple-masscan.gnmap -p 7,9,13,21-23,25-26,37,53,79-81,88,106,110-111,113,119,135,139,143-144,179,199,389,427,443-445,465,513-515,543-544,548,554,587,631,646,873,990,993,995,1025-1029,1110,1433,1720,1723,1755,1900,2000-2001,2049,2121,2717,3000,3128,3306,3389,3986,4899,5000,5009,5051,5060,5101,5190,5357,5432,5631,5666,5800,5900,6000-6001,6646,7070,8000,8008-8009,8080-8081,8443,8888,9100,9999-10000,32768,49152-49157 --rate 100000

Обратите внимание, что masscan поддерживает ту же самую опцию -oG filename.gnmap, что и nmap. Далее мы будем обрабатывать полученный список (в формате greppable) для анализа хостов с открытыми портами. Сканирование 16 миллионов адресов по 100 портам займет примерно 5 часов. На мой взгляд, это время вполне разумно. Рассмотрим первые несколько строк полученного файла:

# Masscan 1.0.3 scan initiated Thu Jul 20 22:24:40 2017
# Ports scanned: TCP(1;7-7,) UDP(0;) SCTP(0;) PROTOCOLS(0;)
Host: 17.179.241.56 ()  Ports: 443/open/tcp////
Host: 17.253.84.72 ()   Ports: 179/open/tcp////
Host: 17.188.161.148 () Ports: 8081/open/tcp////
Host: 17.188.161.212 () Ports: 8081/open/tcp////

Поскольку нам нужны только IP-адреса, мы будем использовать утилиту egrep для поиска строк, начинающихся с «Host: » и далее обрабатывать полученные данные при помощи утилиты cut для выемки второго поля. Мы также будем сортировать список при помощи утилиты sort и удалять дубликаты при помощи uniq.

$ egrep '^Host: ' apple-masscan.gnmap | cut -d" " -f2 | sort | uniq > apple-alive

Таким образом, наш список стал значительно меньше, и далее мы можем применить nmap для более детального анализа:

# nmap -PN -n -A -iL apple-alive -oA apple-nmap-advanced-scan

Теперь, на базе файла, сгенерированного masscan, сканер nmap сможет выполнить свою работу намного быстрее.

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


Ньютон уронил яблоко. Мы роняем челюсти!

Гравитация научных фактов сильнее, чем вы думаете

Подпишитесь и испытайте интеллектуальное падение