Распечатанная схема протокола Modbus на плотной бумаге цвета слоновой кости. Перьевая ручка лежит поперёк листа, рядом латунный пресс-папье; мягкий дневной свет подчёркивает фактуру бумаги.


На assessment'е одного промышленного объекта с контроллерами Siemens S7-300 я запустил Nmap без --max-rate - обычный SYN-скан, который в корпоративной сети отработал бы за минуту и ни один IDS не моргнул бы. Контроллер перестал отвечать на запросы HMI через 40 секунд. Оператор увидел пустой экран и нажал кнопку аварийной остановки. Простой - 22 минуты, пока инженеры перезагружали ПЛК вручную. С тех пор каждый пентест SCADA систем начинается для меня не с запуска инструментов, а с понимания того, что именно стоит на другом конце кабеля и как оно реагирует на лишний пакет.
--max-rate ограничивает количество пакетов, отправляемых Nmap в секунду.
Intrusion Detection System (IDS) - это инструмент кибербезопасности, который отслеживает сетевой трафик или активность системы на предмет вредоносных действий.
HMI - панель управления или экран, соединяющий человека с системой.
ПЛК - программируемый логический контроллер.

Тестирование на проникновение АСУ ТП vs IT-пентест: почему это разные дисциплины​

Тестирование на проникновение АСУ ТП - это моделирование кибератаки на промышленные системы для выявления уязвимостей до того, как ими воспользуются злоумышленники.
Разница между IT и OT - не в инструментах и не в протоколах. Разница в последствиях ошибки. В IT-сети упавший сервер перезагружают за минуту, максимальный ущерб - потеря данных. В OT-среде неправильная команда в holding register ПЛК физически меняет состояние оборудования: открывает клапан, останавливает насос, меняет скорость вращения турбины. По данным IBM X-Force, 70% инцидентов, расследованных X-Force в 2024 году, затронули критическую инфраструктуру - и именно физические последствия делают эти атаки настолько разрушительными.

Технические отличия, которые ломают привычную методологию пентеста:

ПараметрIT-средаOT/SCADA-среда
Приоритет защитыConfidentiality > Integrity > AvailabilitySafety > Availability > Integrity
Цикл патчейДни-неделиМесяцы-годы (окна обслуживания)
Аутентификация протоколовTLS, Kerberos, OAuthОтсутствует (Modbus, DNP3 - plaintext)
EDR/антивирусСтандартРедкость (real-time constraints PLC)
Допустимая нагрузка при сканеВысокая (сервер обработает тысячи SYN/сек)Критически низкая (ПЛК может зависнуть от 50 пакетов/сек)
Срок жизни оборудования3-5 лет15-25 лет
СегментацияVLAN, ACL, microsegmentationЧасто - flat network или формальный firewall на границе с IT

Протокол Modbus TCP, который остаётся стандартом де-факто для большинства промышленных установок, не имеет аутентификации на уровне протокола. Вообще. Любой узел в сети, способный отправить TCP-пакет на порт 502, может выполнить function code 0x06 (Write Single Register) или 0x10 (Write Multiple Registers) - и ПЛК исполнит команду без вопросов. Это не уязвимость - это архитектура протокола, спроектированного в 1979 году для изолированных серийных шин. С DNP3 (порт 20000) ситуация аналогичная: даже с включённым Secure Authentication (SA) - что встречается в единичных процентах инсталляций - реализация часто содержит ошибки конфигурации.

Для наглядности: атака TRITON (2017) на контроллеры Triconex 3008 показала, что перепрограммирование SIS-контроллера (Safety Instrumented System) позволяет атакующему отключить защитные механизмы перед последующей атакой на DCS. В том случае ошибка в payload вызвала аварийную остановку и привела к обнаружению - повезло. Industroyer (2016), атаковавший энергосистему Украины, использовал легитимные команды промышленных протоколов (IEC 60870-5-101, IEC 60870-5-104, IEC 61850, OPC DA) для размыкания выключателей подстанций - штатные function codes, отправленные в нужный момент, плюс DoS-модуль для Siemens SIPROTEC через CVE-2015-5374, выводивший защитные реле из строя.

Kill chain ICS-пентеста: маппинг на MITRE ATT&CK

Прежде чем запускать сканер, нужно понимать полную цепочку: от первого пакета до демонстрации impact. В ICS-среде у этой цепочки своя специфика:
  1. Reconnaissance - Vulnerability Scanning (T1595.002, Reconnaissance): Shodan, Censys, пассивный OSINT по vendor-документации. Ищем публично доступные HMI, web-интерфейсы ПЛК, открытые порты 502 (Modbus), 102 (S7comm), 44818 (EtherNet/IP).
  2. Discovery - Network Service Discovery (T1046, Discovery): активное или пассивное обнаружение устройств внутри OT-сегмента. Redpoint NSE, PLCScan, пассивный перехват Wireshark.
  3. Initial Access - Exploit Public-Facing Application (T1190) или Default Accounts (T1078.001): web-интерфейсы HMI с дефолтными паролями, незапатченные SCADA-серверы на Windows, VPN-точки входа подрядчиков.
  4. Credential Access - Network Sniffing (T1040): перехват нешифрованного Modbus/DNP3 трафика, извлечение значений регистров и команд управления в plaintext.
  5. Lateral Movement - Exploitation of Remote Services (T1210): переход из корпоративной сети через DMZ в OT-сегмент. Часто - через скомпрометированную инженерную рабочую станцию с двумя сетевыми интерфейсами.
  6. Impact - Transmitted Data Manipulation (T1565.002) или Service Stop (T1489): запись значений в регистры ПЛК, остановка контроллера, модификация логики управления.
Бизнес-логика атаки на SCADA проста: злоумышленник не крадёт данные - он получает контроль над физическим процессом. Для ransomware-групп это рычаг давления (остановленное производство = миллионные убытки в час). Для APT-групп - потенциальное физическое разрушение инфраструктуры. По данным Mandiant M-Trends 2025, exploits остаются наиболее распространённым вектором initial access (38% расследований). По данным IBM X-Force 2025, средний разрыв между публикацией CVE и применением патча - 29 месяцев. В OT-среде, где патчить оборудование годами невозможно, этот разрыв ещё критичнее.

Пассивная разведка: fingerprinting промышленных протоколов​

1780628676611.webp

Shodan, Censys и OSINT​

Первый этап - понять, что видно снаружи. Shodan-запрос port:502 выдаёт тысячи устройств с открытым Modbus TCP по всему миру. Фильтрация по стране и вендору (port:502 country:RU product:Siemens) сужает выборку до конкретных инсталляций. Censys позволяет искать по SSL-сертификатам и баннерам web-интерфейсов HMI - часто на нестандартных портах (8080, 8443). Порт 102 (S7comm для Siemens S7) и 44818 (EtherNet/IP для Allen-Bradley) - дополнительные маркеры.

OSINT на этом этапе - не только сетевая разведка. Документация вендора (руководства по настройке конкретной модели ПЛК), публичные тендеры на поставку оборудования, резюме инженеров АСУ ТП на hh.ru - всё это даёт представление о стеке: какие контроллеры, какие SCADA-пакеты, какие версии firmware. Чем точнее fingerprint - тем безопаснее дальнейшее активное сканирование. На практике я трачу на пассивную разведку больше времени, чем на активную фазу - и это окупается.

Перехват трафика в OT-сегменте​

[Применимо: внутренний пентест, grey/white box, после получения доступа к OT VLAN]

Пассивный перехват - самый безопасный способ разведки внутри промышленной сети. Wireshark с фильтром modbus или s7comm на зеркалированном порту коммутатора показывает всю картину без отправки ни одного пакета. В Modbus TCP каждый фрейм содержит Unit ID (адрес slave-устройства), function code и данные регистра - в plaintext. Просто сиди и слушай.

Фильтр modbus.func_code == 3 в Wireshark покажет все Read Holding Registers запросы - по ним видно, какие регистры опрашивает SCADA-сервер, с какой частотой и от каких устройств. Фильтр modbus.func_code == 16 выявит Write Multiple Registers - это команды управления, которые меняют состояние оборудования. Понимание нормального baseline трафика критически важно до любых активных действий: если SCADA-сервер опрашивает ПЛК раз в секунду, а вы добавите 100 запросов в секунду - контроллер может не справиться с обработкой.

Для DNP3 (порт 20000) Wireshark-фильтр dnp3 раскрывает аналогичную картину: master-станция, outstation-адреса, типы объектов (binary input, analog input, binary output). EtherNet/IP (порт 44818) анализируется через фильтр enip - здесь видны CIP-сервисы и connected/unconnected messages.

Ограничение: пассивный перехват работает только при физическом или логическом доступе к сегменту OT-сети. Если коммутатор не настроен на зеркалирование порта (SPAN), вы увидите только broadcast-трафик. В production согласование SPAN-порта с инженерами АСУ ТП - обязательный шаг, без вариантов.

Сканирование ПЛК: Redpoint NSE-скрипты, PLCScan и Metasploit ICS модули​

Требования к окружению: Kali Linux 2024.x+ (или Debian-based), Nmap 7.94+, Metasploit Framework 6.x (входит в Kali), Python 3.8+ (для PLCScan), минимум 4 GB RAM. Для лабораторных тестов - изолированная сеть с тестовыми ПЛК или эмулятором (OpenPLC Runtime, GRFICSv2). В production - исключительно с письменного разрешения заказчика и в согласованное окно обслуживания.

Nmap с Redpoint NSE-скриптами для ICS​

[Применимо: внутренний пентест, grey/white box; в production - только с rate limiting]

Redpoint - набор NSE-скриптов для Nmap, заточенных под fingerprinting промышленных устройств. Место в kill chain: Discovery (T1046, Network Service Discovery). Скрипты отправляют минимальное количество пакетов, специфичных для каждого протокола, и парсят ответы.

Основные скрипты:
  • s7-info.nse - идентификация Siemens S7 PLC (модель, серия, firmware, имя модуля)
  • modbus-discover.nse - обнаружение Modbus-устройств и чтение device identification
  • enip-info.nse - fingerprint Allen-Bradley и других EtherNet/IP устройств
  • dnp3-info.nse - идентификация DNP3 outstations
  • fox-info.nse - Tridium Niagara (BMS/building automation)
  • omron-info.nse - контроллеры Omron FINS
Bash:
nmap -sT -p 102 --script s7-info  --max-rate 5 --max-retries 1  -oA scada_s7_scan  192.168.10.0/24
Ключевые флаги: -sT (полное TCP-соединение, не SYN-скан - SYN-flood опасен для ПЛК), --max-rate 5 (не более 5 пакетов в секунду - для production снижать до 1-2), --max-retries 1 (не перегружать повторными запросами). Вывод s7-info для Siemens S7-300 покажет Module Type, Serial Number, Plant Identification, firmware version - этого достаточно для поиска специфичных CVE в базе ICS-CERT.

Ограничение: даже с rate limiting Redpoint-скрипты отправляют active probes. Некоторые legacy-контроллеры (Siemens S7-200, GE Series 90-30) могут некорректно обрабатывать нестандартные запросы. Перед запуском в production - верифицировать с инженером, что конкретная модель ПЛК нормально реагирует на connection-попытки к порту 102/502 от неизвестного хоста. Я видел S7-200, который уходил в STOP от одного TCP connect на порт 102 - просто потому что не ожидал второго подключения.

PLCScan для инвентаризации ПЛК​

[Применимо: внутренний пентест, лабораторная среда; в production - с осторожностью]

PLCScan - Python-утилита для быстрого обнаружения Siemens S7 и Modbus-устройств в сети. Место в kill chain: Discovery (T1046). Работает просто: указываешь диапазон IP, получаешь список живых контроллеров с базовой информацией (тип CPU, серийный номер).

Запуск: python plcscan.py 192.168.10.0/24 сканирует подсеть и выдаёт обнаруженные ПЛК. Трафик минимален - утилита отправляет один-два запроса на порты 102 и 502 каждого хоста.

Ограничения: PLCScan поддерживает только S7comm и Modbus. Для Allen-Bradley, Omron, Schneider Electric - бесполезен. Рекомендую проверять текущий статус репозитория перед использованием: инструмент обновляется нерегулярно, и совместимость с новыми firmware может хромать.

Metasploit ICS модули​

[Применимо: лабораторная среда / полигон; в production - НЕ рекомендуется без полигона-двойника]

