На 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 > Availability | Safety > 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-среде у этой цепочки своя специфика:- Reconnaissance - Vulnerability Scanning (T1595.002, Reconnaissance): Shodan, Censys, пассивный OSINT по vendor-документации. Ищем публично доступные HMI, web-интерфейсы ПЛК, открытые порты 502 (Modbus), 102 (S7comm), 44818 (EtherNet/IP).
- Discovery - Network Service Discovery (T1046, Discovery): активное или пассивное обнаружение устройств внутри OT-сегмента. Redpoint NSE, PLCScan, пассивный перехват Wireshark.
- Initial Access - Exploit Public-Facing Application (T1190) или Default Accounts (T1078.001): web-интерфейсы HMI с дефолтными паролями, незапатченные SCADA-серверы на Windows, VPN-точки входа подрядчиков.
- Credential Access - Network Sniffing (T1040): перехват нешифрованного Modbus/DNP3 трафика, извлечение значений регистров и команд управления в plaintext.
- Lateral Movement - Exploitation of Remote Services (T1210): переход из корпоративной сети через DMZ в OT-сегмент. Часто - через скомпрометированную инженерную рабочую станцию с двумя сетевыми интерфейсами.
- Impact - Transmitted Data Manipulation (T1565.002) или Service Stop (T1489): запись значений в регистры ПЛК, остановка контроллера, модификация логики управления.
Пассивная разведка: fingerprinting промышленных протоколов
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 identificationenip-info.nse- fingerprint Allen-Bradley и других EtherNet/IP устройствdnp3-info.nse- идентификация DNP3 outstationsfox-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 PLC | Grey/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 систем: от дефолтных учёток до записи в регистры
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-сегмент» разбирают на практике с реальными эмуляторами ПЛК.
Последнее редактирование модератором: