보안정보

전문화된 보안 관련 자료, 보안 트렌드를 엿볼 수 있는
차세대 통합보안관리 기업 이글루코퍼레이션 보안정보입니다.

알아보잡 Series 5) OT(Operational Technology)와 악성코드 : Part2. Triton

2021.01.07

42,409

 

 

01. 개요

 

지난 11월 호는 ‘OT(Operational Technology)와 악성코드 : Part1. Industroyer’을 통해 OT보안과 IT보안의 기능적∙환경적 요인, 그리고 이런 요인에 따른 보안에서의 차이점에 대해 알아보았다. 또한 OT환경에서 APT공격에 사용되고 있는 악성코드의 종류에 대해서 살펴보았다. OT환경의 악성코드들은 OT환경을 구성하는 제조사에 종속적인 환경으로 인하여 장시간의 환경이해가 필요하다. 때문에 2016년 우크라이나 전력망 공격에 사용된 인더스트로이어(Industroyer)악성코드와 같이 고도화∙지능화되어 있는 경우가 일반적이다.

 

‘OT(Operational Technology)와 악성코드 : Part2’에서는 앞서 소개한 Industroyer에 이어 Triton, TRISIS, Hatman 등의 이름으로 불리는 Triton에 대해 이야기해보고자 한다. Triton은 2017년 사우디아라비아 석유 화학공장을 대상으로 한 공격에서 사용되었다.

 

공격 타깃은 Schneider社의 Triconex SIS(Safety Instrumented System)를 공격타깃으로 삼고 있는 Triton는 악성코드가 발견된 2017년 공격 당시 Triton가 가지고 있는 다양하고 정교한 공격기법들을 모두 사용하지 않았다. 악성코드 발견 시점에는 △ 백도어, △ 문제 발생 시 정상 코드로 복구 시도, △ 복구 실패 시 더미 코드로 일정 부분 덮어쓰기 등의 기능만 사용되고 있었기 때문에, 일회성의 공격이 아닌 장기적인 관점의 공격을 수행하기 위해 제작된 것으로 추정할 수 있다. 악성코드의 메인기능을 수행하는 trilog.exe와 공격당시에는 사용되지 않았으나 추가공격을 위해 가지고 있던 모듈의 일부 기능들에 대해서 상세히 설명해 보고자 한다.

 


 

 

02. 트리톤(Triton)

 


 

트리톤은 메인 악성코드인 trilog.exe와 메인 악성코드에서 사용되는 모듈 파일인 library.zip을 사용한다. Trilog.exe는 파이썬 스크립트를 EXE로 변환한 형태이며 모듈로 사용되는 악성 파일들은 *.pyc 파일에서 스크립트를 추출하여 분석하였다. 메인 악성코드인 Trilog.exe와 밀접한 연관이 있는 모듈 4종에 대해서 분석을 진행하였다. 

 


 

[표 1] 사우디 아라비아 석유화학 공장 공격에 사용된 트리톤 샘플 정보

 


 

[그림 1] 트리톤(Triton) 악성코드 구성도

 

1) trilog.exe

 

전체 행위를 위한 핵심 파일이며 PY2EXE를 이용하여 Python 스크립트가 EXE 실행파일로 컴파일 상태이다. 이는 Python이 설치되지 않은 환경에서도 동작할 수 있도록 하기 위함이며 원활한 코드 분석을 위해 pyc 파일로 변환 후 파이썬 코드를 직접 추출 후 분석을 진행하였다. 

 trilog.exe의 내부에 있는 원본 파이썬 코드의 파일명은 script_test.py이다. 

 


 

[그림 2] PY2EXE로 컴파일 되었음을 확인할 수 있는 문자열(trilog.exe)

 

공격 대상 컨트롤러에 연결되면 임의의 쉘코드와 추가적으로 사용되는 바이너리 데이터를 열어 기존 제어 프로그램에 삽입한다. inject.bin은 imain.bin을 메모리에 인젝션 시키는 역할을 한다.

 


 

[그림 3] 쉘코드 삽입(trilog.exe)

 


 

[그림 4] 추가 행위를 위해 사용되는 바이너리(trilog.exe)

 

2) TsHi.pyc

 

TsHi.pyc 모듈의 “SafeAppendProgramMod” 함수는 trilogy.exe에서 임의의 쉘코드를 업로드 후 문제가 발생하는지 확인하기 위해 사용된다. 악성코드가 동작하는 Triconex 제어기의 상태를 확인 후 오류가 발생하면 컨트롤러의 상태를 이전으로 돌려놓는다. 

 


 

[그림 5] SafeAppendProgramMod 함수(TsHi.pyc)

 


 

[그림 6] 쉘코드 업로드 및 상태 확인(trilog.exe)

 

이전 상태 복원에 실패하는 경우 trilogy.exe의 UploadDummyForce 함수에서 dummy 코드로 일정한 영역을 덮어씌운다. 이는 악성코드에 의해 장비에 문제가 생길 시 악성코드의 흔적을 지우는 행위로 추정된다.

 


 

[그림 7] SafeAppendProgramMod 함수가 사용되는 부분(trilog.exe)

 

그 외에도 “TsBase.pyc”에서 사용되는 다양한 행위들이 포함되어 있으나 해당 공격에서는 모두 사용되지 않았다. 주로 공격 대상의 메모리를 직접 수정하여 악성 행위를 하는 데 사용되는 함수들이 구현되어 있다. 

 


 

[표 2] TsHi.pyc 모듈 내부 함수 기능별 요약

 

3) TsLow.pyc

 

해당 모듈에서는 주로 공격 대상과의 통신에 관여하는 함수들이 구현되어 있다. Triton의 공격 대상인 Triconex SIS컨트롤러는 공개되지 않은 TriStation프로토콜을 사용하여 통신한다. TsLow.pyc에서는 공개되지 않은 TriStation프로토콜을 분석하여 공격에 사용하였다. UDP 통신을 기본으로 하며, 1502 포트가 사용된다. 

 


 

[그림 8] UDP 통신시 사용되는 포트별 프로토콜(출처 : Developer’s Guide TriStation)

 

UDP port 1502를 대상으로 ‘ping message’패킷을 브로드캐스팅 하여 통신 가능한 대상을 확인한다. 

 


 

[그림 9] 패킷 브로드캐스팅(TsLow.pyc)

 

TCM(Tricon Communication Module)프로토콜을 사용하기 위한 함수와 TriSation(TS)에 임의의 명령을 전송하기 위한 함수들이 존재한다. TS에 관한 함수들은 “TsBase.pyc” 모듈에서 사용된다. 

 


 

[표 3] TCM/TS 함수 기능 요약(TsLow.pyc)

 

4) TsBase.pyc / TS_cnames.pyc

 

High Level의 인터페이스와 Low Level의 TriStation 명령 코드를 변환하는 역할을 하며 TS_cnames.pyc의 데이터를 이용하여 악성 행위를 진행한다. 각각의 함수 내부에는 행위를 위한 명령코드와 결과값을 위한 코드가 한 세트를 이루고 있다.

 


 

[그림 10] TsBase.pyc 에 구현된 함수 구성(TsBase.pyc)

 


 

[표 4] TsBase.pyc 내부 함수 명령/결과 코드에 대한 설명(TsBase.pyc)

 


 

[그림 11] TS_cnames.pyc 내부 명령 셋(TS_cnames.pyc)

 

03. MITRE ATT&CK


1) MITRE ATT&CK for ICS

 

아래의 [표 -5]는 MITRE ATT&CK for ICS로 표현한 Triton의 공격 벡터이다. 

 


 

[표 5] MITRE ATT&CK for ICS - Triton

 

2) MITRE ATT&CK for ICS로 보는 Triton

 

Tirton 악성코드를 분석하면서 가장 흥미로웠던 부분은 Indicator Removal On Host(ID : T0872)에 관한 부분이었다. 해당 기능에 대한 설명은 다음과 같다.


 

악성코드가 동작 중인 상태를 감추기 위한 부분이며 Triton에서는 계속해서 시스템의 상태를 파악 후 문제가 생기면 원래 코드로 되돌리거나, 코드 복원이 불가능한 경우 더미 데이터를 삽입하여 악성 쉘코드가 사용된 부분을 덮어쓰기 하였다. 이러한 행위는 악성코드가 언제 어떻게 감염되어 어떤 피해를 입혔는지, 어떤 데이터가 시스템에 영향을 미치는데 사용되었는지 등 사고 인지 · 사고 조사(Incident Response)를 상당히 어렵게 하는 요인으로 보인다. IT 환경에 비해 악성코드의 탐지나 공격 인지가 쉽지 않은 OT 환경에서 상당히 치명적인 위협이라 생각되었다.

 

04. 대응방안

 

1) 제조사 관점 및 사용자 관점별 보안 대응방안

 

OT환경은 기본적으로 제조사 및 개발사의 자체 언어 및 프로토콜을 사용하기 때문에 IT환경에 비해서 벤더 종속성이 상대적으로 높다. 때문에 보안이 고려되지 않은 개발방식으로 인한 피해는 고스란히 사용자에게 전가되게 된다. 이러한 이유로 개발생명주기 상에서 Secure SDLC를 적용한 개발을 통해 잠재적인 보안위협을 감소하고 대응할 수 있게 된다.

 

OT 환경은 산업 · 화학 · 발전소 등의 보안위협은 인명피해로 귀결될 수 있기 때문에 IT환경에 비해서 훨씬 높은 안전성을 요구받게 된다. 하지만 OT환경은 디지털전환이라는 새로운 국면으로 보안이라는 과제를 맞닥들이면서 보안의 중요성에 대해 인식한지 오래되지 않은 탓에 이미 기 구축된 OT환경의 상당수는 보안이 고려되지 않은 설계를 기반으로 구성되어 있다. 따라서 제조사 및 개발자 관점과 사용자 관점별로 제약사항을 이해하고 이를 해결할수 있는 대응방안에 대한 고민이 필요하다.

 


 

[표 6] 제공자와 사용자의 제약사항 및 대응방안

 

OT환경의 보안위협을 대응하기 위해서 글로벌 보안업체 FireEye에서는 개발단계의 보안강화의 중요성을 언급하며 OT보안 체크리스트를 통해 개발단계에서 준수해야 하는 보안 사항들에 대해서 권고하고 있다.

 


 

[표 7] OT 환경 개발 시 고려해야 할 보안 사항 체크리스트 (출처 : FireEye)

 

국내에서도 OT환경의 보안위협에 대응하기 위해서 2019년 12월에 KISA에서 발간한 ‘스마트 공장 사이버 보안 가이드’를 통해 위협요인식별과 대응방안에 대해 도움을 얻을 수 있다. 해당 가이드에서는 OT 환경에서 발생할 수 있는 다양한 방안들을 제시하고 있어 기구축된 환경의 보안담당자들의 관점에서 보안체계 수립에 도움을 줄 수 있다.

 


 

[그림 12] OT 환경에서 발생 가능한 위협 (출처 : KISA, 스마트공장 사이버 보안가이드)

 


 

[표 8] OT 환경에서 발생할 수 있는 보안 위협사항 및 종류(출처 : KISA, 스마트공장 사이버 보안가이드)

 

05. IOC

 

1) HASH

 


 

06. 참고자료

 

[1] https://www.antiy.net/p/antiy-released-technical-analysis-of-industrial-control-malware-trisis/ [2] https://samvartaka.github.io/malware/2018/01/16/triton

[3] https://www.fireeye.com/blog/threat-research/2017/12/attackers-deploy-new-ics-attack-framework-triton.html

[4] https://www.dragos.com/wp-content/uploads/TRISIS-01.pdf

[5] https://www.accenture.com/_acnmedia/PDF-46/Accenture-Security-Triton-Trisis-Cyber-Advisory.pdf#zoom=50

[6] https://www.mcafee.com/blogs/other-blogs/mcafee-labs/triton-malware-spearheads-latest-generation-of-attacks-on-industrial-systems/

[7] https://www.slideshare.net/cisoplatform7/triton-how-it-disrupted-safety-systems-and-changed-the-threat-landscape-of-industrial-control-systems-forever

[8] https://us-cert.cisa.gov/sites/default/files/documents/MAR-17-352-01%20HatMan%20-%20Safety%20System%20Targeted%20Malware%20%28Update%20B%29.pdf

[9] KISA 스마트 공장 사이버 보안 가이드(https://www.kisa.or.kr/public/laws/laws3_View.jsp?cPage=1&mode=view&p_No=259&b_No=259&d_No=111&ST=total&SV=)