На объекте нефтехимии в 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 | Назначение | Риск при несанкционированном доступе |
|---|---|---|
| FC01 | Read Coils (дискретные выходы) | Разведка состояния оборудования |
| FC03 | Read Holding Registers | Чтение параметров технологического процесса |
| FC05 | Write Single Coil | Управление одним дискретным выходом |
| FC06 | Write Single Register | Изменение одной уставки |
| FC15 | Write Multiple Coils | Массовое изменение состояния выходов |
| FC16 | Write 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
[Применимо: внутренний пентест, 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, датчики, исполнительные механизмы)
Типовая цепочка
Шаг 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 и не только
[Применимо: внутренний пентест, после получения доступа к 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 и симуляцией физического процесса
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 дадут больше понимания, чем любой аудит АСУ ТП, проведённый по бумажной методике. Разверните стенд, пройдите цепочку от корпоративной сети до регистров - и покажите результат тому, кто принимает решения.
Последнее редактирование модератором: