Статья OT пентест критической инфраструктуры: kill chain от корпоративной сети до ПЛК

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


По данным IBM X-Force Threat Intelligence Index 2025, 70% расследованных инцидентов затронули объекты критической инфраструктуры. За последние два года я провёл восемь проектов по оценке защищённости OT-сегментов - на шести из них путь от корпоративного VLAN до ПЛК, управляющего подачей теплоносителя, проходил через единственный неуправляемый коммутатор без ACL. Ни промышленного файрвола, ни ICS-IDS, ни SPAN-порта для зеркалирования. Один L2-свитч - и ты уже в одном широковещательном домене с контроллером, который крутит насосную станцию.

Дальше - полный kill chain OT-пентеста: от пассивной разведки SCADA-систем до отправки Modbus Write-команды на контроллер, с привязкой к MITRE ATT&CK и объяснением, почему один неосторожный пакет останавливает турбину.

Бизнес-логика атаки на промышленные системы управления​

Атака на IT - кража данных или шифрование файлов. Атака на OT - физическое воздействие на реальный мир: остановка энергоснабжения, изменение состава химической смеси, разрушение турбины через превышение допустимых оборотов. Три категории мотивации, объясняющие рост инцидентов OT кибербезопасности:

Саботаж и кинетический эффект. Кампании TRITON/TRISIS (атака на системы противоаварийной защиты SIS нефтехимического предприятия) и Industroyer/CrashOverride (отключение подстанций энергосети) показали: APT-группы целенаправленно пишут малварь под промышленные протоколы. Фреймворк PIPEDREAM/INCONTROLLER - модульный набор для атаки на ПЛК Schneider Electric и Omron через CODESYS и OPC-UA - первый публично известный ICS-фреймворк с кроссплатформенной поддержкой контроллеров разных вендоров. Именно он показал, что state-sponsored группам больше не нужно писать отдельный модуль под каждый ПЛК.

Вымогательство с физическим рычагом. Согласно Verizon DBIR 2025, рост ransomware-инцидентов в SMB составил 18% год к году. Простой конвейера стоит десятки тысяч долларов в час - мотивация платить выкуп куда выше, чем у офисной компании с бэкапами.

Шпионаж. Конфигурации ПЛК, уставки технологических параметров, схемы техпроцесса - разведывательная ценность для state-sponsored групп. Доступ к инженерной станции даёт полную карту технологического процесса без эксплуатации уязвимостей контроллера. Зачем ломать ПЛК, если можно просто прочитать проект в TIA Portal?

Для пентестера понимание мотивации определяет глубину проверки: заказчик хочет знать, может ли атакующий повлиять на физический процесс, а не просто получить domain admin.

ICS безопасность vs IT: ключевые отличия OT-пентеста​

Modbus, DNP3 и S7comm: промышленные протоколы без аутентификации​

В IT протокол без аутентификации - аномалия. В OT - норма. Modbus TCP (порт 502), основанный на оригинальном протоколе Modbus 1979 года и опубликованный как открытая спецификация Modbus/TCP в 1999 году (Schneider Electric / Modicon), архитектурно не содержит механизмов аутентификации, шифрования и контроля целостности. Протоколу 45 лет, и он до сих пор работает "в чём мать родила". Если атакующий получил сетевой доступ к сегменту с ПЛК - он шлёт команды напрямую:
  • FC1 (Read Coils) - чтение дискретных выходов
  • FC3 (Read Holding Registers) - чтение регистров хранения (уставки температуры, давления)
  • FC5 (Write Single Coil) - переключение дискретного выхода (клапан, реле)
  • FC6 (Write Single Register) - изменение уставки (температура, давление, скорость)
  • FC15/FC16 (Write Multiple Coils/Registers) - массовая запись
Никакого пароля, токена, challenge-response. DNP3 (порт 20000) поддерживает Secure Authentication (DNP3-SA, определён в IEEE 1815-2012, актуальная версия SAv5), но большинство инсталляций работают без неё - включение SA ломает совместимость со старыми RTU, и никто не хочет это трогать. S7comm (порт 102, Siemens) имеет механизм паролей на CPU - дефолтный пароль чаще всего пустой, а для S7-300/400 протокол передаёт пароль в слабо обфусцированном виде (тривиально восстанавливается из дампа трафика через Wireshark).

Физический импакт и слепые зоны мониторинга​

АспектIT-пентестOT-пентест
Цель kill chainDomain admin, exfiltrationВоздействие на физический процесс
Ошибка сканированияАлерт в SIEMОстановка ПЛК, физическая авария
Аутентификация протоколовKerberos, NTLM, OAuthОтсутствует (Modbus) или пустой пароль (S7)
Патч-менеджментЕжемесячные обновленияРаз в 3-5 лет (реквалификация ПО)
Endpoint protectionCrowdStrike Falcon, SentinelOneлюбой endpoint protection - на ~30% станций
Сетевой мониторингSIEM на каждом сегментеClaroty/Dragos - на 15-20% объектов
Lateral movementExploit, mimikatz, pass-the-hashПрямой сетевой доступ к ПЛК без эксплоита

[Применимо: внутренний пентест, legacy OT-инфраструктура]

CrowdStrike Falcon или SentinelOne на Windows-инженерной станции увидят подозрительный процесс, но Modbus FC16 (Write Multiple Registers), идущий мимо станции напрямую к ПЛК - для них невидимка. Специализированные OT-платформы - Claroty, Dragos Platform, Nozomi Guardian, PT Industrial Security Incident Manager - анализируют зеркалированный трафик пассивно. По моему опыту, они развёрнуты на 15-20% объектов КИИ. Остальные - полная слепота в промышленном сегменте.

Kill chain на объекте критической инфраструктуры: от DMZ до ПЛК

1781381796210.webp

Контекст проекта: grey box, внутренний пентест значимого объекта КИИ (теплоснабжающая организация), ПЛК Siemens S7-300 на подстанциях. Модель Purdue: Level 4-5 (Enterprise) -> Level 3 (DMZ) -> Level 2 (Supervisory/HMI) -> Level 1 (Control/ПЛК) -> Level 0 (Physical Process). На бумаге - красивая сегментация. На практике граница между Level 3 и Level 2 - неуправляемый коммутатор без VLAN.

Разведка промышленного сегмента: SCADA fingerprinting

MITRE ATT&CK: Network Service Discovery (T1046, Discovery)

Перед отправкой первого пакета в OT-сегмент - пассивная разведка, не генерирующая трафик к цели:

Shodan и Censys. Запрос port:502 country:RU возвращает устройства с открытым Modbus TCP. Характерные порты промышленных протоколов: 502 (Modbus), 102 (S7comm), 4840 (OPC-UA), 20000 (DNP3), 47808 (BACnet), 44818 (EtherNet/IP). Отдельный класс целей - ATG-системы (Automatic Tank Gauging) на АЗС, регулярно торчащие в интернет. SSL-сертификаты SCADA-серверов через Censys или crt.sh раскрывают организацию, hostname и версию ПО в поле CN.

GitHub dorks. Запросы filename:plc_config, filename:*.pcap modbus - разработчики коммитят дампы конфигураций и захваченный промышленный трафик в публичные репозитории. Бесплатная разведка, от которой не защитишься файрволом.

Вакансии на hh.ru. Описание позиции "инженер АСУ ТП" содержит конкретные модели ПЛК и SCADA-систем - fingerprinting ещё до первого пакета. Мой любимый OSINT-источник для OT: заказчик сам публикует свой стек на сайте поиска работы.

[Применимо: внешний пентест, black box - трафик к цели не генерируется]

Активное сканирование. После согласования scope - осторожное сканирование ICS-сегмента.

Требования к окружению: Kali Linux или любой GNU/Linux дистрибутив, nmap 7.80+ (поддержка NSE-скриптов для ICS), сетевой доступ к OT-сегменту через VPN или согласованную точку подключения, RAM от 4 ГБ. Сканирование выполняется строго с выделенного IP, согласованного с заказчиком.
Bash:
# Сканирование ICS-сегмента с rate limiting
nmap -sS --min-rate 100 --max-rate 300 \
  -p 102,502,4840,20000,44818,47808 \
  --script modbus-discover,s7-info \
  --script-timeout 30s \
  192.168.100.0/24 -oA ics_scan
Параметр --max-rate 300 - не для красоты, а чтобы не положить ПЛК. Сканируем только порты промышленных протоколов, не весь диапазон 1-65535. Версионное сканирование (-sV) намеренно исключено: его probe-пакеты провоцируют аварийное поведение legacy-контроллеров (на одном проекте S7-300 ушёл в STOP от -sV - пришлось ехать на объект и перезапускать руками). NSE-скрипт modbus-discover по умолчанию использует FC1 (Read Coils) для обнаружения устройств; с аргументом modbus-discover.aggressive=true перебирает Unit ID 0–246, включая FC17 (Report Slave ID) - стандартные безопасные операции чтения. Скрипт s7-info идентифицирует Siemens S7 через S7comm (COTP + Read SZL), возвращая модель, серийный номер и версию прошивки.

Ограничения: modbus-discover работает только с устройствами, реализующими расширенную идентификацию. Старые ПЛК с поддержкой лишь базовых FC1-FC6 не ответят - для них нужна ручная отправка FC1 (Read Coils) через mbtget. S7-300 имеет ограничение на количество одновременных PG/OP-соединений (обычно 1-2), запуск s7-info занимает слот и может вытеснить активную сессию инженерной станции независимо от версии прошивки - запускать строго в окне обслуживания.

Initial access: SCADA-интерфейсы и дефолтные учётные данные​

MITRE ATT&CK: Exploit Public-Facing Application (T1190, Initial Access)

Типичная точка входа - web-интерфейс SCADA или HMI, опубликованный в корпоративную сеть, а иногда - прямо в интернет. Панели Wonderware InTouch, Ignition Gateway, WinCC WebNavigator - legacy-код десятилетней давности. SQL-инъекции в формах аутентификации SCADA-серверов - не теория, а реальность, а WAF перед таким интерфейсом я встречал ровно один раз за восемь проектов. Обычно HTTP без TLS на нестандартном порту. Стандартный инструментарий работает: sqlmap с --tamper для обхода фильтрации, Burp Suite для ручного анализа. По данным Mandiant M-Trends 2025, exploits - наиболее распространённый вектор initial access (38% всех расследованных инцидентов, не только OT/SCADA).

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

MITRE ATT&CK: Valid Accounts (T1078, Initial Access / Persistence / Privilege Escalation / Defense Evasion)

Дефолтные учётные записи - системная боль промышленных систем управления. Пароли admin:admin на HMI-станциях, OPERATOR:OPERATOR на инженерных станциях, общие Windows-учётки на машинах АСУ ТП, не менявшиеся годами. Причина понятна: смена пароля на инженерной станции может потребовать перенастройки проекта ПЛК - простой на часы. На production боятся менять, и это объяснимо. Но admin:admin - это не пароль, это приглашение. По данным CrowdStrike Global Threat Report 2025, 75% вторжений используют действительные учётные данные.

Lateral movement в OT-сети и credential access

MITRE ATT&CK: Exploitation of Remote Services (T1210, Lateral Movement)

Lateral movement в OT-среде часто не требует эксплуатации уязвимостей в привычном смысле. Модель Purdue предполагает сегментацию, но на практике граница между корпоративной DMZ и промышленным сегментом - один L2-свитч. Двигаться некуда - ты уже там.

Ключевой pivot point - компрометация легитимной инженерной станции. Сценарий: атакующий из корпоративной сети получает доступ к рабочей станции инженера АСУ ТП (RDP с украденными кредами, фишинг, эксплуатация непропатченного SMB). У станции два сетевых интерфейса - корпоративный VLAN и OT-сегмент. Все запросы к ПЛК с её IP - легитимны для мониторинга. Идеальный pivot. Среднее время breakout (от initial access до первого lateral movement) по данным CrowdStrike GTR 2025 - 62 минуты, рекорд - 51 секунда.

MITRE ATT&CK: OS Credential Dumping - LSASS Memory (T1003.001, Credential Access)

Инженерные станции - Windows-машины с Step 7 или TIA Portal. Часто Windows 7/10 без актуальных патчей: обновление ОС требует реквалификации ПО АСУ ТП, которая занимает месяцы. Credential dumping через ProcDump (дамп LSASS.exe) или comsvcs.dll через rundll32 - стандартные техники, работающие как часы на незащищённых станциях.

Предусловия: Windows без Credential Guard, endpoint protection отсутствует или в мониторинг-режиме. Не работает если: Kaspersky Industrial CyberSecurity for Nodes в режиме блокировки, Credential Guard включён (редкость на инженерных станциях), LSA Protection активна. По моему опыту, endpoint protection установлен на 30% инженерных станций - на остальных Windows Defender в дефолте или отключённый антивирус.

Что даёт credential access: учётные данные domain admin (инженеры логинятся в корпоративный AD), пароли к проектам ПЛК (Step 7 хранит пароли CPU в файле проекта), пароли к HMI-серверам.

Воздействие на физический процесс: SCADA атаки через Modbus Write

Здесь IT-kill chain заканчивается: domain admin получен, отчёт написан, все жмут руки. В OT-пентесте ключевой вопрос другой: может ли атакующий повлиять на физический процесс?

С сетевым доступом к ПЛК через Modbus TCP:
  1. Чтение состояния - FC3 (Read Holding Registers) возвращает уставки температуры, давления, расхода
  2. Изменение уставок - FC6 (Write Single Register) задаёт новое значение параметра
  3. Переключение выходов - FC5 (Write Single Coil) открывает/закрывает клапаны
  4. Массовая перезапись - FC16 (Write Multiple Registers) меняет блок регистров
Для Siemens S7: S7comm позволяет загрузить новый блок кода (OB/FC/FB) в CPU, изменив логику управления. На S7-1200/1500 с включённым Access Level требуется пароль. На S7-300/400 - чаще всего нет.

Верификация доступа на демонстрационном стенде (не production):
Bash:
# Пример для демонстрации концепции - верификация Modbus-доступа
# FC3 Read Holding Registers, slave_id=1, start_addr=100
mbtget -r3 -a 100 -n 1 -u 1 192.168.100.10
# Адресация в mbtget - 1-based, соответствует нотации Modicon:
# -a 100 = holding register 40100. PDU-адрес (на проводе) = указанный − 1.
# На Siemens S7 с CP-модулем сверять с маппингом.
На production запись не выполняется. OT-пентест демонстрирует возможность воздействия, не реализует его. В отчёте фиксируется: "Подтверждена возможность отправки FC5/FC6 на ПЛК [модель], сетевая фильтрация отсутствует, аутентификация Modbus не реализована". Заказчику этого хватает - он и так понимает, что FC6 на регистр уставки давления при отсутствии SIS = авария.

OPSEC при атаках на АСУ ТП: evasion в промышленных сетях​

1781381846486.webp

В IT evasion - обход EDR через indirect syscalls, unhooking ntdll, sleep mask. В OT evasion - не убить физический процесс и не сгенерировать алерт в промышленной системе мониторинга. Приоритеты другие.

Что детектирует Claroty (xDome, CTD): новый IP в OT-сегменте (baseline anomaly), Modbus FC17/FC43 с нехарактерного источника, Write-команды (FC5/FC6/FC15/FC16) с адреса вне whitelist, нехарактерная частота опроса (polling rate anomaly).

Что детектирует Dragos Platform: сканирование портов промышленных протоколов (даже с низким rate), обращение к ПЛК с IP вне whitelist, изменение конфигурации ПЛК (загрузка блока кода).

Тактика обхода - работа через скомпрометированную инженерную станцию:
  1. IP инженерной станции - в whitelist, обращения к ПЛК штатны
  2. Polling rate - как у HMI: опрашивать с той же частотой (обычно 500 мс)
  3. Инвентаризация без сканирования - через ARP-таблицу инженерной станции
  4. Function codes - те же, что использует HMI (обычно FC3 Read Holding Registers)
Когда evasion не работает: ICS-IDS с настроенными baseline-политиками и аналитиком, который их читает. Встречается на объектах КИИ 1-й категории значимости. Но даже тогда Read-операции с легитимного IP не генерируют алертов - триггерят только Write с нехарактерными значениями.

ДействиеПоследствие
nmap -sV на порт 102 (S7comm)S7-300 может перейти в STOP
nmap -T4 -p- в OT-сегментеПерегрузка ПЛК, потеря связи с HMI
Фаззинг Modbus на productionНепредсказуемое поведение физического процесса
FC16 без понимания техпроцессаФизическое повреждение оборудования

Эту таблицу я показываю каждому заказчику перед началом работ. Обычно после строки про "физическое повреждение оборудования", вопрос "а можно мы не будем сегментировать?" отпадает сам собой.

OT threat hunting: что видит и чего не видит blue team​

📚 Часть контента скрыта. Этот материал доступен участникам сообщества с рангом One Level или выше
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме

Девять из десяти OT-пентестов на российском рынке останавливаются на этапе "нашли дефолтный пароль и прямой маршрут до ПЛК". Заказчик получает отчёт, ставит галочку для регулятора - и продолжает работать как раньше. Реальный OT-пентест с полной kill chain до демонстрации возможности записи в регистры контроллера - редкость. Причина не в квалификации пентестеров, а в страхе заказчика: воздействие на production - это риск простоя, а простой на объекте теплоснабжения зимой - прямая угроза людям.

Индустрия любит обсуждать TRITON и PIPEDREAM на конференциях. На практике для компрометации подавляющего большинства объектов КИИ второй-третьей категории не нужен state-sponsored фреймворк - достаточно nmap с NSE-скриптом и сетевого доступа к несегментированной подсети. Средний breakout time по данным CrowdStrike - 62 минуты. В OT без сегментации двигаться некуда: всё в одном VLAN, ПЛК отвечает на любой Modbus-запрос с любого IP.

Через два-три года ситуация начнёт меняться: регуляторные требования ужесточаются, бюджеты на промышленную кибербезопасность растут, вендоры OT-мониторинга наращивают присутствие. Но сегодня главный защитный механизм промышленного сегмента - air gap, нарисованный на схеме и не реализованный физически. Один патч-корд в серверной - и корпоративная сеть сливается с OT. Проверьте свою схему сети, а потом пройдите в серверную и посмотрите, как оно на самом деле. Если увидите неуправляемый свитч между корпоративным и промышленным сегментом - у вас та же проблема, что и у шести из восьми моих заказчиков.
 
Последнее редактирование модератором:
Мы в соцсетях:

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

Похожие темы

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

HackerLab