Как ускорить исследование больших диапазонов сетей (на примере Router Scan)

В статье «Как узнать локальные IP адреса провайдера» обсуждается сканирование пользователей Интернет-провайдеров в локальных сетях, таких как 10.0.0.0/8, 172.16.0.0/12, 100.64.0.0/10. Это единственно возможный способ выполнить сканирование хостов, которые находятся за NAT. Но проблема в том, что эти сети большие — в них много IP адресов и сканирование, особенно через Wi-Fi (а не по проводу), растягивается на сутки. В статье, на которую дана ссылка, показаны некоторые приёмы выявления диапазонов скопления пользователей, что может неплохо ускорить процесс (кстати, смотрите ещё статью «Некоторые приёмы исследования сети»).

В тему «Рецепты nmap» я добавил новый рецепт «Быстрое сканирование огромных сетей в nmap». Источник метода указан, но перед добавлением я, конечно же, проверил его. И он показал неожиданно хорошие результаты. Я использовал его в паре с Router Scan — поэтому мы сравним время сканирования с помощью только одного Router Scan и используя подготовительные действия с помощью сканирований Nmap.

Этот вариант, на самом деле, подходит не всегда — если у вас слабое Интернет-подключение, то такое интенсивное сканирование может полностью забить канал (пропадёт Интернет и, скорее всего, будет пропущено много онлайн хостов).

Я покажу как использовал этот метод с Router Scan, но вы можете использовать его для исследования локальных и глобальных подсетей в любых целях (поиск веб-серверов, поиск SSH серверов, поиск компьютеров с RDP и т. д.).

Предположим, я хочу просканировать роутеры в подсети 100.64.0.0/10. Если просто ввести этот диапазон в Router Scan и начать сканирование, то это займёт несколько суток.

Примечание: Router Scan в плане поиска уязвимых роутеров прекрасно работает в Linux через Wine, но если вы используете Router Scan на Windows, то вы можете использовать приведённые ниже команды в WSL — они прекрасно там будут работать.

Основная идея быстрого сканирования — пинговать с высоким уровнем параллелизма:

sudo nmap -v -sn -PE -n --min-hostgroup 1024 --min-parallelism 1024 -oX nmap_output.xml 100.64.0.0/10

Значение опций:

  • -sn: не сканировать порты, только пинговать хост
  • -PE: определяет, жив ли хост через эхо ICMP
  • -n: не преобразует IP-адреса в доменные имена.
  • --min-hostgroup 1024: Регулирует размер групп для параллельного сканирования. Минимальная группировка установлена на 1024 IP-адреса. В Nmap есть возможность осуществлять сканирование портов или сканирование с целью определения версии нескольких хостов параллельно. Это происходит путём разделения целевого IP пространства на группы, а затем сканирования одной группы за раз. В общем случае целесообразно использовать большие группы. Недостатком является то, что вы не можете узнать информацию о каком-либо хосте, пока не закончится сканирование всей группы. Таким образом, если Nmap начнёт сканирование группы из 50-ти хостов, то пользователь не будет получать никакой информации, пока не будет завершено сканирование всех 50-ти хостов. По умолчанию Nmap использует компромиссный подход к решению этой проблемы. Сначала производится сканирование небольших групп из 5-ти хостов, поэтому первые результаты приходят быстро, затем размер группы постепенно увеличивается до максимального — 1024. Точные значения по умолчанию зависят от заданных опций. Для большей эффективности Nmap использует группы больших размеров для UDP сканирования и для некоторых типов TCP сканирования портов.
  • --min-parallelism 1024: Регулирует распараллеливание запросов. Этот параметр очень важен. Чтобы в полной мере использовать системные и сетевые ресурсы, мы устанавливаем количество проверок на не менее чем 1024. Эти опции регулируют общее количество запросов для группы хостов. Эта опция используется при сканировании портов и при обнаружении хостов. По умолчанию Nmap высчитывает степень параллельности основываясь на производительности сети. Если пакеты теряются, то Nmap использует меньшее количество запросов. Количество запросов медленно увеличивается по мере того, как сеть продолжает нормально работать. Эти опции устанавливают минимальную и максимальную границы для этой переменной. По умолчанию параллелизм устанавливается в 1, если сеть работает плохо, и может достигать нескольких сотен при идеальных условиях.
  • -oX nmap_output.xml: Вывести результат в формате XML, имя файла — nmap_output.xml

По окончании сканирования вы можете проанализировать XML-документ, чтобы узнать, какие IP-адреса активны.


Значение опции --min-parallelism вы можете уменьшить, если заметили такие признаки как потеря Интернет-подключения. В проводных сетях обычно можно установить более высокие значения, чем в Wi-Fi. Чем хуже сигнал Wi-Fi, тем меньшее значение приходится устанавливать.

Посмотрите на следующие данные результатов сканирования:

Nmap done: 4012855 IP addresses (140507 hosts up) scanned in 2590.61 seconds
           Raw packets sent: 7897197 (221.122MB) | Rcvd: 160371 (6.456MB)

Просканировано 4012855 адресов за 2590 секунд — это 43 минуты. Найдено 140507 хостов онлайн.

Теперь извлечём все IP адресов, которые онлайн (статус «up») и сохраним их в файле hosts.txt:

grep -A 2 'up' nmap_output.xml | grep -E -o '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' > hosts.txt

Теперь запускаем ещё одно сканирование nmap: мы возьмём все хосты, которые онлайн, и проверим, есть ли там открытые порты 80, 443, 8080, 1080.

sudo nmap -v -PE -n --min-hostgroup 1024 --min-parallelism 1024 -p 80,443,8080,1080 --open -iL hosts.txt -oX nmap_routers.xml

Результат:

Nmap done: 140509 IP addresses (121710 hosts up) scanned in 1044.75 seconds
           Raw packets sent: 1100582 (45.478MB) | Rcvd: 208169 (8.408MB)

Сканирование завершилось ещё быстрее — за 17 минут. Здесь хорошо виден недостаток этого метода: из ранее определённых как работающие 140509 хостов, онлайн оказались 121710. Из-за особенностей быстрого сканирования, часть пакетов потерялась и мы не узнали, что хосты в сети.

Извлечём IP адреса, которые онлайн, из файла, полученного в результате второго сканирования:

grep -A 2 'up' nmap_routers.xml | grep -E -o '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' > routers.txt

Посчитаем количество хостов, у которых открыт хотя бы один из интересующих нас портов:

cat routers.txt | wc -l

У меня получилось 3409.

IP адреса из файла routers.txt я загрузил в Router Scan. Сканирование заняло 18 минут, всего было найдено 1870 уязвимых роутеров.

Из них 1135 оказались ранее неизвестными.

Получилось, что я затратил чуть более часа (43+17+18 минут) вместо того, чтобы ждать результатов сканирования несколько суток. Такой прирост эффективности стоил потраченных усилий.

Рекомендуется Вам:

3 комментария to Как ускорить исследование больших диапазонов сетей (на примере Router Scan)

  1. eduard:

    Гениально! При использовании этого способа скоро не останется не просканированых с роутерскан хостов

  2. eduard:

    Всетаки при параметрах 1024 пропуски очень высоки. Уменьшая параметры min-hostgroup, min-parallelism получил такой результат:

    1024 - 65536 IP addresses (2528 hosts up) scanned in 47.75 seconds
    512 - 65536 IP addresses (4674 hosts up) scanned in 64.50 seconds
    200 - 65536 IP addresses (6809 hosts up) scanned in 90.94 seconds
    80 - 65536 IP addresses (10027 hosts up) scanned in 156.18 seconds

    • Alexey:

      Спасибо за статистику! Очень наглядно, что при максимальных значениях теряется 75% хостов.

      Точное значение нужно подбирать индивидуально, в зависимости от условий подключения.

Добавить комментарий

Ваш адрес email не будет опубликован.