Статья Пентест АСУ ТП: kill chain от корпоративной сети до регистров контроллера

Схема kill chain АСУ ТП на плотной бумаге с пятью фазами атаки, нарисованными чёрным маркером. Латунное пресс-папье и перьевая ручка в мягком дневном свете.


На объекте нефтехимии в 2024 году задача звучала конкретно: проверить, доберётся ли атакующий из корпоративной сети до ПЛК, управляющих ректификационной колонной. Через 14 часов я читал holding-регистры контроллера через Modbus TCP - без единого алерта со стороны мониторинга. Путь пролёг через три DMZ-прыжка, одну забытую VPN-учётку инженера-наладчика и шлюз с паролем из трёх символов.

По данным IBM X-Force Threat Intelligence Index 2025, 70% зафиксированных атак в 2024 году затронули критическую инфраструктуру. Мой опыт это подтверждает: OT-сегменты - самое мягкое подбрюшье промышленных предприятий. И пентест АСУ ТП - единственный способ доказать это заказчику до реального инцидента. Не отчётом по 187-ФЗ, а конкретным маршрутом до регистров.

Чем пентест OT-сегмента отличается от IT на уровне инструментов и защит​

Разница не сводится к тезису «OT - про доступность, IT - про конфиденциальность». Для пентестера ключевые отличия лежат в трёх плоскостях: протоколы, детектирование и цена ошибки.

Протоколы без аутентификации​

Modbus TCP - стандарт де-факто для промышленных сетей - не предусматривает аутентификации. Вообще. Любой хост, добравшийся до порта 502/TCP, может отправить Function Code 03 (Read Holding Registers) или FC06 (Write Single Register) и получить ответ контроллера. DNP3 в базовой конфигурации тоже не шифрует трафик и не требует авторизации: опция Secure Authentication (SA) существует, но на большинстве объектов, где я работал, остаётся выключенной. Для сравнения: даже SMBv1 в IT-мире подразумевает идентификацию. Промышленные протоколы проектировались в эпоху физической изоляции, и аутентификация в них - опция, а не требование.

Конкретные Function Codes Modbus, которые проверяет пентестер при оценке защищённости ОТ-сетей:

FCНазначениеРиск при несанкционированном доступе
FC01Read Coils (дискретные выходы)Разведка состояния оборудования
FC03Read Holding RegistersЧтение параметров технологического процесса
FC05Write Single CoilУправление одним дискретным выходом
FC06Write Single RegisterИзменение одной уставки
FC15Write Multiple CoilsМассовое изменение состояния выходов
FC16Write Multiple RegistersПерезапись параметров процесса

FC01 и FC03 - разведка, маппится на Network Service Discovery (T1046, Discovery). FC05, FC06, FC15, FC16 - воздействие: Transmitted Data Manipulation (T1565.002, Impact) или Service Stop (T1489, Impact). На реальном тестировании на проникновение промышленных систем мы ограничиваемся Read-функциями, а возможность записи демонстрируем в отчёте - не выполняя её на живом оборудовании. Потому что цена ошибки здесь - не синий экран, а аварийный останов колонны.

Детектирование: Claroty и Nozomi Networks вместо CrowdStrike​

IT-SOC привык к CrowdStrike Falcon, SentinelOne, Elastic 8.x с kernel ETW-TI. В OT-сетях другой зоопарк: Claroty (CTD / xDome), Nozomi Networks (Guardian / Vantage), Dragos Platform. Работают они иначе - строят baseline разрешённых коммуникаций между устройствами и генерируют алерт на аномалию. Проблема в масштабе baseline: тысячи тегов с разной частотой обновления, и false positive - ежедневная реальность. На практике встречал объекты, где алерты Nozomi отключены на 80% правил из-за шума. Стандартные IT-EDR на OT-хостах - редкость: инженерные станции крутятся на Windows 7/10 LTSC без каких-либо агентов, а попытка воткнуть CrowdStrike на SCADA-сервер вызовет панику у цехового инженера.

Вывод для пентестера: evasion в OT-сети строится не на обходе хуков EDR, а на мимикрии под легитимный трафик. Если ваш Modbus-запрос выглядит как обычный цикл опроса HMI, Claroty его не заметит.

Реальные инциденты как ориентир TTP​

