4840 - Pentesting OPC UA

Tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks

Базова інформація

OPC UA, що означає Open Platform Communications Unified Access, є критично важливим open-source протоколом, який використовується в різних галузях, таких як Manufacturing, Energy, Aerospace та Defence для обміну даними та управління обладнанням. Він унікально дозволяє обладнанню від різних vendor-ів взаємодіяти, особливо з PLC.

Його конфігурація дозволяє застосовувати сильні заходи безпеки, але часто для сумісності зі старішими пристроями ці заходи послаблюють, що відкриває системи для ризиків. Додатково, пошук OPC UA сервісів може бути складним, оскільки network scanners можуть їх не виявити, якщо вони працюють на нестандартних портах.

Порт за замовчуванням: 4840 (binary opc.tcp). Багато vendor-ів експонують окремі discovery endpoints (/discovery), HTTPS bindings (4843/443), або vendor-specific listener порти, такі як 49320 (KepServerEX), 62541 (OPC Foundation reference stack) та 48050 (UaGateway). Очікуйте кілька endpoints на хост, кожен з яких рекламує transport profile, security policy та user-token support.

Built-in NodeIdЧому це важливо
i=2253 (0:Server)Містить ServerArray, рядки постачальника/продукту та URI просторів імен.
i=2256 (ServerStatus)Показує uptime, поточний стан та, опціонально, build info.
i=2267 (ServerDiagnosticsSummary)Показує кількість сесій, перерваних запитів тощо. Чудово підходить для fingerprinting спроб brute-force.
i=85 (ObjectsFolder)Точка входу для обходу відкритих тегів пристрою, methods та alarms.
PORT     STATE SERVICE REASON
4840/tcp open  unknown syn-ack

Pentesting OPC UA

Щоб виявити проблеми безпеки в серверах OPC UA, проскануйте їх за допомогою OpalOPC.

opalopc -vv opc.tcp://$target_ip_or_hostname:$target_port

Плейбук виявлення та енумерації

  1. Знайти всі OPC UA транспорти
nmap -sV -Pn -n --open -p 4840,4843,49320,48050,53530,62541 $TARGET

Повторіть для UDP групових адрес, якщо середовище використовує LDS-ME мультикаст-виявлення.

  1. Фінгерпринт кінцевих точок
  • Виконайте FindServers/GetEndpoints по кожному транспорту, щоб зафіксувати SecurityPolicyUri, SecurityMode, UserTokenType, application URI та product рядки.
  • Перелічіть простори імен, щоб можна було розв’язати vendor-specific NodeIds; зловживайте колізіями просторів імен, щоб примусити клієнтів завантажувати схеми, контрольовані атакуючим.
  1. Огляд адресного простору
  • Почніть з ObjectsFolder (i=85) і рекурсивно Browse/Read, щоб знайти записувані змінні процесу, Method вузли та вузли історії/журналу.
  • Запитайте ServerStatus.BuildInfo, щоб зрозуміти походження прошивки, і ServerCapabilities.OperationLimits, щоб оцінити, наскільки легко вичерпати ресурси сервера.
  • Якщо дозволено анонімний доступ, негайно протестуйте Call на сервісних методах (наприклад, ns=2;s=Reset, ns=2;s=StartMotor). Багато вендорів забувають прив’язувати права ролей до кастомних методів.
  1. Зловживання сесіями
  • Повторно використовуйте або клонувати значення AuthenticationToken з інших сесій (захоплені через MITM або розкриття діагностики), щоб захопити існуючі підписки.
  • Примусьте сервер до затоплення SessionDiagnostics, створивши десятки неактивних сесій; деякі стеки падають, коли перевищено ліміт MaxSessionCount.

Автоматизована оцінка з OpalOPC

  • Сканер може працювати інтерактивно або у headless-режимі, що зручно для CI/CD-типових OT baseline. Пропустіть його машинно-зрозумілі знахідки у ваш pipeline звітності, щоб за хвилини висвітлити anonymous logins, слабкі політики, помилки валідації сертифікатів і записувані змінні.
  • Поєднуйте вивід OpalOPC з ручним переглядом: подайте список знайдених endpoint назад у ваші кастомні інструменти, а потім вибірково озброюйте вузли з високим впливом (наприклад, MotorControl/StartStop, RecipeManager/Upload).

Атака на застарілі політики безпеки (Basic128Rsa15)

  • Bleichenbacher-style oracle: Системи, що досі дозволяють застарілу політику Basic128Rsa15 (часто вмикається через build flags, такі як CMPOPCUASTACK_ALLOW_SHA1_BASED_SECURITY) leak відмінності в валідації паддінга. Використовуйте це, затоплюючи CreateSession / OpenSecureChannel хендшейки підробленими PKCS#1 v1.5 блобами, щоб відновити приватний ключ сертифіката сервера, після чого можна видати себе за сервер або дешифрувати трафік.
  • Authentication bypass: .NET Standard стек OPC Foundation до версії 1.5.374.158 (CVE-2024-42512) та залежні продукти дозволяють неавторизованим нападникам примусити ту застарілу політику і, як наслідок, пропустити автентифікацію на рівні додатку. Отримавши ключовий матеріал, можна пред’являти довільні UserIdentityTokens, відтворювати підписані ActivateSession запити та оперувати заводом як довірена інженерна робоча станція.
  • Операційний робочий процес:
  1. Перелічіть політики за допомогою GetEndpoints і помітте будь-які записи Basic128Rsa15.
  2. Узгодьте явно цю політику (SecurityPolicyUri в CreateSession), потім запустіть ваш oracle цикл до тих пір, поки відновлений ключ не валідується.
  3. Зловживайте ключем для підробки сесії з високими привілеями, зміни ролей або тихого пониження інших клієнтів, виступаючи як злочинний зворотний проксі.
  • CODESYS Runtime Toolkit (<3.5.21.0) повторно вмикав Basic128Rsa15 коли інтегратори компілювали з CMPOPCUASTACK_ALLOW_SHA1_BASED_SECURITY. Вимкніть цей прапор, знову запустіть workflow oracle вищевказаний, і ви можете leak приватний ключ runtime, щоб видавати себе за довірені інженерні робочі станції до тих пір, поки не буде застосовано патч рівня 3.5.21.0 або новіший.
  • OPC Foundation одночасно опублікувала CVE-2024-42513 для HTTPS bindings. Навіть якщо ваша ціль заявляє TLS, переконайтесь, що вона не тихо відкатується до Basic128Rsa15 для бінарного транспорту за проксі.

Watchlist експлойтів 2024–2025

  • open62541 fuzz_binary_decode (CVE-2024-53429): SecureChannel чанки, що заявляють надмірні тіла ExtensionObject, змушують декодер звертатися до звільненої пам’яті, тому pre-auth нападник може багаторазово крашити UA сервери, що інкапсулюють open62541 ≤1.4.6. Повторно використовуйте Claroty corpus (opcua_message_boofuzz_db) або створіть власний Boofuzz harness, щоб спамити змутовані OpenSecureChannel запити, доки watchdog не вб’є процес, після чого повторно перелічіть, бо багато інтеграторів після перезавантаження повертаються до anonymous mode.
  • Softing OPC UA C++ SDK / edgeConnector / edgeAggregator (CVE-2025-7390): TLS pipeline клієнта приймає будь-який сертифікат, що реплеїть довірений Common Name, тож ви можете випустити тимчасовий сертифікат, скопіювати CN з інженера заводу і залогінитись з довільними UserNameIdentityToken або IssuedIdentityToken даними. Поєднайте це з пониженням до Basic128Rsa15, щоб позбутися перевірок цілісності і постійно видавати себе за операторів, поки trustlists не будуть перебудовані.

Створення OPC UA клієнтів для експлуатації

  • Custom clients: Drop-in бібліотеки (python-opcua/asyncua, node-opcua, open62541) дозволяють вам реалізувати логіку експлойту самостійно. Завжди примусово застосовуйте індекс вашого цільового простору імен, щоб уникнути випадкових записів у інші простори імен, коли вендори переструктурують простори після оновлень прошивки.
  • Чекліст зловживань вузлами:
  • HistoryRead на production тегах для зняття знімку пропрієтарних рецептів.
  • TranslateBrowsePathsToNodeIds для перетворення людейносприйнятних імен активів у NodeIds, які можна подати до гаджетів, як-от Claroty’s framework.
  • Call + Method вузли, щоб тригернути сервісні задачі (завантаження прошивки, калібрування, перезавантаження пристрою).
  • RegisterNodes неправильне використання, щоб закріпити часто використовувані вузли і потім виснажити легітимні клієнти, ніколи не звільняючи хендли.
  • Тести жорсткості сесій: Спробуйте зв’язати десятки підписок з надзвичайно низькими publishing intervals (нижче 50 ms) плюс надмірно великі черги monitored-item. Багато стеків неправильно розраховують RevisedPublishingInterval і падають через переповнення планувальника.

Fuzzing та інструменти розробки експлойтів

Claroty Team82 випустила open-source opcua-exploit-framework, який пакує роки досліджень рівня Pwn2Own у повторно використовувані модулі:

  • Режими: sanity (легкі reads/browses), attacks (наприклад, starvation thread pool, file upload DoS), corpus (replay fuzzing payloads), server (зловмисний OPC UA сервер для підсадки клієнтів).
  • Сценарій використання:
# Run a DoS attack against a Prosys Simulation Server endpoint
python3 main.py prosys 10.10.10.10 53530 /OPCUA/SimulationServer thread_pool_wait_starvation

# Replay an entire Boofuzz corpus against open62541
python3 main.py open62541 192.168.1.50 4840 / opcua_message_boofuzz_db input_corpus_minimized/opcua.db
  • Сценарій зловмисного сервера: Вбудований asyncua-based server дозволяє таргетувати клієнтське ПЗ, подаючи шкідливі адресні простори (наприклад, відповіді з надмірними ExtensionObject щоб тригернути parsing bugs в UA Expert клонах).
  • Покриття цілей: Вбудовані профілі відповідають Kepware, Ignition, Unified Automation, Softing SIS, Triangle Microworks, Node-OPCUA, Python OPC UA, Milo, open62541 тощо, тож ви можете швидко переключатися між стеками без переписування payloads.
  • Поради з інтеграції: Зв’яжіть його вивід з вашими фуззерами — спочатку росять corpus payloads, потім дозвольте OpalOPC перевірити, чи краш не воскресив insecure defaults (anonymous login, setpoint write access тощо).

Використання bypass-ів автентифікації

Якщо знайдені вразливості bypass автентифікації, ви можете сконфігурувати OPC UA client відповідно і побачити, до чого маєте доступ. Це може дозволити як просте читання значень процесу, так і фактичне управління важким промисловим обладнанням.

Щоб отримати уявлення про пристрій, до якого ви маєте доступ, прочитайте значення вузла “ServerStatus” в адресному просторі і google для інструкції з експлуатації.

Shodan

  • port:4840
  • port:62541 "OPC UA"
  • ssl:"urn:opcua"
  • product:"opc ua"

Комбінуйте пошук з vendor рядками ("Ignition OPC UA", "KepServerEX") або сертифікатами ("CN=UaServerCert"), щоб пріоритезувати цінні активи перед початком інвазивного тестування.

References

Tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks