Инструкция по использованию Masscan — лучшего массового сканера больших сетей

Если возникает потребность просканировать действительно большие пространства адресов за приемлемое время, то лучше Masscan вряд ли что-то можно найти. Говоря о больших диапазонах, я имею ввиду /8, IP целой страны или вообще все IP всего Интернета.

С Masscan это вполне возможно. Точнее говоря, если вы действительно собрались сканировать весь Интернет, то вам очень бы пригодился драйвер PF_RING и 10-гигабитный сетевой адаптер. Понятно, ещё и интернет-подключение с соответствующей пропускной способностью… Ну ещё наверное нужно разрешение провайдера Интернет-услуг, и вышестоящего провайдера… В общем, это морока и говорить про это мы не будем. Это позволило бы нам отправлять свыше 2 миллионов пакетов в секунду, но это нужно далеко не всем.

Главное нам нужно знать, что Masscan будет сканировать на пределе нашего интернет-подключения, а оно даже близко не приближается к двум миллионам пакетов. Но в любом случае — мы получим очень большую скорость.

Исходный код Masscan писался с мыслью о том, как не совершать лишних операций, а только генерировать пакеты. Тем не менее, Masscan имеет отличные возможности, которые делают его просто очень удобным. Например:

  • возобновление прерванного сканирования;
  • крайне лёгкая организация распределённого по нескольким компьютерам сканирования;
  • перемешивание адресов и сканирование диапазона в случайном порядке, как результат этого — нет излишней нагрузки на отдельные подсети;
  • во время сканирования постоянно обновляется статус, который включает в себя информацию об уже просканированной части, примерное время до завершения и обнаруженные рабочие хосты.

Простое сканирование с помощью Masscan

К примеру, нас интересуют порт 80, а также диапазон портов с 8000 по 8100 в сети 10.0.0.0/8, при этом мы хотим запустить сканирование на скорости десять тысяч пакетов в секунду. Тогда команда будет выгладить так:

sudo masscan -p80,8000-8100 10.0.0.0/8 --rate=10000

Кажется довольно просто, но подвохом здесь является скорость. Например, в моих условиях, если я указываю слишком большую скорость, то часть данных просто теряется. Вам нужно экспериментально подбирать скорость для себя, у меня более-менее реальной является 500-1000 пакетов в секунду. Ещё я сократил количество интересующих меня портов (для увеличения скорости):

sudo masscan -p80,8080 10.0.0.0/8 --rate=500

Понять, что вы установили слишком большую скорость можно по неработающему во время сканирования Интернету (канал забит), а также по тому признаку, что результатов очень мало, хотя вы натравили программу на «живую» сеть. Это не ограничение программы — это ограничение Интернет-подключения.

Возобновление прерванного сканирования

Это совсем просто. Если вам понадобилось выключить / перезагрузить компьютер, то нажмите CTRL+C и дождитесь остановки программы. Промежуточные результаты будут автоматически сохранены в paused.conf. Для возобновления сканирования с того же места, где вы остановились, наберите команду:

sudo masscan --resume paused.conf

Распределённое сканирование с помощью Masscan

Я уже расхваливал удобство организации распределённого сканирования с Masscan по разным машинам, теперь конкретные примеры.

Допустим вы хотите просканировать весь Интернет и распределить сканирование по трём машинам. Тогда Masscan нужно запустить на трёх машинах следующим образом:

masscan 0.0.0.0/0 -p0-65535 --shard 1/3
masscan 0.0.0.0/0 -p0-65535 --shard 2/3
masscan 0.0.0.0/0 -p0-65535 --shard 3/3

Альтернативой является использование функции «возобновления». Сканирования имеет внутренний индекс, который начинается с нуля до числа количества портов затем количества IP адресов. Следующий пример показывает разделение сканирования на куски каждый по 1000 пунктов:

masscan 0.0.0.0/0 -p0-65535 --resume-index 0 --resume-count 1000
masscan 0.0.0.0/0 -p0-65535 --resume-index 1000 --resume-count 1000
masscan 0.0.0.0/0 -p0-65535 --resume-index 2000 --resume-count 1000
masscan 0.0.0.0/0 -p0-65535 --resume-index 3000 --resume-count 1000

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

Как в Masscan сканировать IP из файла

У Masscan есть опции, которые один в один совместимы с nmap. Их довольно много, но самыми интересными, на мой взгляд, являются следующие:

