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

635
731
15 Янв 2017
de9bc5601f2b0dd8c252953ecc7b67d8.png


Если диапазон внешних 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, но иногда ресурсоемкие задачи лучше выполнять более специализированными утилитами.
Спасибо за внимание.
 

Kracker

Участник
2
6
31 Июл 2018
Джери полезная статья, сейчас сканирую nmap и резко упала скорость. Не могу понять в чем проблема. Первая часть диапазона прошла на ура более 12 млн хостов просканил потом резко упала скорость. Грешу на провайдера, но банальный пинг работает без проблем на те хосты, которые уже отсканились, как рабочие. Парамеры ставил после падения скорости всякие nmap -sn --min-parallelism 100 -iL ******* и nmap -sn --defeat-rst-ratelimit -iL пофиг, такое ощущение, что идет 1 айпи в секунду )))). Сейчас попробую массканом, может поможет.