Metasploit Framework (активно поддерживается Rapid7, обновления выходят регулярно) содержит набор модулей в auxiliary/scanner/scada/ и auxiliary/admin/scada/ для работы с промышленными протоколами. Место в kill chain: от Discovery (сканеры) до Impact (модули управления).
Код:
msf6 > use auxiliary/scanner/scada/modbus_findunitid
msf6 auxiliary(scanner/scada/modbus_findunitid) > set RHOSTS 192.168.10.100
msf6 auxiliary(scanner/scada/modbus_findunitid) > set RPORT 502
msf6 auxiliary(scanner/scada/modbus_findunitid) > run
[*] Modbus Unit ID: 1 on 192.168.10.100:502
Модуль modbus_findunitid перебирает Unit ID (0-255) на указанном хосте - аналог обнаружения slave-адресов в Modbus-сети. Каждый запрос - один легитимный Modbus-фрейм, нагрузка минимальна.

Для демонстрации impact на полигоне (не в production): модуль auxiliary/admin/scada/modbus_client позволяет читать и записывать регистры ПЛК. Параметр ACTION переключается между READ_REGISTERS, WRITE_REGISTER и WRITE_COIL. Модуль типа auxiliary/admin/scada/multi_cip_command (точное имя S7-модуля стоит верифицировать через search scada в msfconsole) отправляет команды CPU STOP / CPU START - эквивалент физического переключателя режима на корпусе ПЛК.

Когда НЕ использовать: модули с write-функциональностью (modbus_client с ACTION=WRITE, siemens_s7_300_400_plc_control) категорически запрещены в production без полигона-двойника. Команда CPU STOP остановит контроллер мгновенно. Запись в holding register может изменить уставку давления, температуры или скорости - последствия непредсказуемы без знания конкретной программы ПЛК. Я однажды наблюдал, как коллега на полигоне записал 0 в регистр уставки давления - виртуальный насос «разогнался» до предела за секунды. В production это была бы авария.

Сравнение инструментов: когда что применять​

ИнструментПлюсыМинусыКогда использоватьКогда НЕ использовать
Nmap + Redpoint NSEГибкий timing; охват 6+ протоколов; интеграция с Nmap-экосистемойТребует ручной настройки rate; SYN-скан опасен для legacy PLCGrey/white box fingerprinting; обнаружение устройствProduction без rate limiting; legacy PLC (S7-200, GE 90-30)
PLCScanМинимальный трафик; быстрый результат; простой запускТолько S7comm и Modbus; нерегулярные обновленияПервичная инвентаризация S7/Modbus в лабеКак единственный инструмент; для Allen-Bradley/Omron
Metasploit ICSГотовые модули read/write; пост-эксплуатация; документацияWrite-модули деструктивны; часть модулей не обновляласьКонтролируемая эксплуатация на полигонеProduction напрямую; без понимания логики ПЛК

Эксплуатация уязвимостей SCADA систем: от дефолтных учёток до записи в регистры​

1780632478516.webp

Default Accounts - начало большинства цепочек​

[Применимо: внутренний пентест, любой уровень доступа]

Default Accounts (T1078.001, Initial Access / Defense Evasion / Persistence / Privilege Escalation) - вектор номер один в ICS-среде. Web-интерфейсы HMI (Siemens WinCC, Wonderware InTouch, AVEVA) регулярно встречаются с заводскими паролями: admin/admin, administrator/(пусто), user/user. Инженерные рабочие станции с TIA Portal или RSLogix часто имеют одну доменную учётку на весь отдел. VPN-подключения для вендорской поддержки - отдельная боль: временные учётки, выданные при пусконаладке, работают годами.

Проверка дефолтных учёток не создаёт нагрузки на ПЛК и безопасна даже в production. Начинать разумно с web-интерфейсов на портах 80/443/8080 и SSH/Telnet на инженерных станциях. Shodan часто выдаёт CVE для конкретной модели HMI прямо на странице результатов - экономит время на поиск эксплойтов.

Сценарий: компрометация через инженерную станцию​

[Применимо: внутренний пентест, grey box, lateral movement из корпоративного сегмента]

Самый реалистичный путь в OT-сегмент проходит не через прямую атаку на ПЛК, а через инженерную рабочую станцию. Типичная картина: Windows 10 с установленным TIA Portal, два сетевых интерфейса (один в корпоративную сеть, второй в промышленную), локальный администратор с предсказуемым паролем.

Цепочка: initial access в корпоративную сеть (фишинг, VPN credentials) -> lateral movement до инженерной станции (T1210, Exploitation of Remote Services) -> через второй интерфейс получаем доступ в OT-сегмент -> с инженерной станции ПЛК принимает команды как от легитимного оператора.

На инженерной станции обычно лежат: проекты TIA Portal с ladder logic, бэкапы конфигураций ПЛК, сохранённые VPN-профили, журналы подключений с IP-адресами всех контроллеров в сети. Это золотая жила для mapping всей OT-инфраструктуры без единого активного скана.

Запись в регистры: Transmitted Data Manipulation​

[Применимо: ТОЛЬКО лабораторная среда / полигон-двойник]

Transmitted Data Manipulation (T1565.002, Impact) - финальный шаг демонстрации: запись значения в holding register ПЛК через modbus_client или прямой Modbus-запрос. Function code 0x06 (Write Single Register) или 0x10 (Write Multiple Registers) меняет уставку, на которую опирается логика управления.

Пример: если register 40001 хранит уставку максимальной температуры реактора (скажем, 350°C), запись значения 9999 заставит контроллер «думать», что порог не достигнут, даже когда реальная температура критическая. В лабораторной среде это демонстрирует risk - в production это катастрофа.

Безопасность промышленных систем управления: работа в production​

Правила, которые нельзя нарушать​

Пентест OT-систем в production - не «аккуратнее просканировать». Это принципиально другой подход к каждому действию:
📚 Часть контента скрыта. Этот материал доступен участникам сообщества с рангом One Level или выше
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме

Заключение​

Есть устойчивое заблуждение, что OT-пентест сводится к тестированию корпоративного периметра с пометкой «пентест промышленного предприятия» в отчёте. В подавляющем большинстве русскоязычных материалов описывается именно этот сценарий - компрометация домена, получение доступа к АРМ администратора, скриншот рабочего стола как proof. Промышленная сеть при этом не тестируется вообще, «по причине высокой опасности для технологического процесса». Организация остаётся в неведении, что произойдёт, если атакующий всё-таки окажется в OT-сегменте.

Реальная оценка защищённости АСУ ТП начинается там, где заканчивается IT-пентест: на стыке корпоративной и промышленной сети, на инженерной станции с двумя интерфейсами, на web-интерфейсе HMI с паролем admin. Если assessment не включает хотя бы пассивную разведку OT-трафика и проверку дефолтных учёток на HMI - заказчик получает ложное чувство безопасности.

Я провёл около двадцати ICS-assessment'ов за последние три года. В каждом втором случае путь из корпоративной сети в OT занимал менее часа - через dual-homed инженерную станцию, через VPN-аккаунт подрядчика, который не отозвали после пусконаладки, или через SCADA-сервер на Windows Server 2012 с отключённым файрволом. При этом на бумаге сети были «полностью изолированы». Если вы заказываете тестирование на проникновение промышленного объекта и в scope не входит OT-сегмент - вы тестируете офис, а не завод. Разница между «мы проверили периметр» и «мы знаем, может ли атакующий остановить конвейер» - это разница между формальным отчётом и реальным пониманием рисков.

Тем, кто хочет копнуть в ICS-пентест, советую начинать с лаборатории на OpenPLC + GRFICSv2 и разбирать Modbus-трафик в Wireshark до тех пор, пока function codes не станут читаться как текст. На курсе WAPT эту связку «корпоративная сеть -> OT-сегмент» разбирают на практике с реальными эмуляторами ПЛК.
 
Последнее редактирование модератором:
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

🚀 Первый раз на Codeby?
Гайд для новичков: что делать в первые 15 минут, ключевые разделы, правила
Начать здесь →
🔴 Свежие CVE, 0-day и инциденты
То, о чём ChatGPT ещё не знает — обсуждаем в реальном времени
Threat Intel →
💼 Вакансии и заказы в ИБ
Pentest, SOC, DevSecOps, bug bounty — работа и проекты от проверенных компаний
Карьера в ИБ →

HackerLab