-iL <имя_файла>: Ввод из файла списка хостов/сетей
-p <диапазон портов>: Сканировать только указанные порты
--banners: если есть прослушивающие службы, то получить их баннеры.
-oL/-oJ/-oG/-oB/-oX <файл>: Вывод сканирования в файл Список/JSON/Grepable/Двоичный/XML формат, в соответствии с именем данного файла. Сокращение для --output-format <формат> --output-file <файл>

Как видно, мы можем указать файл, из которого Masscan будет брать IP и диапазоны адресов. Ещё можно собирать банеры с опцией --banners.

Думаю, пришло время порекомендовать статью «Как узнать все IP провайдера, города, региона (области, республики) или страны».

Сбор банеров и их анализ в графическом интерфейсе

Для сбора банеров используется опция --banners. Для меня интересны порты 80,21,53,8080. Чтобы воспользоваться графическим интерфейсом для анализа полученных данных, сохраните результаты в формате XML:

sudo masscan 10.0.0.0/8 -p80,21,53,8080 --banners --max-rate 500 -oX scan-01.xml

Пока происходит сканирование, установите и настройте ваш веб-сервер, скопируйте файлы MASSCAN web-ui:

apt-get install apache2 php5 php5-mysql mysql-server
git clone https://github.com/offensive-security/masscan-web-ui
sudo mkdir /var/www/html/masscan/
sudo mv masscan-web-ui/* /var/www/html/masscan
cd /var/www/html/masscan

Чуть подправим файлы:

sudo find ./ -type f -exec sed -i 's/\/assets/\/masscan\/assets/g' {} \;
sed -i "s/url:'\//url:'\/masscan\//g" /var/www/html/masscan/assets/scripts.js
sed -i "s/url='\/export.php/url='\/masscan\/export.php/g" /var/www/html/masscan/assets/scripts.js

Запускаем службу MySQL:

sudo service mysql start

Если вы не знаете пароль от MySQL, то посмотрите статью «Какой пароль рута MySQL в Kali Linux / Как сменить пароль рута MySQL в Kali Linux».

Создайте базу данных, пользователя, импортируйте базу данных.

mysql -u root -p
create database masscan;
CREATE USER 'masscan'@'localhost' IDENTIFIED BY 'changem3';
GRANT ALL PRIVILEGES ON masscan.* TO 'masscan'@'localhost';
exit
mysql -u root -p masscan < db-structure.sql
sudo rm db-structure.sql README.md

Обновите файл веб конфигурации, подправив данные о пользователе и пароле (если нужно):

gedit config.php
define('DB_HOST',       'localhost');
define('DB_USERNAME',   'masscan');
define('DB_PASSWORD',   'changem3');
define('DB_DATABASE',   'masscan');

Теперь давайте импортируем результаты сканирования. Мы начали сканирование, будучи в домашней директории. Поэтому и файл с результатами сканирования там. Для успешного импорта нам нужно, чтобы файл с результатами (scan-01.xml) находился в каталоге /var/www/html/masscan

Проверим, действительно ли результаты в домашней директории::

ls -l ~/scan*
-rw-r--r-- 1 root root 111771 фев 18 06:13 /home/mial/scan-01.xml

Копируем результаты:

sudo cp ~/scan-01.xml .

Импортируем:

sudo php import.php scan-01.xml

Запускаем сервер:

sudo service apache2 start

Переходим по адресу http://localhost/masscan

Теперь нам доступен веб-интерфейс с удобным просмотром и возможностью поиска.

Вот мои результаты:

08

Поиск прекрасно работает:

09

12

Я нашёл сеть из любопытных устройств Spectrum Analyzer:

10

11

Опции и примеры Masscan

Ещё больше опций и примеров Masscan вы найдёте в Энциклопедии Kali.Tools.

Рекомендуемые статьи:

4 комментария на Инструкция по использованию Masscan — лучшего массового сканера больших сетей

  1. Аноним:

    Почему у меня отключается интернет (примерно через 3-4 мин.) когда запускаю программу?  

    • Alexey Alexey:

      Нужно понизить значение опции --rate. Ваша сеть просто не справляется с таким потоком данных.

  2. Аноним:

    Подскажите в чем беда

    SQLSTATE[08006] [7] could not connect to server: Connection refused Is the server running on host "127.0.0.1" and accepting TCP/IP connections on port 5432?

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

Ваш e-mail не будет опубликован.