You are here: Home » Сбор информации » Masscan

Masscan

Описание Masscan

MASSCAN — это массовый сканер IP портов. Это самый быстрый сканер портов Интернета. Отправляя 10 миллионов пакетов в секунду, он может сканировать весь интернет за 6 минут. Этот инструмент полезен для обзора сетей большого масштаба — таких как Интернет или внутренние сети. Хотя скорость по умолчанию ограничена 100 пакетами в секунду, программа может разгоняться до 25 миллионов пакетов в секунду, при такой скорости весь (по одному порту на IP) Интернет будет просканирован за 3 минуты.

Он создаёт результат схожий с nmap, самым знаменитым сканером портов. Внутри он работает подобно scanrand, unicornscan и ZMap, используя асинхронную передачу. Главным отличием является то, что он быстрее этих сканеров. Дополнительно, он более гибкий, позволяет произвольные диапазоны адресов и портов.

ПРИМЕЧАНИЕ: masscan использует кастомный (специально изготовленный) TCP/IP стек. Любое другое, что выходит за пределы простого сканирования, приведёт к конфликту с локальным TCP/IP стеком. Это означает, что вам либо нужно использовать опцию -S для использования раздельных IP адресов, либо настроить операционную систему так, чтобы файервол обрабатывал порт, который использует masscan.

Домашняя страница: https://github.com/robertdavidgraham/masscan

Автор: Robert David Graham

Лицензия: GPLv2

Справка по Masscan

Использование:

masscan <ip адрес/диапазон> -p порты опции

В справке отсутствует список опций, приведены только примеры использования. Ещё больше примеров вы найдёте ниже в соответствующей секции.

Чтобы просканировать порт 80 и диапазон портов с 8000 по 8100 (всего 102 порта) сети 10.x.x.x на скорости 10 тысяч пакетов в секунду наберите команду:

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

Программа поддерживает некоторые опции совместимые с nmap. Чтобы их увидеть наберите:

masscan --nmap

Для сохранения результатов в бинарном формате в <имя_файла> сделайте так:

masscan -p80 10.0.0.0/8 --banners -oB <имя_файла>

Прочитать результаты сканирования из бинарного файла <имя_файла> и сохранить их в формате xml <файл для сохранения>:

masscan --open --banners --readscan <имя_файла> -oX <файл для сохранения>

Для сканирования порта 80 (здесь разные веб-сервера, роутеры, файловые хранилища, веб-камеры и другая похожая «утварь») сети 10.x.x.x с дефолтной скоростью отправки пакетов (100 пакетов в секунду)

masscan 10.0.0.0/8 -p80

Программа автоматически определяет настройки интерфейса/адаптера, если это не произошло вы должны установить их вручную Это пример всех параметров, которые нам нужны:

--adapter-ip 192.168.10.123
--adapter-mac 00-11-22-33-44-55
--router-mac 66-55-44-33-22-11

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

adapter-ip = 192.168.10.123
adapter-mac = 00-11-22-33-44-55
router-mac = 66-55-44-33-22-11

Все параметры с одной чёрточкой имеют эквивалент с двумя чёрточками. Так '-p80' это то же самое что и '--ports 80' (или 'ports = 80' в конфигурационном файле).

Для использования конфигурационного файла наберите

masscan -c <имя_файла>

Для генерации конфигурационного файла из текущих настроек наберите опцию --echo. Это остановит программу от обычного запуска и вместо этого она просто напечатает текущую конфигурацию Это полезно для генерации вашего первого конфигурационного файла или для просмотра списка параметров о которых вы не знаете.

Совместимые с Nmap опции

УКАЗАНИЕ ЦЕЛИ:
  Можно передать только IPv4 адрес, CIDR сети или диапазоны (не в стиле nmap)
  пример: 10.0.0.0/8, 192.168.0.1, 10.0.0.1-10.0.0.254
  -iL <имя_файла>: Ввод из файла списка хостов/сетей
  --exclude <host1[,host2][,host3],...>: Пропустить хосты/сети
  --excludefile <файл_пропуска>: Список для пропуска из файла
  --randomize-hosts: Случайный порядок хостов (по умолчанию)
РАСКРЫТИЕ ХОСТОВ:
  -Pn: Расценивать все хосты как онлайн (по умолчанию)
  -n: Никогда не делать DNS преобразование (по умолчанию)
ТЕХНИКИ СКАНИРОВАНИЯ:
  -sS: TCP SYN (всегда включена, по умолчанию)
