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/
Теперь нам доступен веб-интерфейс с удобным просмотром и возможностью поиска.
Comments are Closed