4840 - Pentesting OPC UA

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

Basic Information

OPC UA (Open Platform Communications Unified Access) est un protocole open-source crucial utilisé dans diverses industries comme Manufacturing, Energy, Aerospace et Defence pour l’échange de données et le contrôle d’équipements. Il permet de façon unique à des équipements de différents vendors de communiquer, en particulier avec les PLCs.

Sa configuration permet de mettre en place des mesures de sécurité fortes, mais souvent, pour assurer la compatibilité avec des appareils plus anciens, ces mesures sont adoucies, exposant les systèmes à des risques. De plus, trouver des services OPC UA peut être difficile car les scanners réseau peuvent ne pas les détecter s’ils se trouvent sur des ports non standards.

Default port: 4840 (binary opc.tcp). Many vendors expose separate discovery endpoints (/discovery), HTTPS bindings (4843/443), or vendor-specific listener ports such as 49320 (KepServerEX), 62541 (OPC Foundation reference stack) and 48050 (UaGateway). Expect multiple endpoints per host, each advertising transport profile, security policy and user-token support.

Built-in NodeIdWhy it matters
i=2253 (0:Server)Contient ServerArray, des vendor/product strings et des namespace URIs.
i=2256 (ServerStatus)Révèle le temps de fonctionnement, l’état actuel, et éventuellement des build info.
i=2267 (ServerDiagnosticsSummary)Montre le nombre de sessions, les requêtes avortées, etc. Utile pour fingerprinting des tentatives de brute-force.
i=85 (ObjectsFolder)Point d’entrée pour parcourir les tags exposés, methods et alarms des appareils.
PORT     STATE SERVICE REASON
4840/tcp open  unknown syn-ack

Pentesting OPC UA

Pour révéler des problèmes de sécurité dans les serveurs OPC UA, effectuez un scan avec OpalOPC.

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

Guide de découverte et d’énumération

  1. Localiser tous les transports OPC UA
nmap -sV -Pn -n --open -p 4840,4843,49320,48050,53530,62541 $TARGET

Répétez sur les adresses de groupe UDP si l’environnement utilise la découverte multicast LDS-ME.

  1. Empreinter les endpoints
  • Invoquez FindServers/GetEndpoints sur chaque transport pour capturer SecurityPolicyUri, SecurityMode, UserTokenType, l’URI de l’application et les chaînes produit.
  • Énumérez les espaces de noms afin de pouvoir résoudre les NodeIds spécifiques au fournisseur ; exploitez les collisions d’espaces de noms pour pousser les clients à charger des schémas contrôlés par l’attaquant.
  1. Parcourir l’espace d’adresses
  • Commencez par ObjectsFolder (i=85) et utilisez récursivement Browse/Read pour trouver des variables de processus modifiables, des nœuds Method et des nœuds historien/journal.
  • Interrogez ServerStatus.BuildInfo pour comprendre la provenance du firmware, et ServerCapabilities.OperationLimits pour évaluer la facilité à épuiser les ressources du serveur.
  • Si l’accès anonyme est autorisé, testez immédiatement Call sur les méthodes de maintenance (par ex., ns=2;s=Reset, ns=2;s=StartMotor). Beaucoup de fournisseurs oublient d’associer les permissions de rôle aux méthodes personnalisées.
  1. Abus de session
  • Réutilisez ou clonez les valeurs AuthenticationToken d’autres sessions (capturées via MITM ou exposition des diagnostics) pour détourner des subscriptions existantes.
  • Forcez le serveur dans un flood de SessionDiagnostics en créant des dizaines de sessions inactives ; certaines stacks plantent lorsque la limite MaxSessionCount est dépassée.

Évaluation automatisée avec OpalOPC

  • Le scanner peut s’exécuter de manière interactive ou headless, ce qui est pratique pour des baselines OT en style CI/CD. Poussez ses résultats lisibles par machine dans votre pipeline de reporting pour mettre en avant les logins anonymes, les politiques faibles, les erreurs de validation de certificat et les variables modifiables en quelques minutes.
  • Combinez la sortie d’OpalOPC avec un parcours manuel : réinjectez la liste des endpoints découverts dans vos outils personnalisés, puis sélectionnez et exploitez de façon ciblée les nœuds à fort impact (par ex., MotorControl/StartStop, RecipeManager/Upload).