ОПРЕДЕЛЕНИЕ СЛУЖБ/ВЕРСИЙ:
  --banners: если есть прослушивающие службы, то получить их баннеры.
    Время ожидания для получения данных по умолчанию 30 секунд.
УКАЗАНИЕ ПОРТОВ И ПОРЯДКА СКАНИРОВАНИЯ:
  -p <диапазон портов>: Сканировать только указанные порты
    Пример: -p22; -p1-65535; -p 111,137,80,139,8080
РАСЧЁТ ВРЕМЕНИ И ПРОИЗВОДИТЕЛЬНОСТЬ
  --max-rate <число>: Отправлять пакеты не быстрее чем <число> в секунду
  --connection-timeout <число>: время в секунда истечения времени TCP
    подключения при ожидании данных баннера с порта.
УКЛОНЕНИЕ ОТ ФАЙЕРВОЛОВ/IDS И СПУФИНГ:
  -S/--source-ip <IP_адрес>: Подменять источник адреса
  -e <iface>: Использовать указанный интерфейс
  -g/--source-port <номер порта>: Использовать данный номер порта
  --ttl <val>: Установить поле время-жизни IP
  --spoof-mac <mac адрес/префикс/имя вендора>: Подменять ваш MAC адрес
ВЫВОД:
  --output-format <формат>: Установить вывод в бинарный/список/json/grepable/xml
  --output-file <файл>: Записать результаты сканирования в файл. Если --output-format
     не указана, то по умолчанию xml
  -oL/-oJ/-oG/-oB/-oX <файл>: Вывод сканирования в файл Список/JSON/Grepable/Двоичный/XML формат,
     в соответствии с именем данного файла. Сокращение для
     --output-format <формат> --output-file <файл>
  -v: Увеличивать уровень вербальности (используйте -vv или более для увеличения эффекта)
  -d: Увеличение уровня отладки (используйте -dd или более для увеличения эффекта)
  --open: Показать только открытые (или возможно открытые) порты
  --packet-trace: Показать все отправленные и полученные пакеты
  --iflist: Напечатать интерфейсы и маршруты хостов (для отладки)
  --append-output: Дописывать, а не переписывать файл вывода
  --resume <имя_файла>: Возобновить прерванное сканирование
ПРОЧЕЕ:
  --send-eth: Отправлять используя сырые ethernet фреймы (по умолчанию)
  -V: Напечатать номер версии
  -h: Напечатать страницу помощи.

Руководство по Masscan

ОПЦИИ

<ip/диапазон>

всё в командной строке, что не имеет префикса ´-´ предполагается IP адресом или диапазоном. Существует три валидных формата. Первый: одиночный IPv4 адрес вроде "192.168.0.1". Второй: диапазон вроде "10.0.0.1-10.0.0.100". Третий: CIDR адрес, вроде "0.0.0.0/0". Должна быть указана хотя бы одна цель. Можно указать много целей. Это можно сделать как несколькими опциями, разделёнными пробелом, или это может быть единичная опция, разделённая запятой, такая как 10.0.0.0/8,192.168.0.1.

--range <ip/диапазон>

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

-p <порты>, --ports <порты>

задаёт порт(ы) для сканирования. Можно указать единичный порт вроде -p80. Можно указать диапазон портов вроде -p 20-25. Можно указать список портов/диапазонов вроде -p80,20-25. Можно указать UDP порты, это делается так --ports U:161,U:1024-1100.

--banners

даёт указания собирать баннеры, такие как версия HTTP серверов, поле заголовка HTML и т. д. Поддерживаются только несколько протоколов.

--rate <пакетов-в-секунду>

указывает желаемую скорость передачи пакетов. Это может быть очень маленькая величина вроде 0.1 ждя передачи пакетов на скорости один в 10 секунд, так и очень большие числа вроде 10000000, при которые программа пытается передать 10 миллионов пакетов в секунду. На опыте автора программы, Windows может передавать 250 тысяч пакетов в секунду, а последние версии Linux могут 2.5 миллиона пакетов в секунду. Для 25 миллионов пакетов в секунду нужен PF_RING драйвер.

-c <имя_файла>, --conf <имя_файла>

читает конфигурационный файл. Формат конфигурационного файла описан ниже.

--resume <имя_файла>

то же самое, что и --conf, кроме того, что некоторые опции устанавливаются автоматически, среди них --append-output. Формат конфигурационного файла описан ниже.

--echo

не запускать, но вместо этого сбросить текущий конфигурационный файл. Этот файл может использоваться с опцией -c. Формат вывода описа ниже в «КОНФИГУРАЦИОННОМ ФАЙЛЕ».

-e <имя_интерфейса>, --adapter <имя_интерфейса>

использовать названный сырой сетевой интерфейс, такой как "eth0" или "dna1". Если не указан, будет использоваться первый найденный сетевый интерфейс с дефолтным шлюзом.

--adapter-ip <ip-address>

отправлять пакеты используя этот IP адрес. Если не указан, то будет использоваться первый связанный с сетью интерфейс. Вместо единичного IP адреса можно указать диапазон. ПРИМЕЧАНИЕ: размер диапазона должен представлять число в степени 2, такой как 1, 2, 4, 8, 16, 1024 и т.д.

--adapter-port <порт>

отправлять пакеты используя этот порт как источник. Если не указан, то будет выбран случайный порт в диапазоне от 40000 до 60000. Этот порт должен фильтроваться файерволом хоста (таким как iptables) для предотвращения прерывания сетевого стека хоста присланными пакетами. Вместо единичного порта, можно указать диапазон вроде 40000-40003. ПРИМЕЧАНИЕ: размер диапазона должен представлять число в степени 2 как в предыдущем примере, где в общей сложности 4 порта.

--adapter-mac <mac-address>

отправлять пакеты используя его как MAC адрес источника. Если не указан, то будет использоваться первый MAC адрес, привязанный к сетевому интерфейсу.

--router-mac <mac адрес>

отправлять пакеты на этот MAC адрес как на конечный пункт. Если указан, то адрес шлюза сетевого интерфейса будет отARPтан.

--ping

показывает, что сканирование должно включать ICMP эхо запрос. Его можно включать с TCP и UDP и сканированием.

--exclude <ip/диапазон>

чёрный список IP адресов или диапазонов, этот список не сканируется. Он переписывает любые указания цели и гарантирует, что этот адрес/диапазон не будет просканирован. Имеет тот же формат, что и указание цели.

--excludefile <имя_файла>

читает список исключаемых диапазонов из файла, формат в файле такой же как описанный выше для определения цели. Этот диапазон переписывает любые цели, предотвращая их от сканирования.

--append-output

приводит к тому, что вывод добавляется к файлу, а не перезаписывает этот файл.

--iflist

составить список доступных сетевых интерфейсов, а затем выйти.

--retries

количество попыток для отправки в 1 секундные интервалы. Поскольку сканер «безстатусный», то попытки отправляются независимо от того, получен ли уже ответ или нет.

--nmap

печатает помощь о совместимых с nmap альтернативах этих опций.

--pcap-payloads

читает пакеты из файла libpcap, содержащего пакеты, и извлекает полезную нагрузку UDP и связывает эту полезную нагрузку с портом назначения. Эти полезные нагрузки затем будут использоваться когда отправляются UDP пакеты с соответствующим портом назначения. Только полезная нагрузка будет запомнена для порта. Аналогично --nmap-payloads.

--http-user-agent <user-agent>

при HTTP запросах заменяет существующее поле пользовательского агента на указанное значение.

--open-only

сообщает только об открытых, а не закрытых портах.

--pcap <имя_файла>

сохраняет полученные пакеты (но не переданные пакеты) в файл в формате libpcap.

--packet-trace

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

--pfring

принуждает использовать драйвер PF_RING. Программа завершит работу, если PF_RING DNA драйвер недоступен.

--resume-index

указатель на сканирование, когда оно было поставлено на паузу.

--resume-count

максимальное количество зондов для отправки перед выходом. Это полезно с --resume-index для нарезки и расщепления задачи на множество экземпляров, хотя опция --shards была бы лучше.

--shards <x>/<y>

расщепляет сканирование на экземпляры, x — это id для этого сканирования, а y — общее число экземпляров. Например, --shards 1/2 говорит экземпляру отправлять каждый другой пакет, начиная с индекса 0. Точно так же --shards 2/2 отправляет каждый другой пакет, но начинает с индекса 1, таким образом он не будет перекрываться с первым примером.

--rotate <время>

ротировать файл вывода, переименовывать его в соответствии с текущей временной меткой, отправлять в отдельную директорию. Время может указываться как количество секунд, например "3600" — это один час. Или могут быть указаны единицы времени, такие как "hourly" или "6hours" или "10min".

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

--rotate-offset <время>

сдвиг по времени. Это подстройка под временные зоны.

--rotate-dir <директория>

при ротации файлов, она указывает, в какую директорию перемещать файл. Полезная директория это /var/log/masscan.

--seed <целое число>

целое число, которое является источниками для генератора случайных числе. Использование различных источников станет причиной отправки пакетов в различном случайном порядке. Вместо числа можно указать строку времени, и её источники будут использоваться для локальной временной метки, автоматически генерируя различные случайные последовательности сканирований. Если источник не указан, то используется время.

--regress

запустить регрессивный тест, возвращает ´0´ при успехе и ´1´ при неудаче.

--ttl <число>

указывает TTL исходящих пакетов, по умолчанию 255.

--wait <секунды>

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

--offline

не отправлять по-настоящему пакеты. Это полезно при низкой скорости и --packet-trace для просмотра, какие пакеты были бы отправлены. Или это полезно с --rate 100000000, чтобы провести бенчмарк, насколько большая скорость работала бы (подразумевается драйвер zero-overhead). PF_RING примерно на 20% медленнее чем результаты бенчмарка в оффлайновом режиме.

-sL

она не делает сканирования, а вместо этого создаёт список случайных адресов. Это полезно для импортирования их в другие инструменты. Опции --shard, --resume-index и --resume-count могут быть полезными с этой функцией.

--interactive

показывать результаты в режиме реального времени в консоли. Это не имеет эффекта, если используется с --output-format или --output-filename.

--output-format <формат>

указывает формат выходного файла, им может быть xml, binary, grepable, list или JSON. Должна быть указана опция --output-filename.

--output-filename <имя_файла>

Файл в которых сохранить результаты. Если указан параметр --output-format, то будет использоваться значение по умолчанию xml

-oB <имя_файла>

устанавливает формат вывода на двоичный и сохраняет в данный файл. Это эквивалент использования параметров --output-format и --output-filename. Опция --read-scan может быть использована для чтения бинарного файла. Бинарные файлы намного меньше чем их XML эквиваленты, но требуют отдельного шага для конвертации обратно в XML и другой читаемый формат.

-oX <имя_файла>

устанавливает формат вывода на XML и сохраняет в данный файл. Это эквивалент использования параметров --output-format xml и --output-filename.

-oG <имя_файла>

устанавливает формат вывода на grepable и сохраняет вывод в данный файл. Это эквивалент использования параметров --output-format grepable и --output-filename.

-oJ <имя_файла>

устанавливает формат вывода на JSON и сохраняет вывод в данный файл. Это эквивалент использования параметров --output-format json и --output-filename.

-oL <имя_файла>

устанавливает формат вывода на формат простого списка и сохраняет вывод в данный файл. Это эквивалент использования параметров --output-format list и --output-filename.

--readscan <бинарные-файлы>

читает файлы, созданные опцией -oB из сканирования, затем выводит их в одном из других форматах, в зависимости от параметров командной строки. Другими словами, она принимает бинарную версию вывода и конвертирует его в форматы XML или JSON.

ФОРМАТ ФАЙЛА КОНФИГУРАЦИИ

Конфигурационный файл использует те же имена параметров, как и командная строка, но без префикса --, и со знаком = между именем и значением. Примером конфигурационного файла может быть:

           # цели
           range = 10.0.0.0/8,192.168.0.0/16
           range = 172.16.0.0/14
           ports = 20-25,80,U:53
           ping = true

           # адаптер
           adapter = eth0
           adapter-ip = 192.168.0.1
           router-mac = 66-55-44-33-22-11

           # другие
           exclude-file = /etc/masscan/exludes.txt

По умолчанию программа считывает дефолтный конфигурационный файл из /etc/masscan/masscan.conf. Это полезно для специфичных под данную систему настройках, таких как опция --adapter-xxx. Это также полезно для исключения IP адресов для сканирования всего Интернета чтобы не сделать случайную ошибку и не сканировать опасные адреса вроде тех, которые принадлежат DoD.

ПОВЕДЕНИЕ CONTROL-C

Когда пользователь нажимает ctrl-c сканирование останавливается и текущее состояние сканирования сохраняется в файл ´paused.conf´. Сканирование может быть возобновлено опцией --resume:

masscan --resume paused.conf

Программа не выходит немедленно, она будет ждать дефолтные 10 секунд для сохранения результатов из Интернета и сохранения результатов перед полным выходом. Это время можно изменить опцией --wait.

Примеры запуска Masscan

ПРОСТЫЕ ПРИМЕРЫ

Следующий пример сканирует всю частные сети на наличие устройств, прослушивающих 80 порт (веб-серверы, роутеры, IP-камеры и т. д.) и печатает все найденные открытые порты.

masscan 10.0.0.0/8 192.168.0.0/16 172.16.0.0/12 -p80 --open-only

Следующий пример сканирует весь Интернет на DNS сервера, собирает их версии, затем сохраняет результаты в файл XML.

masscan 0.0.0.0/0 --excludefile no-dod.txt -pU:53 --banners --output-filename dns.xml

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

Следующий пример читает результаты сканирования из бинарного файла под названием bin-test.scan и печатает его результаты в консоли:

masscan --readscan bin-test.scan

Следующий пример читает результаты сканирования из бинарного файла под названием bin-test.scan и создаёт выводной XML файл под названием bin-test.xml.

masscan --readscan bin-test.scan -oX bin-test.xml

ПРОДВИНУТЫЕ ПРИМЕРЫ

Допустим вы хотите просканировать весь Интернет и распределить сканирование по трём машинам. Тогда 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. По мере завершения работы, скрипт должен отправлять запрос на центральный координирующий сервер за последующей работой.

СБРОС ПАРАЗИТНОГО ТРАФИКА

При сканировании TCP с использованием дефолтного IP адреса вашего адаптера, встроенный стек будет генерировать RST пакеты. Это не даст собрать баннеры. Есть два способа решить это. Первый способ — это создать правило файервола для блокировки порта из видимости стека. Конкретное решение зависит от вашей операционной системы, но в Linux это выглядит примерно так:

iptables -A INPUT -p tcp -i eth0 --dport 61234 -j DROP

Затем, при сканировании, этот же порт должен использоваться как источник:

masscan 10.0.0.0/8 -p80 --banners --adapter-port 61234

Альтернативой является «спуфинг» (подмена на) другой IP адрес. Этот IP адрес должен быть внутри диапазона локальной сети, но при этом не должен использоваться вашим собственным компьютером или другим компьютером в сети. Пример этого выглядит примерно так:

masscan 10.0.0.0/8 -p80 --banners --adapter-ip 192.168.1.101

Настройте таким путём вашего IP адрес источника является предпочитаемым способом запуска сканера.

Установка Masscan

Программа предустановлена в Kali Linux.

Установка в Debian, Mint, Ubuntu

sudo apt-get install git gcc make libpcap-dev
git clone https://github.com/robertdavidgraham/masscan
cd masscan
make

Это поместит программу в подкаталог masscan/bin. Если вы хотите установить её куда-то в систему, то вы должны вручную скопировать её куда-нибудь вроде usr/local/bin.

Исходник состоит из множества маленьких файлов, поэтому сборка пройдёт намного быстрее, если будете использовать многопоточную сборку:

make -j

Хотя Linux является главной целевой платформой, код хорошо запускается на многих других системах. Вот дополнительная информация о них:

Установка в Windows

Windows с Visual Studio: используйте проект VS10

Windows с MingGW: просто наберите make

Windows с cygwin: не работает

Установка в Mac OS X

Mac OS X с XCode: используйте проект XCode4

Mac OS X с cmdline: просто наберите make

Установка в FreeBSD

Наберите gmake.

По другим системам информации нет. Автора они не интересуют.

Скриншоты Masscan

Это утилита командной строки.

Графический интерфейс Masscan

Offensive Security подготовила веб-интерфейс для Masscan: https://www.offensive-security.com/offsec/masscan-web-interface/

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

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

Если вы вдруг забыли (или не знали) пароль от MySQL в Kali Linux, то сделайте так:

/etc/init.d/mysql stop
mkdir -p /var/run/mysqld
chown mysql:mysql /var/run/mysqld
mysqld_safe --skip-grant-tables &

В другом терминале

mysql -u root mysql
update user set password=PASSWORD("НОВЫЙ ПАРОЛЬ") where User='root';
flush privileges;
quit
/etc/init.d/mysql restart

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

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
rm db-structure.sql index.html README.md

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

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

Теперь вы можете использовать masscan для сканирования ваших целей, при этом указав XML в качестве формата вывода.

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

Теперь давайте импортируем результаты сканирования.

ls -l scan*                                     
-rw-r--r-- 1 root root 33680 янв  4 16:57 scan-01.xml

php import.php scan-01.xml

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

service apache2 start

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

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

04

Инструкции по Masscan

Близкие программы:

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