4840 - Pentesting OPC UA
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
Basic Information
OPC UA, standing for Open Platform Communications Unified Access, ๋ ์ ์กฐ, ์๋์ง, ํญ๊ณต์ฐ์ฃผ ๋ฐ ๋ฐฉ์ ๋ฑ ๋ค์ํ ์ฐ์ ์์ ๋ฐ์ดํฐ ๊ตํ๊ณผ ์ฅ๋น ์ ์ด์ ์ฌ์ฉ๋๋ ์ค์ํ ์คํ ์์ค ํ๋กํ ์ฝ์ ๋๋ค. ํนํ PLC๋ฅผ ํฌํจํ ์๋ก ๋ค๋ฅธ ๋ฒค๋์ ์ฅ๋น๋ค์ด ์ํธ ํต์ ํ ์ ์๊ฒ ํด์ค๋๋ค.
๊ตฌ์ฑ์ ๊ฐ๋ ฅํ ๋ณด์ ์กฐ์น๋ฅผ ์ ์ฉํ ์ ์์ง๋ง, ์ข ์ข ๊ตฌํ ์ฅ์น์์ ํธํ์ฑ์ ์ํด ๋ณด์์ด ์ํ๋์ด ์์คํ ์ด ์ํ์ ๋ ธ์ถ๋๊ณค ํฉ๋๋ค. ๋ํ OPC UA ์๋น์ค๋ ๋นํ์ค ํฌํธ์์ ๋์ํ ๊ฒฝ์ฐ ๋คํธ์ํฌ ์ค์บ๋๊ฐ ํ์งํ์ง ๋ชปํด ์ฐพ๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
Default port: 4840 (binary opc.tcp). ๋ง์ ๋ฒค๋๊ฐ ๋ณ๋์ discovery ์๋ํฌ์ธํธ(/discovery), HTTPS ๋ฐ์ธ๋ฉ(4843/443), ๋๋ 49320 (KepServerEX), 62541 (OPC Foundation reference stack), 48050 (UaGateway) ๊ฐ์ ๋ฒค๋๋ณ ๋ฆฌ์ค๋ ํฌํธ๋ฅผ ๋
ธ์ถํฉ๋๋ค. ํธ์คํธ๋น ์ฌ๋ฌ ์๋ํฌ์ธํธ๊ฐ ์์ ์ ์์ผ๋ฉฐ ๊ฐ ์๋ํฌ์ธํธ๋ ์ ์ก ํ๋กํ, ๋ณด์ ์ ์ฑ
๋ฐ user-token ์ง์์ ๊ด๊ณ ํฉ๋๋ค.
| Built-in NodeId | Why it matters |
|---|---|
i=2253 (0:Server) | ServerArray, ๋ฒค๋/์ ํ ๋ฌธ์์ด ๋ฐ ๋ค์์คํ์ด์ค URI๋ฅผ ๋ณด๊ดํฉ๋๋ค. |
i=2256 (ServerStatus) | ๊ฐ๋ ์๊ฐ(uptime), ํ์ฌ ์ํ ๋ฐ ์ ํ์ ์ผ๋ก ๋น๋ ์ ๋ณด๋ฅผ ๋ ธ์ถํฉ๋๋ค. |
i=2267 (ServerDiagnosticsSummary) | ์ธ์ ์, ์ค๋จ๋ ์์ฒญ ๋ฑ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ค๋๋ค. ๋ธ๋ฃจํธํฌ์ค ์๋ ์ง๋ฌธํ์ ๋งค์ฐ ์ ์ฉํฉ๋๋ค. |
i=85 (ObjectsFolder) | ๋ ธ์ถ๋ ์ฅ์น์ ํ๊ทธ, ๋ฉ์๋ ๋ฐ ๊ฒฝ๋ณด๋ฅผ ํ์ํ๋ ์ง์ ์ ์ ๋๋ค. |
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
ํ์ง ๋ฐ ์ด๊ฑฐ ํ๋ ์ด๋ถ
- ๋ชจ๋ OPC UA ์ ์ก ์ฐพ๊ธฐ
nmap -sV -Pn -n --open -p 4840,4843,49320,48050,53530,62541 $TARGET
ํ๊ฒฝ์ด LDS-ME ๋ฉํฐ์บ์คํธ ๊ฒ์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ UDP ๊ทธ๋ฃน ์ฃผ์์์๋ ๋ฐ๋ณตํ์ญ์์ค.
- ์๋ํฌ์ธํธ ์ง๋ฌธ ์์ง
- ๊ฐ ์ ์ก์์
FindServers/GetEndpoints๋ฅผ ํธ์ถํ์ฌSecurityPolicyUri,SecurityMode,UserTokenType, ์ ํ๋ฆฌ์ผ์ด์ URI ๋ฐ ์ ํ ๋ฌธ์์ด์ ์บก์ฒํ์ญ์์ค. - ๋ฒค๋๋ณ NodeIds๋ฅผ ํด์ํ ์ ์๋๋ก ๋ค์์คํ์ด์ค๋ฅผ ์ด๊ฑฐํ์ญ์์ค; ๋ค์์คํ์ด์ค ์ถฉ๋์ ์ ์ฉํด ํด๋ผ์ด์ธํธ๊ฐ ๊ณต๊ฒฉ์๊ฐ ์ ์ดํ๋ ์คํค๋ง๋ฅผ ๋ก๋ํ๋๋ก ์ ๋ํ์ญ์์ค.
- ์ฃผ์ ๊ณต๊ฐ ํ์
ObjectsFolder (i=85)์์ ์์ํ์ฌ ์ฌ๊ท์ ์ผ๋กBrowse/Read๋ฅผ ์ํํด ์ฐ๊ธฐ ๊ฐ๋ฅํ ํ๋ก์ธ์ค ๋ณ์,Method๋ ธ๋ ๋ฐ ํ์คํ ๋ฆฌ์ธ/๋ก๊ทธ ๋ ธ๋๋ฅผ ์ฐพ์ผ์ญ์์ค.- ํ์จ์ด ์ถ์ฒ๋ฅผ ์ดํดํ๊ธฐ ์ํด
ServerStatus.BuildInfo๋ฅผ ์ฟผ๋ฆฌํ๊ณ , ์๋ฒ ๋ฆฌ์์ค๋ฅผ ๊ณ ๊ฐ์ํค๊ธฐ ์ฌ์ด์ง ํ๋จํ๊ธฐ ์ํดServerCapabilities.OperationLimits๋ฅผ ํ์ธํ์ญ์์ค. - ์ต๋ช
์ก์ธ์ค๊ฐ ํ์ฉ๋๋ฉด ์ฆ์ ์ ์ง๋ณด์ ๋ฉ์๋(์:
ns=2;s=Reset,ns=2;s=StartMotor)์ ๋ํดCall์ ํ ์คํธํ์ญ์์ค. ๋ง์ ๋ฒค๋๊ฐ ์ปค์คํ ๋ฉ์๋์ ์ญํ ๊ถํ์ ๋ฐ์ธ๋ฉํ๋ ๊ฒ์ ์์ต๋๋ค.
- ์ธ์ ๋จ์ฉ
- ๋ค๋ฅธ ์ธ์
์์ ์บก์ฒํ(๋๋ MITM/์ง๋จ ๋
ธ์ถ์ ํตํด ํ๋ํ)
AuthenticationToken๊ฐ์ ์ฌ์ฌ์ฉํ๊ฑฐ๋ ๋ณต์ ํ์ฌ ๊ธฐ์กด ๊ตฌ๋ ์ ํ์ทจํ์ญ์์ค. - ์์ญ ๊ฐ์ ๋นํ์ฑ ์ธ์
์ ์์ฑํ์ฌ ์๋ฒ๋ฅผ
SessionDiagnosticsํ๋ฌ๋ฉ ์ํ๋ก ๋ชฐ์๋ฃ์ผ์ญ์์ค; ์ผ๋ถ ์คํ์MaxSessionCountํ๋๋ฅผ ์ด๊ณผํ๋ฉด ์ถฉ๋ํฉ๋๋ค.
OpalOPC๋ฅผ ์ฌ์ฉํ ์๋ ํ๊ฐ
- ์ค์บ๋๋ ๋ํํ ๋๋ ํค๋๋ฆฌ์ค๋ก ์คํํ ์ ์์ด CI/CD ์คํ์ผ OT ๋ฒ ์ด์ค๋ผ์ธ์ ์ ์ฉํฉ๋๋ค. ๊ธฐ๊ณ ํ๋ ๊ฐ๋ฅํ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํฌํ ํ์ดํ๋ผ์ธ์ผ๋ก ํ์ดํํ์ฌ ๋ช ๋ถ ๋ด์ ์ต๋ช ๋ก๊ทธ์ธ, ์ทจ์ฝํ ์ ์ฑ , ์ธ์ฆ์ ๊ฒ์ฆ ์ค๋ฅ ๋ฐ ์ฐ๊ธฐ ๊ฐ๋ฅํ ๋ณ์๋ฅผ ๊ฐ์กฐํ ์ ์์ต๋๋ค.
- OpalOPC ์ถ๋ ฅ์ ์๋ ํ์๊ณผ ๊ฒฐํฉํ์ญ์์ค: ๋ฐ๊ฒฌ๋ ์๋ํฌ์ธํธ ๋ชฉ๋ก์ ์ฌ์ฉ์ ๋๊ตฌ์ ๋ค์ ๊ณต๊ธํ ๋ค์ ์ํฅ์ด ํฐ ๋
ธ๋(์:
MotorControl/StartStop,RecipeManager/Upload)๋ฅผ ์ ํ์ ์ผ๋ก ๋ฌด๊ธฐํํ์ญ์์ค.
๊ตฌํ ๋ณด์ ์ ์ฑ ๊ณต๊ฒฉ (Basic128Rsa15)
- Bleichenbacher-style oracle: ์์ง ์ฌ์ฉ๋๋
Basic128Rsa15์ ์ฑ (์ข ์ขCMPOPCUASTACK_ALLOW_SHA1_BASED_SECURITY๊ฐ์ ๋น๋ ํ๋๊ทธ๋ก ํ์ฑํ๋จ)์ ํ์ฉํ๋ ์์คํ ์ ํจ๋ฉ ๊ฒ์ฆ ์ฐจ์ด๋ฅผ leak ํฉ๋๋ค. ์ด๋ฅผ ์ ์ฉํด ์กฐ์๋ PKCS#1 v1.5 ๋ธ๋กญ์ผ๋กCreateSession/OpenSecureChannelํธ๋์ ฐ์ดํฌ๋ฅผ ๋๋์ผ๋ก ๋ณด๋ด ์๋ฒ ์ธ์ฆ์์ private key๋ฅผ ๋ณต๊ตฌํ ๋ค ์๋ฒ๋ฅผ ๊ฐ์ฅํ๊ฑฐ๋ ํธ๋ํฝ์ ๋ณตํธํํ ์ ์์ต๋๋ค. - Authentication bypass: OPC Foundation์ .NET Standard ์คํ(1.5.374.158 ์ด์ , CVE-2024-42512) ๋ฐ ์ข
์ ์ ํ์ ์ธ์ฆ๋์ง ์์ ๊ณต๊ฒฉ์๊ฐ ํด๋น ๋ ๊ฑฐ์ ์ ์ฑ
์ ๊ฐ์ ๋ก ์ฌ์ฉํ๊ฒ ํ๊ณ ๊ทธ ์ดํ ์ ํ๋ฆฌ์ผ์ด์
์์ค ์ธ์ฆ์ ๊ฑด๋๋ฐ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ์ผ๋จ ํค ์๋ฃ๋ฅผ ํ๋ํ๋ฉด ์์์
UserIdentityTokens๋ฅผ ์ ์ํ๊ณ ์๋ช ๋ActivateSession์์ฒญ์ ์ฌ์ํ์ฌ ์ ๋ขฐ๋ ์์ง๋์ด๋ง ์ํฌ์คํ ์ด์ ์ฒ๋ผ ๊ณต์ฅ์ ์ด์ํ ์ ์์ต๋๋ค. - ์ด์ ์ํฌํ๋ก์ฐ:
GetEndpoints๋ก ์ ์ฑ ์ ์ด๊ฑฐํ๊ณBasic128Rsa15ํญ๋ชฉ์ ํ์ธํฉ๋๋ค.CreateSession์์ ํด๋น ์ ์ฑ (SecurityPolicyUri)์ ๋ช ์์ ์ผ๋ก ํ์ํ ๋ค ์ค๋ผํด ๋ฃจํ๋ฅผ ์คํํด ํค๋ฅผ ๋ณต๊ตฌํฉ๋๋ค.- ํค๋ฅผ ๋จ์ฉํด ๊ณ ๊ถํ ์ธ์ ์ ์์กฐํ๊ฑฐ๋ ์ญํ ์ ์ ํํ๊ฑฐ๋, ์ ์ฑ ๋ฆฌ๋ฒ์ค ํ๋ก์๋ก ๋์ํด ๋ค๋ฅธ ํด๋ผ์ด์ธํธ๋ฅผ ์๋ฐํ ๋ค์ด๊ทธ๋ ์ด๋ํฉ๋๋ค.
- **CODESYS Runtime Toolkit (<3.5.21.0)**๋ ํตํฉ์๊ฐ
CMPOPCUASTACK_ALLOW_SHA1_BASED_SECURITY๋ก ์ปดํ์ผํ ๋๋ง๋ค Basic128Rsa15๋ฅผ ์ฌํ์ฑํํ์ต๋๋ค. ํด๋น ํ๋๊ทธ๋ฅผ ์ ํํ๊ณ ์์ ์ค๋ผํด ์ํฌํ๋ก์ฐ๋ฅผ ๋ค์ ์คํํ๋ฉด ๋ฐํ์์ private key๋ฅผ leakํ์ฌ ํจ์น ์์ค 3.5.21.0 ์ด์์ด ๋ฐฐํฌ๋ ๋๊น์ง ์ ๋ขฐ๋ ์์ง๋์ด๋ง ์ํฌ์คํ ์ด์ ์ ๊ฐ์ฅํ ์ ์์ต๋๋ค. - OPC Foundation์ ๋์์ HTTPS ๋ฐ์ธ๋ฉ์ ๋ํด CVE-2024-42513์ ๊ฒ์ํ์ต๋๋ค. ๋์์ด TLS๋ฅผ ์ฌ์ฉํ๋ค๊ณ ์ฃผ์ฅํ๋๋ผ๋ ํ๋ก์ ๋ค์ ๋ฐ์ด๋๋ฆฌ ์ ์ก์ด Basic128Rsa15๋ก ์กฐ์ฉํ ํด๋ฐฑ๋์ง ์๋์ง ํ์ธํ์ญ์์ค.
2024-2025 ์ต์คํ๋ก์ ๊ฐ์ ๋ชฉ๋ก
- open62541 fuzz_binary_decode (CVE-2024-53429): ๊ณผ๋ํ๊ฒ ํฐ
ExtensionObject๋ณธ๋ฌธ์ ์ ์ธํ๋ SecureChannel ์ฒญํฌ๊ฐ ๋์ฝ๋๋ก ํ์ฌ๊ธ ํด์ ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ญ์ฐธ์กฐํ๊ฒ ๋ง๋ค๋ฏ๋ก, ์ฌ์ ์ธ์ฆ ๊ณต๊ฒฉ์๊ฐ open62541 โค1.4.6์ ํฌํจํ UA ์๋ฒ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ํฌ๋์์ํฌ ์ ์์ต๋๋ค. Claroty ์ฝํผ์ค(opcua_message_boofuzz_db)๋ฅผ ์ฌ์ฌ์ฉํ๊ฑฐ๋ ์์ฒด Boofuzz ํ๋ค์ค๋ฅผ ๋ง๋ค์ด ๋ณํ๋OpenSecureChannel์์ฒญ์ ์คํธํ๋ฉด ์์น๋ ์ด ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํ ๋๊น์ง ๋ฐ๋ณตํ๊ณ , ์ฌ๋ถํ ํ ๋ง์ ํตํฉ์๊ฐ ์ต๋ช ๋ชจ๋๋ก ํด๋ฐฑํ๋ฏ๋ก ์ฌ์ด๊ฑฐํ์ญ์์ค. - Softing OPC UA C++ SDK / edgeConnector / edgeAggregator (CVE-2025-7390): TLS ํด๋ผ์ด์ธํธ ์ธ์ฆ ํ์ดํ๋ผ์ธ์ด ์ ๋ขฐ๋ Common Name์ ์ฌ์ฌ์ฉํ๋ ์ด๋ค ์ธ์ฆ์๋ ์์ฉํ๋ฏ๋ก, ์์ ์ธ์ฆ์๋ฅผ ๋ฐ๊ธํ๊ณ ํ๋ํธ ์์ง๋์ด์ CN์ ๋ณต์ฌํด ์์์
UserNameIdentityToken๋๋IssuedIdentityToken๋ฐ์ดํฐ๋ก ๋ก๊ทธ์ธํ ์ ์์ต๋๋ค. ์ด๋ฅผ Basic128Rsa15๋ก์ ๋ค์ด๊ทธ๋ ์ด๋์ ๊ฒฐํฉํ๋ฉด ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฌ๋ฅผ ์ ๊ฑฐํ๊ณ ์ ๋ขฐ ๋ชฉ๋ก์ด ์ฌ๊ตฌ์ฑ๋ ๋๊น์ง ์ด์์๋ฅผ ์ง์์ ์ผ๋ก ๊ฐ์ฅํ ์ ์์ต๋๋ค.
์ ์ฉ์ ์ํ OPC UA ํด๋ผ์ด์ธํธ ์ ์
- Custom clients: drop-in ๋ผ์ด๋ธ๋ฌ๋ฆฌ(python-opcua/asyncua, node-opcua, open62541)๋ฅผ ์ฌ์ฉํ๋ฉด ์ต์คํ๋ก์ ๋ก์ง์ ์ง์ ๊ตฌํํ ์ ์์ต๋๋ค. ๋ฒค๋๊ฐ ํ์จ์ด ์ ๋ฐ์ดํธ ํ ๋ค์์คํ์ด์ค๋ฅผ ์ฌ์ ๋ ฌํ ๋ ์ฐ๋ฐ์ ์ธ ํฌ๋ก์ค-๋ค์์คํ์ด์ค ์ฐ๊ธฐ๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด ํญ์ ๋์ ๋ค์์คํ์ด์ค ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ ํ์ญ์์ค.
- ๋ ธ๋ ์ ์ฉ ์ฒดํฌ๋ฆฌ์คํธ:
HistoryRead๋ฅผ ์ฌ์ฉํด ํ๋ก๋์ ํ๊ทธ์ ๋ ์ ๋ ์ํผ๋ฅผ ์ค๋ ์ทํฉ๋๋ค.TranslateBrowsePathsToNodeIds๋ก ์ฌ๋์ด ์ฝ์ ์ ์๋ ์์ฐ ์ด๋ฆ์ NodeIds๋ก ํด์ํด Claroty ํ๋ ์์ํฌ ๊ฐ์ ๋๊ตฌ์ ๊ณต๊ธํฉ๋๋ค.Call+Method๋ ธ๋๋ฅผ ์ด์ฉํด ์ ์ง๋ณด์ ์์ (ํ์จ์ด ์ ๋ก๋, ๊ต์ , ์ฅ์น ์ฌ๋ถํ )์ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค.RegisterNodes๋ฅผ ์ค์ฉํด ์์ฃผ ์ก์ธ์ค๋๋ ๋ ธ๋๋ฅผ ๊ณ ์ ํ๊ณ ํธ๋ค์ ํด์ ํ์ง ์์ ์ ๋นํ ํด๋ผ์ด์ธํธ๋ฅผ ๊ธฐ์ ์ํ๋ก ๋ง๋ญ๋๋ค.- ์ธ์
ํ๋๋ ํ
์คํธ: ๋งค์ฐ ๋ฎ์ ๋ฐํ ๊ฐ๊ฒฉ(50 ms ์ดํ)๊ณผ ๊ณผ๋ํ ๋ชจ๋ํฐ๋ง-์์ดํ
ํ๋ฅผ ์ฌ์ฉํด ์์ญ ๊ฐ์ ๊ตฌ๋
์ ๋ฐ์ธ๋ฉํด ๋ณด์ญ์์ค. ๋ง์ ์คํ์ด
RevisedPublishingInterval์ ์๋ชป ๊ณ์ฐํด ์ค์ผ์ค๋ฌ ์ค๋ฒํ๋ก์ฐ๋ก ์ถฉ๋ํฉ๋๋ค.
ํผ์ง ๋ฐ ์ต์คํ๋ก์ ๊ฐ๋ฐ ๋๊ตฌ
Claroty Team82๋ ๋ค๋
๊ฐ์ Pwn2Own ๊ธ ์ฐ๊ตฌ๋ฅผ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋๋ก ํจํค์งํ ์คํ์์ค opcua-exploit-framework๋ฅผ ๊ณต๊ฐํ์ต๋๋ค:
- Modes:
sanity(๊ฐ๋ฒผ์ด ์ฝ๊ธฐ/๋ธ๋ผ์ฐ์ฆ),attacks(์: ์ค๋ ๋ ํ ๊ณ ๊ฐ, ํ์ผ ์ ๋ก๋ DoS),corpus(๋ฆฌํ๋ ์ด ํผ์ง ํ์ด๋ก๋),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
- Rogue server ์๋๋ฆฌ์ค: ๋ฒ๋ค๋ asyncua ๊ธฐ๋ฐ ์๋ฒ๋ฅผ ์ฌ์ฉํ๋ฉด ์
์ฑ ์ฃผ์ ๊ณต๊ฐ์ ์ ๊ณตํด ํด๋ผ์ด์ธํธ ์ํํธ์จ์ด๋ฅผ ํ์ ํํ ์ ์์ต๋๋ค(์: UA Expert ํด๋ก ์ ํ์ฑ ๋ฒ๊ทธ๋ฅผ ์ ๋ฐํ๋ ๊ณผ๋ํ
ExtensionObject์๋ต). - ๋์ ์ปค๋ฒ๋ฆฌ์ง: ๋ด์ฅ๋ ํ๋กํ์ผ์ด Kepware, Ignition, Unified Automation, Softing SIS, Triangle Microworks, Node-OPCUA, Python OPC UA, Milo, open62541 ๋ฑ๊ณผ ๋งคํ๋์ด ์์ด ํ์ด๋ก๋๋ฅผ ๋ค์ ์์ฑํ ํ์ ์์ด ์คํ ๊ฐ์ ๋น ๋ฅด๊ฒ ์ ํํ ์ ์์ต๋๋ค.
- ํตํฉ ํ: ์์ฒด ํผ์ ์ ์ฐ๊ณํ์ญ์์คโ๋จผ์
corpusํ์ด๋ก๋๋ฅผ ์คํ๋ ์ดํ ๋ค์ OpalOPC๋ก ํฌ๋์๊ฐ ๋ณด์์ด ๋์จํ ๊ธฐ๋ณธ๊ฐ(์ต๋ช ๋ก๊ทธ์ธ, ์ค์ ๊ฐ ์ฐ๊ธฐ ๊ถํ ๋ฑ)์ ๋ถํ์์ผฐ๋์ง ์ฌ๊ฒ์ฆํ์ธ์.
์ธ์ฆ ์ฐํ ์ทจ์ฝ์ ์ ์ฉ
If authentication bypass vulnerabilities are found, you can configure an OPC UA client accordingly and see what you can access. This may allow anything from merely reading process values to actually operating heavy-duty industrial equipment.
์ ๊ทผ ๊ฐ๋ฅํ ์ฅ์น ๋จ์๋ฅผ ์ป์ผ๋ ค๋ฉด ์ฃผ์ ๊ณต๊ฐ์์ โServerStatusโ ๋ ธ๋ ๊ฐ์ ์ฝ๊ณ ํด๋น ์ฅ์น์ ์ฌ์ฉ ์ค๋ช ์๋ฅผ google์์ ๊ฒ์ํ์ญ์์ค.
Shodan
port:4840port:62541 "OPC UA"ssl:"urn:opcua"product:"opc ua"
๊ฒ์์ ๋ฒค๋ ๋ฌธ์์ด("Ignition OPC UA", "KepServerEX")์ด๋ ์ธ์ฆ์("CN=UaServerCert")์ ๊ฒฐํฉํด ์นจํฌ์ฑ ํ
์คํธ๋ฅผ ์์ํ๊ธฐ ์ ์ ๊ณ ๊ฐ์น ์์ฐ์ ์ฐ์ ์์๋ก ์ง์ ํ์ญ์์ค.
References
- https://opalopc.com/how-to-hack-opc-ua/
- https://github.com/claroty/opcua-exploit-framework
- https://certvde.com/en/advisories/VDE-2025-022/
- https://nvd.nist.gov/vuln/detail/CVE-2024-53429
- https://industrial.softing.com/fileadmin/psirt/downloads/2025/CVE-2025-7390.html
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.


