Сканер уязвимостей ZMap — дополнительная информация

Перейти к содержанию полного руководства пользователя ZMap на русском языке.

[su_accordion]
[su_spoiler title=»Содержание темы»]

[/su_spoiler]
[/su_accordion]

Дополнительная информация по сканеру ZMap

При выполнении сканирования TCP SYN ZMap требуется один целевой порт и поддержка диапазона исходных портов, из которых сканирование берет начало.

-p, —target-port=port  – TCP номер порта для сканирования (например, 443).

-s, —source-port=port|range – исходный порт (порты) для пакетов сканирования (например, 40000-50000).

ZMap опирается на ядро Linux, чтобы поддерживать SYN/ACK пакеты и закрыть открытые соединения с помощью сканера. ZMap посылает пакеты на уровне протокола Ethernet, чтобы защитить ядро от отслеживания открытых соединений TCP и выполнения маршрута поиска.

Поэтому, если на вашем брандмауэре установленные соединения отслеживаются как -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT, это приведет к блокировке SYN / ACK-пакетов.

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

Мы настоятельно рекомендуем вам выбрать диапазон неиспользованных портов на сканированном хосте, который может быть допущен вашим брандмауэром. При работе ZMap он будет идентифицирован с помощью флага -s (например, -s '50000-60000').

ICMP эхо-сканирование

В то время как TCP SYN сканирование выполняется по умолчанию, ZMap также поддерживает эхо-сканирование ICMP, в котором ICMP пакеты отправляются в каждый из хостов, а тип ICMP протокола, полученного в ответ, является обозначенным.

ICMP сканирование можно выполнить путем выбора icmp_echoscan модуля, который является аналогичным следующему:

$ zmap --probe-module=icmp_echoscan

UDP Datagram сканирование

Сканер ZMap дополнительно поддерживает UDP-зонды, где он посылает произвольную UDP дейтаграмму для каждого хоста и получает UDP или ICMP ответы.

ZMap поддерживает четыре различных способа установки полезной UDP нагрузки с помощью опции командной строки. Это ‘text’ для ASCII-печати полезных нагрузок, ‘hex’ для шестнадцатеричных полезных нагрузок, установленных в командной строке, ‘file’ для полезных нагрузок, содержащихся во внешнем файле, и ‘template’ для полезных нагрузок, требующих генерации динамического поля. Для того, чтобы получить ответ UDP, убедитесь, что вы указываете ‘data’ в качестве одного из отчетных полей с помощью опции -f.

В приведенном ниже примере отправлено два байта ‘ST’ на UDP порт 5632:

$ zmap -M udp -p 5632 --probe-args=text:ST -N 100 -f saddr,data -o –

В приведенном ниже примере отправлено байт ‘0x02’, запрос SQL ‘client broadcast’ на UDP порт 1434:

$ zmap -M udp -p 1434 --probe-args=hex:02 -N 100 -f saddr,data -o –

В приведенном ниже примере отправлено NetBIOS запрос на UDP порт 137. При этом используется файл полезной нагрузки, который включен в ZMap рассылку:

$ zmap -M udp -p 1434 --probe-args=file:netbios_137.pkt -N 100 -f saddr,data -o –

В приведенном ниже примере отправлено запрос SIP ‘OPTIONS ‘ на UDP порт 5060. При этом используется файл шаблона, который входит в дистрибутив ZMap:

$ zmap -M udp -p 1434 --probe-args=file:sip_options.tpl -N 100 -f saddr,data -o -

UDP шаблоны полезной нагрузки все еще имеют экспериментальный характер. Вы можете столкнуться со сбоями при использовании более одного отправленного запроса (-T) и значительным снижением производительности по сравнению со статически полезной нагрузкой.

Шаблон – это просто файл полезной нагрузки, в котором содержится один или несколько полей, оформленных в ${} ряд. Некоторые протоколы, в частности, SIP, требуют полезной нагрузки для отражения источника и назначения пакета. Другие протоколы, такие как portmapper и DNS, содержат поля, должны быть рандомизированы, согласно с запросом, или могут быть разбиты многодомными системами, которые сканирует ZMap.

Шаблон полезной нагрузки отправляет запрос SIP OPTIONS для каждого пункта назначения:

OPTIONS sip:${RAND_ALPHA=8}@${DADDR} SIP/2.0
Via: SIP/2.0/UDP ${SADDR}:${SPORT};branch=${RAND_ALPHA=6}.${RAND_DIGIT=10};rport;alias
From: sip:${RAND_ALPHA=8}@${SADDR}:${SPORT};tag=${RAND_DIGIT=8}
To: sip:${RAND_ALPHA=8}@${DADDR}
Call-ID: ${RAND_DIGIT=10}@${SADDR}
CSeq: 1 OPTIONS
Contact: sip:${RAND_ALPHA=8}@${SADDR}:${SPORT}
Content-Length: 0
Max-Forwards: 20
User-Agent: ${RAND_ALPHA=8}
Accept: text/plain

В приведенном примере обратите внимание, что линия окончаний \r\n и окончание этого запроса должны содержать \r\n\r\n, чтобы SIP реализации были корректно обработаны.

Представленные шаблонные поля уже выполнены:

  • SADDR: исходный IP-адрес в четырехзначном формате;
  • SADDR_N: IP-адрес источника в сетевом порядке байтов;
  • DADDR: IP-адрес назначения в четырёхзначном формате;
  • DADDR_N: IP-адрес назначения в сетевом порядке байт;
  • SPORT: порт источника в формате ASCII;
  • SPORT_N: исходный порт в сетевом порядке байт;
  • DPORT: порт назначения в формате ASCII;
  • DPORT_N: порт назначения в сетевом порядке байтов;
  • RAND_BYTE: случайный байт (0-255), длина обозначается с помощью параметра =(length);
  • RAND_DIGIT: случайные цифры от 0 до 9, длина обозначается через параметр =(length);
  • RAND_ALPHA: случайные буквы A-Z, длина указывается с помощью параметра =(length);
  • RAND_ALPHANUM: случайные буквы A-Z и цифры 0-9, длина обозначается с помощью =(length).

Файлы конфигурации

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

interface "eth1"
source-ip 1.1.1.4-1.1.1.8
gateway-mac b4:23:f9:28:fa:2d # upstream gateway
cooldown-time 300 # seconds
blacklist-file /etc/zmap/blacklist.conf
output-file ~/zmap-output
quiet
summary

Сканер ZMap может быть запущен с помощью файла конфигурации и добавлением необходимых параметров:

$ zmap --config=~/.zmap.conf --target-port=443

Verbosity

Существует несколько типов вывода на экран, которые производит ZMap. По умолчанию сканер выведет основную информацию о ходе работы раз в 1 секунду. Эту функцию можно отключить путем установки флага --quiet.

0:01 12%; send: 10000 done (15.1 Kp/s avg); recv: 144 143 p/s (141 p/s avg); hits: 1.44%

ZMap также выводит информационные сообщения во время конфигурации сканера, которыми можно управлять с помощью аргумента --verbosity.

Aug 11 16:16:12.813 [INFO] zmap: started
Aug 11 16:16:12.817 [DEBUG] zmap: no interface provided. will use eth0
Aug 11 16:17:03.971 [DEBUG] cyclic: primitive root: 3489180582
Aug 11 16:17:03.971 [DEBUG] cyclic: starting point: 46588
Aug 11 16:17:03.975 [DEBUG] blacklist: 3717595507 addresses allowed to be scanned
Aug 11 16:17:03.975 [DEBUG] send: will send from 1 address on 28233 source ports
Aug 11 16:17:03.975 [DEBUG] send: using bandwidth 10000000 bits/s, rate set to 14880 pkt/s
Aug 11 16:17:03.985 [DEBUG] recv: thread started

ZMap также поддерживает вывод на печать резюме в конце сканирования, которое может быть вызвано с помощью флага —summary.

cnf    target-port                        443
cnf    source-port-range-begin            32768
cnf    source-port-range-end              61000
cnf    source-addr-range-begin            1.1.1.4
cnf    source-addr-range-end              1.1.1.8
cnf    maximum-packets                    4294967295
cnf    maximum-runtime                    0
cnf    permutation-seed                   0
cnf    cooldown-period                    300
cnf    send-interface                     eth1
cnf    rate                               45000
env    nprocessors                        16
exc    send-start-time                    Fri Jan 18 01:47:35 2013
exc    send-end-time                      Sat Jan 19 00:47:07 2013
exc    recv-start-time                    Fri Jan 18 01:47:35 2013
exc    recv-end-time                      Sat Jan 19 00:52:07 2013
exc    sent                               3722335150
exc    blacklisted                        572632145
exc    first-scanned                      1318129262
exc    hit-rate                           0.874102
exc    synack-received-unique             32537000
exc    synack-received-total              36689941
exc    synack-cooldown-received-unique    193
exc    synack-cooldown-received-total     1543
exc    rst-received-unique                141901021
exc    rst-received-total                 166779002
adv    source-port-secret                 37952
adv    permutation-gen                    4215763218

Вывод результатов

ZMap может давать результаты в нескольких форматах за счет использования модулей вывода. По умолчанию ZMap поддерживает только вывод csv, однако поддержка redis и json также может быть скомпилирована. Результаты, которые отправляются на эти выходные модули, могут быть отфильтрованы с помощью выходного фильтра. Поля выходного модуля задаются пользователем.

По умолчанию ZMap будет возвращать результаты в формате csv, однако, если не указан выходной файл, ZMap не даст конкретных результатов. Также есть возможность написать собственный модуль – чтобы узнать детали, смотрите «Написание выходных модулей».

  • -o, —output-file=p  – файл для записи выхода;
  • -O, —output-module=p  – вызов пользовательского модуля вывода;
  • -f, —output-fields=p  – поля для вывода, разделенные запятой;
  • —output-filter=filter  – укажите выходной фильтр на поля для данного зонда;
  • —list-output-modules  – список доступных выходных модулей;
  • —list-output-fields  – список доступных выходных полей для данного зонда.

Выходные поля

ZMap имеет множество полей, которые он может выводить за пределы IP-адреса. Эти поля можно рассматривать для данного модуля зонда с помощью флага --list-output-fields.

$ zmap --probe-module="tcp_synscan" --list-output-fields
saddr string: source IP address of response
saddr-raw int: network order integer form of source IP address
daddr string: destination IP address of response
daddr-raw int: network order integer form of destination IP address
ipid int: IP identification number of response
ttl int: time-to-live of response packet
sport int: TCP source port
dport int: TCP destination port
seqnum int: TCP sequence number
acknum int: TCP acknowledgement number
window int: TCP window
classification string: packet classification
success int: is response considered success
repeat int: is response a repeat response from host
cooldown int: Was response received during the cooldown period
timestamp-str string: timestamp of when response arrived in ISO8601 format.
timestamp-ts int: timestamp of when response arrived in seconds since Epoch
timestamp-us int: microsecond part of timestamp (e.g. microseconds since 'timestamp-ts')

Чтобы выбрать поля для вывода, можно использовать любую комбинацию выходных полей, разделенных запятыми, в виде списка. Для этого используется флаг --output-fields=fields
или -f. Например:

$ zmap -p 80 -f "response,saddr,daddr,sport,seq,ack,in_cooldown,is_repeat,timestamp" -o output.csv

Фильтрация выхода

Результаты, полученные с помощью модуля зонда, могут быть отфильтрованы перед передачей в модуль вывода. Фильтры устанавливаются над выходными полями исследовательского модуля. Они написаны на простом языке фильтрации, как, например, SQL, и передаются ZMap с помощью опции —output-filter . Выходные фильтры обычно используются, чтобы отфильтровать повторяющиеся результаты, или чтобы передать успешные ответы на выходной модуль.

Фильтры представлены в форме <fieldname> <operation> <value>. Тип <value> должен быть строкой или целым числом и соответствовать типу <fieldname>.

Действующие операции для целых сравнений: = !=, <, >, <=, >=. Операции для сравнения строк: =, !=. Флаг --list-output-fields напечатает, какие поля и типы доступны для выбранного модуля, а после этого выйдет.

Соединение фильтров может быть создано с помощью объединения выражений фильтра с помощью круглых скобок, чтобы указать порядок операций, &&  (логическое И) и ||  (логическое ИЛИ).

Пример:

Написать фильтр для исключительно успешных, неповторяющихся ответов.

--output-filter="success = 1 && repeat = 0"

Фильтр для пакетов, которые имеют классификации RST и TTL больше чем 10, или для пакетов с классификацией SYNACK.

--output-filter="(classification = rst && ttl > 10) || classification = synack"

CSV

Модуль CSV будет производить файл запрашиваемых выходных полей. Например, следующая команда производит CSV в файле под именем output.csv.

$ zmap -p 80 -f "response,saddr,daddr,sport,seq,ack,in_cooldown,is_repeat,timestamp" -o output.csv
response, saddr, daddr, sport, dport, seq, ack, in_cooldown, is_repeat, timestamp
synack, 159.174.153.144, 10.0.0.9, 80, 40555, 3050964427, 3515084203, 0, 0,2013-08-15 18:55:47.681
rst, 141.209.175.1, 10.0.0.9, 80, 40136, 0, 3272553764, 0, 0,2013-08-15 18:55:47.683
rst, 72.36.213.231, 10.0.0.9, 80, 56642, 0, 2037447916, 0, 0,2013-08-15 18:55:47.691
rst, 148.8.49.150, 10.0.0.9, 80, 41672, 0, 1135824975, 0, 0,2013-08-15 18:55:47.692
rst, 50.165.166.206, 10.0.0.9, 80, 38858, 0, 535206863, 0, 0,2013-08-15 18:55:47.694
rst, 65.55.203.135, 10.0.0.9, 80, 50008, 0, 4071709905, 0, 0,2013-08-15 18:55:47.700
synack, 50.57.166.186, 10.0.0.9, 80, 60650, 2813653162, 993314545, 0, 0,2013-08-15 18:55:47.704
synack, 152.75.208.114, 10.0.0.9, 80, 52498, 460383682, 4040786862, 0, 0,2013-08-15 18:55:47.707
synack, 23.72.138.74, 10.0.0.9, 80, 33480, 810393698, 486476355, 0, 0,2013-08-15 18:55:47.710

Модуль Redis

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

ZMap не использует поддержку модуля Redis по умолчанию. При запуске ZMap вы можете активировать модуль Redis, запустив CMake -DWITH_REDIS=ON

JSON

Выходной модуль в формате JSON работает аналогично модулю CSV, за исключением того, что записывает выходные данные в формате JSON в файл. Файл в формате JSON можно легко импортировать в другие программы , которые могут читать JSON .

ZMap не использует поддержку модуля JSON по умолчанию. При запуске ZMap вы можете активировать модуль JSON, запустив CMake -DWITH_JSON=ON.

Черный список и белый список

ZMap поддерживает сетевые префиксы Blacklisting и Whitelisting. Если ZMap не снабжен черным или белым списком параметров, он будет сканировать все адреса IPv4 (в том числе локальные, зарезервированные и групповые адреса). Если указан черный список файлов, сетевые префиксы в черном списке не будут проверяться; если указан белый список файлов, только сетевые префиксы, которые состоят в нем, будут сканироваться.

Файлы белого и черного списков могут быть использованы в согласовании; черный список имеет приоритет над белым списком (например, если у вас есть белый список 10.0.0.0/8 и черный 10.1.0.0/16, последний сканироваться не будет).

Файлы в белом и черном списках могут быть указаны в командной строке следующим образом:

-b, —blacklist-file=path  – файл подсетей черного списка в CIDR нотации, например 192.168.0.0/16.

w, —whitelist-file=path  – файл подсетей для ограничения сканирования в CIDR нотации, например, 192.168.0.0/16.

Чёрный список файлов должен быть отформатирован с одним сетевым префиксом в CIDR нотации в каждой строке. Комментарии разрешены с помощью символа #. Например:

# From IANA IPv4 Special-Purpose Address Registry
# http://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml
# Updated 2013-05-22
0.0.0.0/8 # RFC1122: "This host on this network"
10.0.0.0/8 # RFC1918: Private-Use
100.64.0.0/10 # RFC6598: Shared Address Space
127.0.0.0/8 # RFC1122: Loopback
169.254.0.0/16 # RFC3927: Link Local
172.16.0.0/12 # RFC1918: Private-Use
192.0.0.0/24 # RFC6890: IETF Protocol Assignments
192.0.2.0/24 # RFC5737: Documentation (TEST-NET-1)
192.88.99.0/24 # RFC3068: 6to4 Relay Anycast
192.168.0.0/16 # RFC1918: Private-Use
192.18.0.0/15 # RFC2544: Benchmarking
198.51.100.0/24 # RFC5737: Documentation (TEST-NET-2)
203.0.113.0/24 # RFC5737: Documentation (TEST-NET-3)
240.0.0.0/4 # RFC1112: Reserved
255.255.255.255/32 # RFC0919: Limited Broadcast
# From IANA Multicast Address Space Registry
# http://www.iana.org/assignments/multicast-addresses/multicast-addresses.xhtml
# Updated 2013-06-25
224.0.0.0/4 # RFC5771: Multicast/Reserved

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

Конфигурация ZMap по умолчанию использует файл черного списка /etc/zmap/blacklist.conf, который содержит локальные адреса и IP диапазон. Конфигурация по умолчанию может быть изменена путем редактирования /etc/zmap/zmap.conf.

Ограничение и выбор скорости

По умолчанию ZMap будет сканировать с максимально возможной скоростью, которую обеспечивает сетевой адаптер. На аппаратном обеспечении, это, как правило, около 95-98% от теоретической скорости Ethernet. ZMap не будет автоматически корректировать скорость отправки, установленную вышестоящим провайдером. Вам, возможно, придется выполнить ручные настройки, чтобы уменьшить скорость пакетной передачи.

-r, —rate=pps  – установить максимальную скорость отправки пакетов / сек.

-B, —bandwidth=bps  – настроить скорость в битах / сек (поддерживает суффиксы G, M и K). Чтобы отменить, используйте флаг --rate.

ZMap также может сделать случайный выбор из адресного пространства IPv4, указав максимальное количество значений целевых показателей и / или максимальное значение среды выполнения. Поскольку хосты сканируются в случайном порядке, ограничение сканирования до определенного количества хостов будет выполнено через случайный выбор хостов. Параметры командной строки:

-n, —max-targets=n  – количество целей для исследования;

-N, —max-results=n  – количество результатов (выход после получения многих положительных результатов);

-t, —max-runtime=s  – время для отправки пакетов (в секундах);

-s, —seed=n  – используется для перестановки адресов. Укажите, чтобы сканировать адреса в том же порядке для различных серий ZMap.

Например, если вы хотите сканировать миллион хостов в Интернете, вы можете ограничить число сканируемых хостов:

zmap -p 443 -s 3 -n 1000000 -o results

Чтобы определить, какой один миллион хостов будет отсканирован, можно запустить режим dry-run сканирования, который будет распечатывать отправленные пакеты вместо выполнения фактического сканирования.

zmap -p 443 -s 3 -n 1000000 --dryrun | grep daddr
    | awk -F'daddr: ' '{print $2}' | sed 's/ |.*//;'

Отправка нескольких пакетов

ZMap поддерживает отправку нескольких зондов для каждого хоста. Увеличение времени сканирования (~ 100% за каждый дополнительный зонд) значительно перевешивает увеличение хостов (~ 1% за каждый дополнительный зонд).

-P, —probes=n  – количество уникальных зондов для отправки к каждому IP (по умолчанию = 1).

Перейти к содержанию полного руководства пользователя ZMap на русском языке.

Перевод: Виктория Верстлер

Источник: https://zmap.io/documentation.html#additional

Оставьте комментарий