Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
Инструменты/GitHubGitHub/k3ystr0k3r/modbus-scanner
Сканеры уязвимостейКартирование сетиСканирование портовБезопасность SCADA/ICSСбор информацииСетевая безопасность
GitHubk3ystr0k3r/modbus-scanner

modbus-scanner

Многопоточный сканер обнаружения Modbus/TCP, написанный на C с использованием libmodbus.

Репозиторий
52 дней назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Сканер обнаружения Modbus

Многопоточный сканер на C для обнаружения сервисов Modbus/TCP с использованием libmodbus.

Сканер не полагается только на открытый TCP-порт 502. Вместо этого он устанавливает соединение Modbus/TCP и отправляет запрос Modbus на прикладном уровне. Действительный ответ Modbus используется в качестве основного индикатора наличия сервиса Modbus.


Modbus/TCP

Modbus — это промышленный протокол связи, обычно используемый ПЛК, RTU, HMI, SCADA-системами, датчиками, счётчиками и другими промышленными устройствами.

Modbus/TCP передаёт прикладной протокол Modbus поверх TCP.

Стандартный порт Modbus/TCP:

root@kitploit:~
TCP/502

Типичный поток связи выглядит так:

root@kitploit:~
Сканер
   |
   | TCP-соединение → 502
   |
   | Запрос Modbus/TCP
   v
Устройство Modbus
   |
   | Ответ Modbus/TCP
   v
Сканер

В отличие от протоколов, которые предоставляют баннер сразу после подключения, Modbus/TCP обычно требует, чтобы клиент отправил действительный запрос Modbus, прежде чем устройство сформирует ответ на прикладном уровне.


Метод обнаружения

Сканер выполняет обнаружение в два этапа.

1. TCP-соединение

Сканер пытается установить TCP-соединение с:

root@kitploit:~
<цель>:502

Если соединение не может быть установлено, цель считается не отвечающей на Modbus/TCP.

Однако открытый порт TCP/502 сам по себе не считается достаточным доказательством наличия Modbus.

2. Зонд на прикладном уровне Modbus

После подключения сканер отправляет запрос Modbus с использованием libmodbus.

Основной зонд:

root@kitploit:~
modbus_read_input_registers(ctx, 0, 1, &reg);

Это формирует код функции Modbus:

root@kitploit:~
0x04 - Чтение входных регистров

Запрос просит цель вернуть один входной регистр, начиная с адреса 0.

Если цель возвращает действительный ответ Modbus, сканер считает сервис обнаруженным.


Структура пакета Modbus/TCP

Пакет Modbus/TCP состоит из:

root@kitploit:~
+----------------------+----------------------+
| Заголовок MBAP       | PDU                  |
+----------------------+----------------------+

Заголовок MBAP:
+------------------+
| Идентификатор транзакции | 2 байта
| Идентификатор протокола  | 2 байта
| Длина                   | 2 байта
| Идентификатор устройства | 1 байт
+------------------+

PDU:
+------------------+
| Код функции      | 1 байт
| Данные           | N байт
+------------------+

Заголовок MBAP специфичен для Modbus/TCP.


Основной пакет обнаружения

Первый зонд сканера использует код функции 0x04.

Пример запроса:

root@kitploit:~
00 01 00 00 00 06 01 04 00 00 00 01

Разбор:

root@kitploit:~
00 01        Идентификатор транзакции
00 00        Идентификатор протокола
00 06        Длина
01           Идентификатор устройства
04           Код функции
00 00        Начальный адрес
00 01        Количество

Идентификатор транзакции

root@kitploit:~
00 01

Идентифицирует транзакцию.

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

Идентификатор протокола

root@kitploit:~
00 00

Значение 0 идентифицирует Modbus.

Длина

root@kitploit:~
00 06

Указывает количество байтов, следующих за полем длины.

Идентификатор устройства

root@kitploit:~
01

Идентифицирует целевое устройство Modbus.

Код функции

root@kitploit:~
04

Код функции 0x04 означает:

root@kitploit:~
Чтение входных регистров

Начальный адрес

root@kitploit:~
00 00

Сканер начинает с адреса регистра 0.

Количество

root@kitploit:~
00 01

Сканер запрашивает один регистр.


Ожидаемый ответ

Успешный ответ на запрос содержит код функции 0x04 и данные запрошенного регистра.

Пример ответа:

root@kitploit:~
00 01 00 00 00 05 01 04 02 00 00

Разбор:

root@kitploit:~
00 01        Идентификатор транзакции
00 00        Идентификатор протокола
00 05        Длина
01           Идентификатор устройства
04           Код функции
02           Количество байтов
00 00        Значение регистра

Важная часть для обнаружения — то, что цель успешно обрабатывает запрос Modbus и возвращает действительный ответ на прикладном уровне Modbus.

Фактическое значение регистра зависит от устройства.


Почему порта 502 недостаточно

Простая проверка:

root@kitploit:~
TCP/502 = ОТКРЫТ

не обязательно доказывает, что сервис является Modbus.

Номера портов — это условности. Другое приложение может прослушивать TCP/502, а устройство Modbus также может вести себя по-разному в зависимости от его конфигурации.

Поэтому сканер использует:

root@kitploit:~
TCP-соединение
        +
Ответ протокола Modbus
        =
Обнаружение Modbus

Это делает обнаружение на прикладном уровне более значимым, чем простая проверка порта.


Запасное обнаружение

Некоторые устройства могут не отвечать на первоначальный запрос 0x04 из-за своей конфигурации регистров или поддерживаемых кодов функций.

Поэтому сканер пытается выполнить второй запрос, если первый не удался:

root@kitploit:~
modbus_read_bits(ctx, 0, 1, bits);

Это использует код функции:

root@kitploit:~
0x01 - Чтение катушек

Пример запроса:

root@kitploit:~
00 02 00 00 00 06 01 01 00 00 00 01

Разбор:

root@kitploit:~
00 02        Идентификатор транзакции
00 00        Идентификатор протокола
00 06        Длина
01           Идентификатор устройства
01           Код функции
00 00        Начальный адрес
00 01        Количество

Сканер считает цель обнаруженной, когда любая из операций Modbus получает успешный ответ.


Схема обнаружения

root@kitploit:~
             IP-адрес цели
                 |
                 v
          TCP-соединение
             порт 502
                 |
          +------+------+
          |             |
        Не удалось   Подключено
          |             |
          v             v
       Игнорировать  Функция 0x04
                        |
                 +------+------+
                 |             |
               Действителен  Не удалось
                 |             |
                 v             v
            MODBUS НАЙДЕН  Функция 0x01
                               |
                        +------+------+
                        |             |
                      Действителен  Не удалось
                        |             |
                        v             v
                   MODBUS НАЙДЕН    Нет обнаружения

Реализация

Сканер использует libmodbus для формирования и разбора пакетов Modbus/TCP, а не для ручного конструирования кадров протокола.

Основная операция:

root@kitploit:~
modbus_read_input_registers(ctx, 0, 1, &reg);

Если это не удаётся:

root@kitploit:~
modbus_read_bits(ctx, 0, 1, bits);

Затем соединение закрывается, а контекст libmodbus освобождается.

Это сохраняет обработку протокола внутри библиотеки Modbus, пока сканер обрабатывает:

  • Перечисление целей
  • Потоки
  • Управление соединениями
  • Обнаружение
  • Отслеживание прогресса
  • Запись результатов

Тайм-ауты

Сканер использует короткие тайм-ауты соединения и ответа:

root@kitploit:~
#define TIMEOUT_SEC 2

Это предотвращает блокировку рабочего потока на чрезмерное время одним недоступным или не отвечающим хостом.

Промышленные сети могут содержать устройства с относительно медленными ответами, поэтому значения тайм-аутов могут потребовать корректировки в зависимости от среды.


Многопоточность

Цели распределяются между несколькими рабочими потоками.

Например:

root@kitploit:~
Поток 1 → цели 1–64
Поток 2 → цели 65–128
Поток 3 → цели 129–192
Поток 4 → цели 193–254

Каждый рабочий поток независимо пытается выполнить обнаружение Modbus/TCP.

Это позволяет тестировать несколько хостов одновременно, а не ожидать каждую цель последовательно.


Важные соображения по обнаружению

Положительный результат означает, что цель успешно ответила на запрос Modbus, понятный сканеру.

Это не обязательно идентифицирует:

  • Производителя устройства
  • Модель устройства
  • Версию прошивки
  • Программу ПЛК
  • Содержимое регистров
  • Уязвимо ли устройство

Это отдельные задачи по снятию отпечатков или оценке.

Сканер в первую очередь является инструментом обнаружения сервисов Modbus/TCP.


Ограничения

Метод обнаружения намеренно консервативен.

Устройство может поддерживать Modbus, но не быть обнаруженным, если:

  • TCP/502 фильтруется
  • Межсетевой экран блокирует запрос
  • Устройство требует другой идентификатор устройства
  • Запрошенный код функции не поддерживается
  • Устройство не предоставляет запрошенный адрес
  • Устройство временно недоступно
  • Сетевая задержка превышает настроенный тайм-аут

Поэтому:

root@kitploit:~
Нет ответа ≠ Определённо не Modbus

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


Сборка

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

root@kitploit:~
make

Или напрямую:

root@kitploit:~
gcc -Wall -Wextra -O2 -o modbus modbus.c -lmodbus -lpthread

Запуск:

root@kitploit:~
./modbus -i 192.168.1.0 -s /24 -t 10 -o results.txt

Пример:

root@kitploit:~
[+] Modbus обнаружен: 192.168.1.20:502
[+] Modbus обнаружен: 192.168.1.42:502

[+] Просканировано: 254 | Найдено: 2 Modbus
[+] Результаты сохранены в: results.txt

Резюме

Сканер обнаруживает сервисы Modbus/TCP, выполняя фактическое взаимодействие с протоколом, а не полагаясь исключительно на обнаружение TCP-порта.

Процесс обнаружения:

root@kitploit:~
Подключиться к TCP/502
        ↓
Отправить код функции Modbus 0x04
        ↓
Получен действительный ответ Modbus?
        ↓
      ДА → Modbus обнаружен
        |
       НЕТ
        ↓
Отправить код функции Modbus 0x01
        ↓
Получен действительный ответ Modbus?
        ↓
      ДА → Modbus обнаружен
        |
       НЕТ
        ↓
   Нет обнаружения

Ключевой принцип прост:

Обнаруживайте протокол, а не только порт.

Скачать инструмент