Attaquer les anciennes politiques de sécurité (Basic128Rsa15)

  • Oracle de type Bleichenbacher : Les systèmes qui autorisent encore la politique dépréciée Basic128Rsa15 (souvent activée via des flags de build tels que CMPOPCUASTACK_ALLOW_SHA1_BASED_SECURITY) divulguent des différences de validation de padding. Exploitez cela en inondant les handshakes CreateSession / OpenSecureChannel avec des blobs PKCS#1 v1.5 spécialement conçus pour récupérer la clé privée du certificat serveur, puis usurper le serveur ou déchiffrer le trafic.
  • Contournement d’authentification : le stack .NET Standard de l’OPC Foundation antérieur à 1.5.374.158 (CVE-2024-42512) et les produits dépendants permettent à des attaquants non authentifiés de forcer cette politique legacy et ensuite de sauter l’authentification au niveau application. Une fois en possession des éléments de clé, vous pouvez présenter des UserIdentityTokens arbitraires, rejouer des requêtes ActivateSession signées, et opérer l’usine comme une station de travail d’ingénierie de confiance.
  • Flux opérationnel :
  1. Enumérez les politiques avec GetEndpoints et notez toute entrée Basic128Rsa15.
  2. Négociez explicitement cette politique (SecurityPolicyUri dans CreateSession), puis lancez votre boucle d’oracle jusqu’à ce que la clé récupérée soit validée.
  3. Exploitez la clé pour forger une session à haut privilège, changer de rôle, ou rétrograder silencieusement d’autres clients en agissant comme un reverse proxy malveillant.
  • OPC Foundation a publié simultanément CVE-2024-42513 pour les bindings HTTPS. Même si votre cible prétend utiliser TLS, assurez-vous qu’elle ne retombe pas silencieusement sur Basic128Rsa15 pour le transport binaire derrière le proxy.

Création de clients OPC UA pour l’exploitation

  • Clients personnalisés : des bibliothèques plug-and-play (python-opcua/asyncua, node-opcua, open62541) vous permettent d’implémenter votre propre logique d’exploitation. Imposer toujours l’index de namespace cible pour éviter des écritures inter-espaces de noms accidentelles quand les fournisseurs réordonnent les namespaces après des mises à jour de firmware.
  • Checklist d’abus de nœuds :
  • HistoryRead sur des tags de production pour capturer des copies de recettes propriétaires.
  • TranslateBrowsePathsToNodeIds pour résoudre des noms d’actifs lisibles par l’humain en NodeIds pouvant être fournis à des gadgets comme le framework de Claroty.
  • Call + Method nodes pour déclencher des tâches de maintenance (upload de firmware, calibration, redémarrages d’appareil).
  • Mauvaise utilisation de RegisterNodes pour épingler des nœuds fréquemment accédés puis priver les clients légitimes en ne libérant jamais les handles.
  • Tests de durcissement de session : tentez d’établir des dizaines d’abonnements avec des intervalles de publication extrêmement bas (inférieurs à 50 ms) et des files de monitored-item surdimensionnées. Beaucoup de stacks mal calculent RevisedPublishingInterval et plantent à cause de débordements de scheduler.

Fuzzing et outils de développement d’exploits

Claroty Team82 a publié un opcua-exploit-framework open-source qui regroupe des années de recherche de niveau Pwn2Own en modules réutilisables :

  • Modes : sanity (lectures/navigations légères), attacks (par ex., starvation du thread pool, DoS via upload de fichier), corpus (rejeu de payloads de fuzzing), server (serveur OPC UA rogue pour créer une backdoor sur des clients).
  • Pattern d’utilisation :
# 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
  • Scénario de serveur rogue : le serveur fourni basé sur asyncua vous permet de cibler des logiciels clients en servant des espaces d’adresses malveillants (par ex., des réponses avec des ExtensionObjects surdimensionnés pour déclencher des bugs de parsing dans des clones de UA Expert).
  • Couverture des cibles : les profils intégrés couvrent Kepware, Ignition, Unified Automation, Softing SIS, Triangle Microworks, Node-OPCUA, Python OPC UA, Milo, open62541, etc., vous permettant de changer rapidement de stack sans réécrire les payloads.
  • Conseils d’intégration : enchaînez sa sortie avec vos propres fuzzers — pulvérisez d’abord les payloads du corpus, puis laissez OpalOPC revérifier si le crash a fait réapparaître des configurations par défaut peu sûres (login anonyme, accès écriture aux setpoints, etc.).

Exploitation des contournements d’authentification

Si des vulnérabilités de contournement d’authentification sont trouvées, vous pouvez configurer un OPC UA client en conséquence et voir ce auquel vous avez accès. Cela peut permettre tout, depuis la simple lecture de valeurs de process jusqu’à l’exploitation d’équipements industriels lourds.

Pour avoir une idée de l’appareil auquel vous avez accès, lisez les valeurs du nœud “ServerStatus” dans l’espace d’adresses et recherchez un manuel d’utilisation sur Google.

Shodan

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

Combinez la recherche avec des chaînes fournisseurs ("Ignition OPC UA", "KepServerEX") ou des certificats ("CN=UaServerCert") pour prioriser les assets à haute valeur avant de commencer des tests intrusifs.

Références

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks