
Модульный распределённый движок фингерпринтинга
Scannerl — это модульный распределённый движок для снятия цифровых отпечатков (fingerprinting), реализованный компанией Kudelski Security. Scannerl может снимать отпечатки тысяч целей на одном хосте, но при этом легко распределяется между несколькими хостами. Scannerl для fingerprinting — это то же, что zmap для сканирования портов.
Scannerl работает на Debian/Ubuntu/Arch (но, скорее всего, будет работать и на других дистрибутивах). Он использует архитектуру «ведущий/ведомый», где ведущий узел распределяет работу (хост(ы) для fingerprinting) между своими ведомыми (локальными или удалёнными). Всё развёртывание прозрачно для пользователя.
При использовании обычных инструментов fingerprinting для крупномасштабного анализа исследователи безопасности часто сталкиваются с двумя ограничениями: во-первых, такие инструменты обычно созданы для сканирования сравнительно небольшого количества хостов за раз и непригодны для больших диапазонов IP-адресов. Во-вторых, если сканируется большой диапазон IP-адресов, защищённых устройствами IPS, вероятность попадания в чёрный список выше, что может привести к неполному набору информации. Scannerl разработан для обхода этих ограничений, предоставляя не только возможность одновременно снимать отпечатки множества хостов, но и распределяя нагрузку между произвольным количеством хостов. Scannerl также делает распределение этих задач полностью прозрачным, что упрощает настройку и обслуживание крупномасштабных проектов fingerprinting; это позволяет сосредоточиться на анализе, а не на геркулесовой задаче ручного управления и распределения процессов fingerprinting. Вдобавок к скорости, scannerl спроектирован так, чтобы можно было легко настроить конкретный анализ fingerprinting всего несколькими строками кода. Создание кластера fingerprinting не только просто в настройке, но и может быть доработано путём добавления тонко настроенных сканирований в ваши кампании fingerprinting.
Это самый быстрый инструмент для проведения крупномасштабных кампаний fingerprinting.
Подробнее:
Содержание
См. wiki для получения дополнительной информации.
См. различные варианты установки на странице установки wiki
Для установки из исходников сначала установите Erlang (не ниже версии 18), выбрав подходящий пакет для вашей платформы: Загрузки Erlang
Установите необходимые пакеты:
# на debian
$ sudo apt install erlang erlang-src rebar
# на arch
$ sudo pacman -S erlang-nox rebar
Затем соберите scannerl:
$ git clone https://github.com/kudelskisecurity/scannerl.git
$ cd scannerl
$ ./build.sh
Получите справку по использованию, выполнив
$ ./scannerl -h
Scannerl доступен в AUR для пользователей Arch Linux
DEB-пакеты (Ubuntu, Debian) доступны в релизах.
RPM-пакеты (Opensuse, Centos, Redhat) доступны на https://build.opensuse.org/package/show/home:chapeaurouge/scannerl.
Для выполнения распределённого сканирования необходимы два типа узлов:
На ведущем узле должен быть установлен и скомпилирован scannerl, в то время как на ведомом узле (узлах) требуется только установленный Erlang. Вся настройка прозрачна и выполняется автоматически ведущим узлом.
Требования для распределённого сканирования:
$ ./scannerl -h
____ ____ _ _ _ _ _ _____ ____ _
/ ___| / ___| / \ | \ | | \ | | ____| _ \| |
\___ \| | / _ \ | \| | \| | _| | |_) | |
___) | |___ / ___ \| |\ | |\ | |___| _ <| |___
|____/ \____/_/ \_\_| \_|_| \_|_____|_| \_\_____|
ИСПОЛЬЗОВАНИЕ
scannerl МОДУЛЬ ЦЕЛИ [УЗЛЫ] [ОПЦИИ]
МОДУЛЬ:
-m <mod> --module <mod>
mod: модуль fingerprinting для использования.
аргументы разделяются двоеточием.
ЦЕЛИ:
-f <target> --target <target>
target: список целей, разделённых запятыми.
-F <path> --target-file <path>
path: путь к файлу, содержащему по одной цели в строке.
-d <domain> --domain <domain>
domain: список доменов, разделённых запятыми.
-D <path> --domain-file <path>
path: путь к файлу, содержащему по одному домену в строке.
УЗЛЫ:
-s <node> --slave <node>
node: список узлов (имена хостов, не IP), разделённых запятыми.
-S <path> --slave-file <path>
path: путь к файлу, содержащему по одному узлу в строке.
узел также может быть указан с множителем (<node>*<nb>).
ОПЦИИ:
-o <mod> --output <mod> список выходных модулей для использования, разделённый запятыми.
-p <port> --port <port> порт для fingerprinting.
-t <sec> --timeout <sec> тайм-аут процесса fingerprinting.
-T <sec> --stimeout <sec> тайм-аут подключения ведомого (по умолчанию: 10).
-j <nb> --max-pkt <nb> максимальное количество пакетов для получения (int или "infinity").
-r <nb> --retry <nb> счётчик повторных попыток (по умолчанию: 0).
-c <cidr> --prefix <cidr> подразделить диапазон с префиксом > cidr (по умолчанию: 24).
-M <port> --message <port> порт для прослушивания сообщений (по умолчанию: 57005).
-P <nb> --process <nb> максимальное количество одновременных процессов на узел (по умолчанию: 28232).
-Q <nb> --queue <nb> максимальное количество необработанных результатов в очереди (по умолчанию: infinity).
-C <path> --config <path> читать аргументы из файла, по одному в строке.
-O <mode> --outmode <mode> 0: на ведущем, 1: на ведомом, >1: на брокере (по умолчанию: 0).
-v <val> --verbose <val> быть многословным (0 <= int <= 255).
-K <opt> --socket <opt> опция сокета, разделённая запятыми (key[:value]).
-l --list-modules список доступных модулей fp/out.
-V --list-debug список доступных опций отладки.
-A --print-args Вывести запись аргументов.
-X --priv-ports использовать только исходные порты от 1 до 1024.
-N --nosafe продолжать, даже если некоторые ведомые не запустились.
-w --www DNS будет пытаться для www.<domain>.
-b --progress показывать прогресс.
-x --dryrun пробный прогон.
См. wiki для получения дополнительной информации.
Scannerl можно использовать на локальном хосте без каких-либо других хостов. Однако он всё равно создаст ведомый узел на том же хосте, с которого запущен. Поэтому требования, описанные в Распределённая настройка, также должны быть выполнены.
Быстрый способ сделать это — убедиться, что ваш хост может разрешать сам себя с помощью
grep -q "127.0.1.1\s*`hostname`" /etc/hosts || echo "127.0.1.1 `hostname`" | sudo tee -a /etc/hosts
и создать SSH-ключ (если его ещё нет) и добавить его в authorized_keys (нужен работающий SSH-сервер):
cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
Следующий пример запускает захват HTTP-баннера на google.com с локального хоста
./scannerl -m httpbg -d google.com
Для выполнения распределённого сканирования необходимо предварительно настроить хосты, которые будут использоваться scannerl для распределения работы. См. Распределённая настройка для получения дополнительной информации.
Scannerl ожидает список ведомых узлов для использования (задаётся ключами -s или -S).
./scannerl -m httpbg -d google.com -s host1,host2,host3
Scannerl выведет список доступных модулей (выходных модулей и модулей fingerprinting) с помощью ключа -l:
$ ./scannerl -l
Доступные модули fingerprinting
================================
bacnet UDP/47808: идентификация Bacnet
chargen UDP/19: идентификация коэффициента усиления Chargen
fox TCP/1911: идентификация FOX
httpbg TCP/80: идентификация заголовка HTTP Server
- Arg1: [true|false] следовать перенаправлению [По умолчанию: false]
httpsbg SSL/443: идентификация заголовка HTTPS Server
https_certif SSL/443: сборщик сертификатов HTTPS
imap_certif TCP/143: сборщик сертификатов IMAP STARTTLS
modbus TCP/502: идентификация Modbus
mqtt TCP/1883: идентификация MQTT
mqtts TCP/8883: идентификация MQTT через SSL
mysql_greeting TCP/3306: идентификация версии MySQL
pop3_certif TCP/110: сборщик сертификатов POP3 STARTTLS
smtp_certif TCP/25: сборщик сертификатов SMTP STARTTLS
ssh_host_key TCP/22: сборщик ключей хоста SSH
Доступные выходные модули
========================
csv вывод в csv
- Arg1: [true|false] сохранять всё [По умолчанию: true]
csvfile вывод в csv-файл
- Arg1: [true|false] сохранять всё [По умолчанию: false]
- Arg2: Путь к файлу
file вывод в файл
- Arg1: Путь к файлу
file_ip вывод в stdout (только ip)
- Arg1: Путь к файлу
file_mini вывод в файл (только ip и результат)
- Arg1: Путь к файлу
file_resultonly вывод в файл (только результат)
- Arg1: Путь к файлу
stdout вывод в stdout
stdout_ip вывод в stdout (только IP)
stdout_mini вывод в stdout (только ip и результат)
Аргументы могут быть переданы модулям через двоеточие. Например, для выходного модуля file:
./scannerl -m httpbg -d google.com -o file:/tmp/result
Результат, возвращаемый scannerl выходным модулям, имеет следующую форму:
{module, target, port, result}
Где
module: используемый модуль (атом Erlang)target: IP-адрес или имя хоста (строка или IPv4-адрес)port: порт (целое число)result: см. нижеЧасть result имеет форму:
{{status, type},Value}
Где {status, type} — один из следующих кортежей:
{ok, result}: fingerprinting цели выполнен успешно{error, up}: fingerprinting не удался, но цель ответила{error, unknown}: fingerprinting не удалсяValue — возвращаемое значение; это может быть атом или список элементов.
Scannerl спроектирован и реализован с учётом модульности. Добавлять в него новые модули легко:
Чтобы создать новые модули, просто следуйте поведению (fp_module.erl для модулей fingerprinting и out_behavior.erl для выходных модулей) и реализуйте свои модули.
Новые модули можно добавлять либо во время компиляции, либо динамически как внешний файл.
См. страницу wiki для получения дополнительной информации.
Не стесняйтесь открывать issue или PR.
Copyright(c) 2017 Nagravision SA.
Эта программа является свободным программным обеспечением: вы можете распространять её и/или модифицировать на условиях Стандартной общественной лицензии GNU версии 3, опубликованной Free Software Foundation.
Эта программа распространяется в надежде, что она будет полезна, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемых гарантий КОММЕРЧЕСКОЙ ЦЕННОСТИ или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЁННОЙ ЦЕЛИ. См. GNU General Public License для получения более подробной информации.
Вы должны были получить копию Стандартной общественной лицензии GNU вместе с этой программой. Если нет, см. http://www.gnu.org/licenses/.