Атаки группировок Sandworm (Industroyer / Industroyer2 - энергосистемы Украины) и XENOTIME (TRITON / TRISIS - Safety Instrumented Systems нефтехимического объекта) показали полную цепочку: adversary целенаправленно проходит через IT-сеть, пересекает DMZ, добирается до инженерных станций и модифицирует логику контроллеров. По данным frenos.io: "Real-world attacks by groups like Volt Typhoon, Sandworm, and XENOTIME demonstrate that SCADA systems are primary targets for cyberattacks""Реальные атаки таких группировок, как Volt Typhoon, Sandworm и XENOTIME, показывают, что системы SCADA являются основными целями кибератак". Методология пентеста АСУ ТП воспроизводит этот kill chain в контролируемых условиях - от initial access через корпоративную сеть до демонстрации импакта на уровне процесса.

Recon и fingerprinting OT-периметра​

[Применимо: внешний пентест, black box]

Пассивная разведка​

Shodan и Censys индексируют промышленные протоколы. Запрос port:502 country:RU в Shodan возвращает Modbus-устройства с российскими IP-адресами. Более точные фильтры: product:"Schneider Electric" или product:"Siemens" с привязкой к ASN организации. За 30 минут OSINT-разведки обычно собирается список внешне доступных HMI, VPN-шлюзов инженеров и забытых веб-интерфейсов SCADA-серверов. На одном из проектов по промышленной кибербезопасности я нашёл через Shodan веб-панель WinCC с дефолтным паролем - объект даже не знал, что она торчит наружу.

Активное сканирование: polite timing или мёртвый ПЛК​

Nmap (активно поддерживается, регулярные релизы) с набором ICS-скриптов - основной инструмент fingerprinting. Но агрессивное сканирование убивает контроллеры: Siemens S7-300 (EOL, но массово распространён) известен тем, что зависает от SYN-flood на нестандартные порты. Положили контроллер - положили процесс. Так что аккуратность тут не вежливость, а необходимость.
Bash:
nmap -sT -p 102,502,20000,44818,47808 -T2 \
  --script modbus-discover,s7-info \
  --max-retries 1 --host-timeout 30s \
  192.168.100.0/24
Ключевые флаги: -sT вместо SYN-скана (full connect стабильнее для ПЛК), -T2 (polite timing), --max-retries 1, --host-timeout 30s. Порты: 102 (S7comm/Siemens), 502 (Modbus TCP), 20000 (DNP3), 44818 (EtherNet/IP), 47808 (BACnet). Скрипт modbus-discover отправляет FC17 (Report Slave ID) - безопасная Read-операция. Скрипт s7-info считывает идентификационные данные контроллера Siemens без записи.

Ограничение: Nmap NSE-скрипты для ICS покрывают только Modbus и S7comm. Для DNP3 и OPC UA нужны специализированные инструменты - модули Metasploit или утилиты из набора ISF (Industrial Security Framework). ISF - проект архивный (последнее обновление репозитория около 2020 года), применять с осторожностью и проверкой совместимости.

Когда техника НЕ работает: если OT-сегмент действительно air-gapped (физически изолирован, без единого IP-маршрута к корпоративной сети) - внешний recon бесполезен. В реальности полный air gap встречается редко: по моему опыту, на 9 из 10 объектов есть хотя бы одна неконтролируемая связность - USB-модем, забытый VPN-туннель, historian с ногой в обоих сегментах.

Initial access через DMZ: путь из IT в OT​

1781170887865.webp

[Применимо: внутренний пентест, grey box - заказчик выдал low-privileged учётную запись в корпоративном домене]

В реальных проектах аудит АСУ ТП почти никогда не начинается с нуля. Заказчик даёт доменную учётку, VPN-доступ и формулирует задачу: "Покажите, доберётесь ли до SCADA". Grey box - стандартный сценарий, ближе к реальной модели угроз. Согласно Verizon DBIR 2025, 38% утечек связаны с кражей учётных данных, а 36% инцидентов начинаются с фишинга - adversary не ломает периметр с нуля, а входит через легитимный канал.

Purdue Model как карта атаки

Purdue Model разделяет инфраструктуру на уровни - для пентестера это навигационная карта:
  • Level 5–4 - Enterprise / IT (корпоративная сеть, Active Directory, почта)
  • Level 3.5 - Industrial DMZ (historian, patch-сервер, jump-хост)
  • Level 3 - Site operations (SCADA-сервер, engineering workstation)
  • Level 2 - Area supervisory (HMI, операторские станции)
  • Level 1–0 - Basic control / Process (ПЛК, RTU, датчики, исполнительные механизмы)
Задача - пройти от Level 5 до Level 1. Каждый переход - проверка сегментации IT OT сетей.

Типовая цепочка​

Шаг 1. Privilege escalation в AD (Level 5->4). Стандартные техники: Kerberoasting, AS-REP Roasting, DPAPI-дамп. По данным кейса Angara Security, на реальном промышленном предприятии от low-privileged учётки до Domain Admin дошли "через типовые уязвимости Microsoft Active Directory". Default Accounts (T1078.001, Initial Access) - первая проверка: admin/admin, operator/operator, стандартные вендорские пароли контроллеров.

Шаг 2. Разведка внутри AD (Level 4). Ищем: файловые хранилища со схемами сети (Angara Security обнаружила "веб-сервер с аналитическими графиками по всем сегментам АСУ ТП"), учётные записи с доступом к DMZ, jump-хосты к OT-сегменту. LDAP-запросы по группам, содержащим SCADA, АСУ, OT, MES - часто дают прямые указания на целевые хосты. Это разведка, не атака - но именно она определяет вектор.

Шаг 3. Пересечение DMZ (Level 4->3.5->3). Historian или jump-хост - типичная точка перехода. На многих объектах historian доступен из обоих сегментов: ему нужны данные от SCADA и их отображение для корпоративных аналитиков. Exploit Public-Facing Application (T1190, Initial Access) - если historian имеет веб-интерфейс с известной уязвимостью. Альтернатива: RDP через jump-хост с перехваченными кредами. Безопасность критической информационной инфраструктуры на этом этапе зависит от одного вопроса: фильтруется ли трафик между Level 4 и Level 3 по портам и протоколам, или firewall стоит в режиме permit any. Спойлер: на большинстве объектов - permit any.

Шаг 4. Engineering workstation (Level 3->2). Exploitation of Remote Services (T1210, Lateral Movement). Инженерные станции часто недоменные - учётки AD не подходят. Angara Security описала работающий вектор: "Путём перебора учётных данных удалось найти те, что требовались для входа в целевые системы. Задачу облегчило то, что локальный администратор использовал одинаковые логины и пароли для нескольких систем, сохранённые в браузере". DPAPI-дамп с рабочих станций администраторов - основной источник кредов для недоменных хостов.

OPSEC: почему агрессивность убивает пентест​

  • Не сканируйте OT-подсети напрямую с IT-хоста. Любой трафик от IT-хоста в OT - аномалия для Claroty/Nozomi. Используйте pivoting через скомпрометированный хост в DMZ.
  • Не запускайте credential dumping на OT-хостах без согласования. LSASS-дамп на engineering workstation может повесить среду исполнения SCADA-клиента.
  • Rate limiting. В OT-сети пакеты идут с предсказуемой частотой (цикл опроса HMI: 500–2000 мс). Burst-трафик - мгновенный алерт. Держите payload на скорости, неотличимой от штатного обмена.
  • Не устанавливайте beacon/C2 на OT-хосты. Исходящий трафик из OT-сегмента на внешний IP - красный флаг для любого мониторинга. Работайте через уже захваченные IT-хосты в DMZ.

Эксплуатация промышленных протоколов: Modbus и не только​

1781170939348.webp

[Применимо: внутренний пентест, после получения доступа к OT-сегменту Level 2–1]

Когда вы добрались до сети, где живут ПЛК, начинается протокольная работа. Тут всё по-другому - никаких NTLM-хешей, никаких токенов. Голые регистры и function codes.

Обнаружение устройств через Metasploit​

Metasploit Framework (активно поддерживается Rapid7, регулярные обновления) содержит модули для ICS SCADA pentest:
Код:
msf6> use auxiliary/scanner/scada/modbusdetect
msf6 auxiliary(modbusdetect)> set RHOSTS 10.10.20.0/24
msf6 auxiliary(modbusdetect)> set THREADS 1
msf6 auxiliary(modbusdetect)> run
Модуль modbusdetect отправляет FC17 (Report Slave ID) - read-only операция. THREADS 1 - критично: параллельные запросы к нескольким ПЛК одновременно перегружают сетевой стек контроллера. Далее auxiliary/scanner/scada/modbus_findunitid определяет Unit ID устройств на каждом хосте.

Чтение регистров и пассивный сбор​

Network Sniffing (T1040, Credential Access / Discovery) в OT - не только перехват паролей, но и пассивный сбор данных процесса. Modbus-трафик передаётся открытым текстом: Wireshark с фильтром modbus покажет все запросы и ответы между HMI и ПЛК. Для активного чтения регистров - скрипты на Python (библиотека pymodbus) или GUI-инструменты вроде ModRSsim2.
Python:
from pymodbus.client import ModbusTcpClient
client = ModbusTcpClient('10.10.20.5', port=502)
client.connect()
result = client.read_holding_registers(address=0, count=10, slave=1)
print(result.registers)  # вот они, уставки процесса - в открытом виде
client.close()
Запись (write_register, write_coil) демонстрируется в отчёте как теоретическая возможность: на живом оборудовании выполняется только с явного разрешения инженера процесса и при наличии ручного override на ПЛК. Потому что "я случайно перезаписал уставку давления" - фраза, после которой карьера заканчивается.

Уровни импакта​

  • Transmitted Data Manipulation (T1565.002): подмена значений регистров для дезинформации оператора - он видит нормальные показания, а процесс выходит за пределы
  • Service Stop (T1489): запись некорректных уставок, приводящая к аварийному останову
  • Component Firmware (T1542.002, Persistence/Defense Evasion): модификация прошивки контроллера - наиболее серьёзный сценарий, реализованный в атаке TRITON/TRISIS группировкой XENOTIME

Другие протоколы​

OPC UA (порт 4840) - более современный протокол со встроенным шифрованием. Но на практике встречаются конфигурации с Security Policy = None (и встречаются часто). EtherNet/IP (порт 44818), PROFINET, IEC 60870-5-104 - для каждого нужны отдельные инструменты. Универсального сканера всех OT-протоколов не существует: это ограничение, с которым придётся жить и собирать тулкит под конкретный объект.

Минилаб для отработки OT-пентеста​

Требования к окружению​

  • ОС: Kali Linux 2024.x или Ubuntu 22.04+
  • RAM: минимум 8 ГБ (Kali + одна VM симулятора), рекомендуется 16 ГБ для полного стенда
  • Диск: 40 ГБ свободного пространства
  • Сеть: офлайн - все компоненты локальные
  • Софт: VirtualBox 7.x или VMware, Metasploit 6.x, Nmap 7.9+, Wireshark, Python 3.10+ с pymodbus
  • Симулятор: GRFICSv2 (Georgia Tech) - виртуальная среда с OpenPLC, ScadaBR HMI и симуляцией физического процесса
GRFICSv2 разворачивается через VirtualBox: три VM (контроллер OpenPLC, HMI ScadaBR, рабочая станция атакующего). На этом стенде отрабатывается полная цепочка: сканирование, обнаружение Modbus-устройств, чтение регистров, демонстрация записи - безопасно, на виртуальном процессе управления давлением в реакторе. Протоколы по-настоящему ощущаются, когда видишь отклик контроллера в Wireshark и можешь проследить каждый байт FC03-запроса. Теория - одно, а когда регистр возвращает 0x01F4 и ты понимаешь, что это 500 единиц давления - совсем другое.

Чеклист аудита OT-сегмента​

Нумерованный список для включения в отчёт по оценке защищённости ОТ-сетей:
📚 Часть контента скрыта. Этот материал доступен участникам сообщества с рангом One Level или выше
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме

Большинство проектов по пентесту АСУ ТП, которые я провожу, заканчиваются одним и тем же: техническая сегментация IT OT сетей на бумаге существует, а в реальности - нет. Инженер подключил USB-модем для удалённой поддержки. Historian смотрит одновременно в корпоративную сеть и в SCADA-сегмент без фильтрации. Jump-хост с паролем из трёх символов не менялся с момента пуско-наладки.

Промышленная кибербезопасность буксует не из-за отсутствия инструментов - Claroty, Nozomi, Dragos умеют детектировать аномалии. Она буксует из-за того, что OT-инженеры и ИБ-специалисты живут в параллельных вселенных. Первые уверены, что "воздушный зазор" работает. Вторые считают, что хватит firewall между Level 3 и Level 4 по Purdue Model. Ни одна из этих позиций не выдерживает целенаправленного тестирования длительностью в один рабочий день.

Пока защита промышленных протоколов не станет инженерной задачей с регулярной верификацией - а не разовым мероприятием ради отчёта по 187-ФЗ - уязвимости SCADA систем останутся кратчайшим маршрутом до физического воздействия на технологический процесс. Десять пунктов чеклиста выше и стенд GRFICSv2 дадут больше понимания, чем любой аудит АСУ ТП, проведённый по бумажной методике. Разверните стенд, пройдите цепочку от корпоративной сети до регистров - и покажите результат тому, кто принимает решения.
 
Последнее редактирование модератором:
Мы в соцсетях:

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

Похожие темы

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

HackerLab