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을 제출하여 해킹 트릭을 공유하세요.


