You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
4.3 KiB
108 lines
4.3 KiB
АДАПТАЦИЯ ПРОГРАММЫ masscan К АДМИНКЕ СКАНЕРОВ
|
|
ТЕХНИЧЕСКОЕ ЗАДАНИЕ
|
|
|
|
ЦЕЛЬ ПРОЕКТА
|
|
|
|
Адаптировать софт masscan к использованию с админкой сканеров, для распределенной работы
|
|
|
|
ОПИСАНИЕ
|
|
|
|
Исходный код проекта здесь: https://github.com/robertdavidgraham/masscan
|
|
Это быстрый порт-сканер, работающий с миллионами пакетов в секунду и миллионами адресов.
|
|
Нужно его распилить так, чтобы он:
|
|
1) работал на Windows (вроде бы он это умеет)
|
|
2) работал без привилегий администратора (тут сомнения)
|
|
3) был оформлен как модуль (см. module_HOWTO.txt, оформление кода и сборок.txt)
|
|
|
|
Конфиги передаются в модуль через вызов Control(). Название конфига - это строка в аргументе Ctl, тело конфига - аргумент CtlArg,
|
|
длина конфига - CtlArgLen (см. "module_HOWTO")
|
|
|
|
Модуль получает единственный конфиг с именем masrv, содержащий список адресов управляющего сервера,
|
|
разделенных \r\n или \n, в формате адрес:порт.
|
|
Если порт четный, работа идет по HTTP, если нечетный - HTTPS.
|
|
Если указан префикс протокола (http/https), префикс имеет приоритет над указанным портом.
|
|
Модуль работает с тем управляющим сервером, до которого удалось достучаться первым, по каждому запросу.
|
|
|
|
|
|
СОБЫТИЯ
|
|
|
|
Модуль должен отправлять следующие события через callback (см. "module_HOWTO"):
|
|
- MASS scanner build %date% %time% started
|
|
- %d addresses tried, %d open ports detected - периодически раз в полчаса (таймаут задается константой в config.h)
|
|
|
|
СКАНЕР
|
|
|
|
Сканер получает диапазоны для сканирования для проверки HTTP-запросом на сервер
|
|
|
|
GET /<group>/<clientid>/mass/domains HTTP/1.1
|
|
Значения group и clientid - это поля struct ParentInfo
|
|
CHAR ParentID[256];
|
|
CHAR ParentGroup[64];
|
|
(см. module_HOWTO)
|
|
|
|
address range1[\r]\n
|
|
port range1[\r]\n
|
|
...
|
|
(несколько записей)
|
|
|
|
Здесь нечетная строка содержит диапазон адресов для сканирования (в формате masscan)
|
|
Четная строка содержит диапазон портов для сканирования (в формате masscan)
|
|
|
|
Отправка результатов делается по протоколу DPOST запросом
|
|
|
|
POST /<group>/<clientid>/mass/81 HTTP/1.1
|
|
|
|
Собранные данные отправляются в контейнере multipart/form-data с полями source и data.
|
|
Значение поля source - "PORT scan"
|
|
Значение поля data: простой текст, разделитель строк \r\n
|
|
Формат записи:
|
|
|
|
адрес:порт:протокол\r\n
|
|
...
|
|
(одна или множество записей)
|
|
|
|
Например:
|
|
195.1.15.68:53:udp\r\n
|
|
195.1.15.68:53:tcp\r\n
|
|
|
|
Частоту отправки намайненных данных можно получить с управляющего сервера HTTP-запросом
|
|
GET /<group>/<clientid>/mass/freq HTTP/1.1
|
|
|
|
В теле ответа мы ожидаем число - это число секунд, не чаще которого следует отправлять данные.
|
|
Если это 0 - отправка сразу по готовности нового результата.
|
|
Если это положительное число - мы накапливаем записи в буфере и отправляем раз в X секунд,
|
|
очищая буфер при успешной отправке.
|
|
|
|
GET /<group>/<clientid>/mass/over HTTP/1.1
|
|
|
|
Ответ сервера - такой же, как на запрос /domains - новый список доменов для работы.
|
|
При неожиданном ответе (пустой список, код ошибки итд) модуль переходит на холостой ход (сканирование остановлено)
|
|
и делает тот же самый запрос раз в 10 минут (время - в константу).
|
|
|
|
Все необходимые настройки сканер получает запросами:
|
|
GET /<group>/<clientid>/mass/имянастройки HTTP/1.1
|
|
|
|
Следует вынести в админку основные настройки оригинальной программы
|
|
TODO Эти настройки будем добавлять по месту - сейчас трудно сказать, какие именно из них понадобятся.
|
|
|
|
|
|
АДМИНКА
|
|
|
|
Админка требует доработки состоит в определении правила разбиения общего диапазона на куски.
|
|
Пользователь вводит диапазоны тем или иным образом (либо в обычные текстовые поля ввода, либо загружает списки в виде текстовых файлов).
|
|
Задача админки - разбить эти диапазоны в большее количество меньших по размеру диапазонов, так чтобы сканирование одного суб-диапазона занимало не более часа на самой слабой машине,
|
|
и чтобы диапазонов было заведомо больше, чем ботов онлайн (всегда был резерв суб-диапазонов для выдачи).
|
|
Общий принцип - чем меньше размер суб-диапазона, тем лучше.
|
|
|
|
Ввод пользователем диапазонов для сканирования состоит из двух полей:
|
|
- диапазон адресов
|
|
- диапазон портов
|
|
|
|
Синтаксис диапазонов обычный для сетевых сканеров:
|
|
1. можно указывать отдельные адреса через , 10.0.0.1,10.0.0.2
|
|
2. можно указывать подсеть через число значащих бит 10.0.0.0/8
|
|
3. можно указывать начало и конец через тире 10.0.0.1-10.0.0.120
|
|
4. то же для портов, кроме пункта 2
|
|
5. можно задавать множество диапазонов. Тогда они объединяются по ИЛИ
|
|
|
|
Интерфейс пользователя админки должен разрешать ввод диапазонов с учетом вышесказанного.
|