TCP-сканер портов, асинхронно отправляющий SYN-пакеты, сканирует весь Интернет менее чем за 5 минут.
Это сканер портов масштаба Интернета. Он может просканировать весь Интернет менее чем за 5 минут, передавая 10 миллионов пакетов в секунду с одной машины.
Его использование (параметры, вывод) похоже на nmap, самый известный сканер портов. Если сомневаетесь, попробуйте одну из тех функций — поддерживаются функции, предназначенные для массового сканирования множества машин, а углублённое сканирование отдельных машин — нет.
Внутренне он использует асинхронную передачу, как сканеры портов scanrand, unicornscan и ZMap. Он более гибок, допуская произвольные диапазоны портов и адресов.
ПРИМЕЧАНИЕ: masscan использует свой собственный специализированный стек TCP/IP. Всё, кроме простого сканирования портов, может вызвать конфликт с локальным стеком TCP/IP. Это означает, что вам нужно использовать опцию --src-ip для работы с другого IP-адреса или использовать --src-port для настройки исходных портов masscan, а затем также настроить внутренний брандмауэр (например, pf или iptables) для блокировки этих портов от остальной операционной системы.
Этот инструмент бесплатен, но подумайте о пожертвовании на его развитие: Bitcoin-кошелёк: 1MASSCANaHUiyTtR3bJ2sLGuMw5kDBaj4T
На Debian/Ubuntu это выглядит примерно так. На самом деле у него нет зависимостей, кроме компилятора C (например, gcc или clang).
sudo apt-get --assume-yes install git make gcc
git clone https://github.com/robertdavidgraham/masscan
cd masscan
make
Это помещает программу в подкаталог masscan/bin.
Чтобы установить её (в Linux), выполните:
make install
Исходный код состоит из множества маленьких файлов, поэтому сборка проходит значительно быстрее при многопоточной сборке. На Raspberry Pi для этого требуется более 2 ГБ (и это приводит к сбоям), поэтому вы можете использовать меньшее число, например, -j4, а не все возможные потоки.
make -j
Хотя Linux является основной целевой платформой, код хорошо работает и на многих других системах (Windows, macOS и т.д.). Дополнительная информация о сборке:
makemakegmakecc src/*.c -o bin/masscanНа macOS двоичные файлы x86, похоже, работают так же быстро под эмуляцией ARM.
Использование похоже на nmap. Для сканирования сегмента сети на наличие некоторых портов:
# masscan -p80,8000-8100 10.0.0.0/8 2603:3001:2d00:da00::/112
Это:
10.x.x.x и подсети 2603:3001:2d00:da00::x<stdout>, который можно перенаправить в файлЧтобы увидеть полный список параметров, используйте функцию --echo. Она выводит текущую конфигурацию и завершает работу. Этот вывод можно использовать как входные данные для программы:
# masscan -p80,8000-8100 10.0.0.0/8 2603:3001:2d00:da00::/112 --echo > xxx.conf
# masscan -c xxx.conf --rate 1000
Masscan может не только определять, открыты ли порты. Он также может завершить TCP-соединение и взаимодействовать с приложением на этом порту, чтобы получить простую информацию — «баннер».
Masscan поддерживает проверку баннеров по следующим протоколам:
Проблема в том, что masscan содержит собственный стек TCP/IP, отдельный от системы, на которой он запущен. Когда локальная система получает SYN-ACK от исследуемой цели, она отвечает RST-пакетом, который разрывает соединение до того, как masscan сможет захватить баннер.
Самый простой способ предотвратить это — выделить masscan отдельный IP-адрес. Это будет выглядеть как один из следующих примеров:
# masscan 10.0.0.0/8 -p80 --banners --source-ip 192.168.1.200
# masscan 2a00:1450:4007:810::/112 -p80 --banners --source-ip 2603:3001:2d00:da00:91d7:b54:b498:859d
Выбранный адрес должен находиться в локальной подсети и не использоваться другой системой. Masscan предупредит вас, если вы ошиблись, но вы можете нарушить связь другой машины на несколько минут, так что будьте осторожны.
В некоторых случаях, например, в WiFi, это невозможно. В таких случаях вы можете заблокировать порт, который использует masscan, с помощью брандмауэра. Это предотвращает обработку пакета локальным стеком TCP/IP, но masscan всё равно видит его, поскольку он обходит локальный стек. В Linux это будет выглядеть так:
# iptables -A INPUT -p tcp --dport 61000 -j DROP
# masscan 10.0.0.0/8 -p80 --banners --source-port 61000
Вероятно, вам следует выбирать порты, которые не конфликтуют с портами, которые Linux может иначе выбрать для исходных портов. Вы можете увидеть диапазон, используемый Linux, и перенастроить его, просмотрев файл:
/proc/sys/net/ipv4/ip_local_port_range
В последней версии Kali Linux (август 2018) этот диапазон — 32768–60999, поэтому вам следует выбирать порты ниже 32768 или 61000 и выше.
Правило iptables действует только до перезагрузки. Вам нужно узнать, как сохранить конфигурацию в зависимости от вашего дистрибутива, например, с помощью iptables-save и/или iptables-persistent.
На Mac OS X и BSD есть похожие шаги. Чтобы узнать диапазоны, которых следует избегать, используйте команду, подобную следующей:
# sysctl net.inet.ip.portrange.first net.inet.ip.portrange.last
На FreeBSD и старых MacOS используйте команду ipfw:
# sudo ipfw add 1 deny tcp from any to any 40000 in
# masscan 10.0.0.0/8 -p80 --banners --source-port 40000
На новых MacOS и OpenBSD используйте утилиту фильтрации пакетов pf.
Отредактируйте файл /etc/pf.conf, добавив строку, подобную следующей:
block in proto tcp from any to any port 40000:40015
Затем для включения брандмауэра выполните команду:
# pfctl -E
Если брандмауэр уже запущен, перезагрузите правила (или перезагрузите систему) с помощью следующей команды:
# pfctl -f /etc/pf.conf
Windows не отвечает RST-пакетами, поэтому ни одна из этих техник не требуется. Однако masscan всё равно лучше всего работает со своим собственным IP-адресом, поэтому по возможности запускайте его так, даже если это строго не требуется.
То же самое необходимо и для других проверок, таких как проверка --heartbleed, которая является лишь формой проверки баннера.
Хотя программа полезна для небольших внутренних сетей, она в первую очередь предназначена для работы со всем Интернетом. Это может выглядеть примерно так:
# masscan 0.0.0.0/0 -p0-65535
Сканирование всего Интернета — плохая идея. Во-первых, некоторые части Интернета плохо реагируют на сканирование. Во-вторых, некоторые сайты отслеживают сканирования и заносят вас в чёрный список, что может привести к блокировке полезных частей Интернета. Поэтому необходимо исключить множество диапазонов. Для занесения в чёрный список или исключения диапазонов используйте следующий синтаксис:
# masscan 0.0.0.0/0 -p0-65535 --excludefile exclude.txt
Это просто выводит результаты в командную строку. Вероятно, вы захотите сохранить их в файл. Поэтому вам нужно нечто вроде:
# masscan 0.0.0.0/0 -p0-65535 -oX scan.xml
Это сохраняет результаты в XML-файл, позволяя легко импортировать результаты в базу данных или что-то подобное.
Но это выполняется со скоростью по умолчанию 100 пакетов/сек, что займёт вечность для сканирования Интернета. Вам нужно ускорить процесс следующим образом:
# masscan 0.0.0.0/0 -p0-65535 --max-rate 100000