The Secret Life of RATs:
connecting the dotsby dissecting multiple backdoors

Cyber Defense Institute, Inc.
Kawakami Ryonosuke, Nakajima Shota
TrendMicro
Hara Hiroaki

> whoami➢➢➢

株式会社サイバーディフェンス研究所でマルウェア解析、インシデントレスポンス業務、脅威リサーチ業務に従事。
JSAC2018~2024、国内外のカンファレンスで発表経験あり。
セキュリティ・キャンプやJSACでワークショップを実施。

Shota Nakajima➢➢➢

株式会社サイバーディフェンス研究所でマルウェア解析、インシデントレスポンス業務、脅威リサーチ業務に従事。
趣味・関心 リバースエンジニアリングと攻撃技術の実装
JSAC初登壇

Kawakami Ryonosuke➢➢➢

Hara Hiroaki

トレンドマイクロ株式会社で、アジア太平洋地域における脅威インテリジェンス調査に注力。
専門は脅威ハンティング、インシデントレスポンス、マルウェア分析、標的型攻撃リサーチ。
JSAC 2021/2022、HITCON 2022で発表。
2

関連が考えられる3つのインシデント(アクター)•

GroundPeony•••Ratel Master••

台湾、香港、韓国、ネパール、インド
政府機関、教育・研究機関、通信事業者
日本国内の組織に対するAPT

Earth Estries (FamousSparrow)•

フィリピン、台湾、マレーシア、南アフリカ、ドイツ、米国
政府機関とテクノロジー業界の組織

https://www.lac.co.jp/lacwatch/report/20230914_003513.html

https://www.lac.co.jp/lacwatch/report/20230914_003513.html

https://www.trendmicro.com/ja_jp/research/23/j/earthestries-targets-government-tech-for-cyberespionage.html

3Overview
1st Stage(shellcode loader)

2nd Stage(in-memory PE loader)

PayloadusemicDown
Decrypt by RC4 withhardcoded key

GroundPeonyuse

Mofu Loader

RatelS

Ratel Master

Decrypt byCustom Alg

SlyMongouse

HemiGate
Decrypt by RC4 withkey embedded inencrypted payload

Earth Estries

Dracu Loader
PlugX
4micDown (GroundPeony)●

ProgramData¥mic¥に作成される○●

mic.exe■ Side-loadに利用される正規ファイル

version.dll■●

version.dll

mic.exe

Side-loadを利用して実行される
mic.docを復号し、読み込むDLL

mic.doc○○●

DLL
Side-Load

エンコードされたMofu Loader
内包したペイロードのmicDownを復号して実行する

mic.ver○mic.docのコンフィグファイル

Load & Decrypt

mic.doc(Mofu Loader, micDown)

mic.ver(micDown config)

5

HemiGate(Earth Estries)●

ProgramData¥WinDrive¥に作成される○●Side-loadを利用して実行される
taskhask.docを復号し、読み込むDLL

K7AVWScn.dll

taskhask.exe

taskhask.doc○○●

DLLSide-Load

K7AVWScn.dll○●

taskhask.exe■ Side-loadに利用される正規ファイル

暗号化されたDracu Loader
内包した2ndペイロードのHemiGateを復号して実行する

Load & Decrypttaskhask.dat○

暗号化されたtaskhask.docのコンフィグファイル

taskhask.doc(Dracu Loader, HemiGate)taskhask.dat(HemiGate config)

6

RatelS (Ratel Master)●

msbtc.exe○●

Side-loadを利用して実行されるmsbtc.datを復号し、読み込むDLLVERSION.dll

msbtc.exe

msbtc.dat○○●

DLLSide-Load

VERSION.dll○●

Side-loadに利用される正規ファイル

エンコードされたMofu Loader
内包したペイロードのRatelSを復号して実行する

msbtc.cfg○

RatelSのコンフィグファイル

Load & Decrypt

msbtc.dat(Mofu Loader, RatelS)

msbtc.cfg(RatelS config)

7

01
micDownvs RatelSDLL Side-Loading●

ハッシュは異なるが同じ正規ファイルを利用する○○●

notifu.exe
OSSの通知アプリケーション

VerQueryValueWに復号処理を実装
GroundPeony 1st Stage Loader

RatelS 1st Stage Loader

9GroundPeony vs Ratel Master●●●1st Stage: DLLのサイドロードで利用する正規ファイルが同じ
2nd Stage: Shellcodeがペイロードを復号するアルゴリズムが同じ
Shellcodeで利用されているAPI HashingアルゴリズムとAPIが同じ
GroundPeony

DLL
Side-Load

notifu.exe

Custom xor

Version.dll

RatelS
Custom xor+
LZNT1

Shellcode(Mofu Loader)

micDown

DLL
Side-Load

notifu.exe

RC4

VERSION.dll

Custom xor+
LZNT1

Shellcode(Mofu Loader)

RatelS

10DLL Side-Loading●

Side-Loadで実行される関数○●

VerQueryValueW

VerQueryValueWのコードレベルでの類似はない

GroundPeony 1st Stage Loader

RatelS 1st Stage Loader

11

2nd Stage PE Loader (Mofu Loader)●

API Hashingのアルゴリズム(ror 12)と利用するAPIが同じ

GroundPeony 2nd Stage Loader

RatelS 2nd Stage Loader

12

2nd Stage PE Loader (Mofu Loader)●

カスタムXORのアルゴリズムが同じ○

sub + xor + add

GroundPeony 2nd Stage Loader

RatelS 2nd Stage Loader

13Payload●

カスタムXOR + LZNT1で展開される2ndペイロードのPEヘッダのマジックナンバーは削除されている
GroundPeony payload

RatelS payload
e_magice_lfanew14

RatelS x86 Version●

LACによって報告されている通り、RatelSのビルダにはx86 veriosnのモジュール等が含まれているが生成機能は実装されていない
Strings related to the x86 version
module included in the builder.

Builder GUI only has button Save x64.

15

Mofu Loader in VT●●

RatelSで使用されたローダと類似のローダを発見
2nd StageはMofu Loaderを使用しているが、ペイロードが異なっていた

mdmerge.exe
MidlrtMd.dll

MidlrtMt.dll

RC4mdmerge.dat(Encrypted SlyMongo)

MidlrtMe.dll
Inject explore.exe

RC4

Mdmerge.png(Mofu Loader)

RC4
SlyMongo

16

SlyMongo●

C/C++製の組み込み向けのOSSネットワークライブラリMongooseフレー
ムワークを使用したバックドア

17

SlyMongoコマンド一覧
コマンドID

機能概要

コマンドID

機能概要

0x1

-

0x10

ファイル読み込み

0x2

-

0x11

ファイル書き込み

0x3

-

0x12

ディレクトリ作成

0x4

-

0x13

リネーム

0x5

-

0x14

ファイル削除0x6-

0x15

指定したファイルの起動(ShellExecuteA)

0x7

0x16

ファイル列挙

0x8

0x17

ディレクトリ作成

0x9

0x18

プロセスの列挙

0xA

ドライブ情報の列挙
0x19

シャットダウン権限の付与

0xB

0x1A

フラグの設定0xC

0x1B

シャットダウン権限の付与

0xD

ファイルへの書き込み
0x1C

プロセスの終了

0xE

ファイル情報の表示
0x1D

-0xF

通信関連設定
0x1E

-

0x1F

ファイルの読み込み

0x20

ファイルのダウンロード

18

02
HemiGatevs RatelS

HemiGate vs. RatelS●●●

1st Stage: コード上の共通点は見受けられないがTTPは合致
2nd Stage: 異なるin-memory PE Loaderを使用
Payload: コードやコンフィグなど実装レベルでの類似性が認められる
HemiGate

DLL
Side-Load

K7AVMScn.exe

RC4

K7AVWScn.dllRatelS

Copy onmemory

Shellcode(Dracu Loader)

DLL
Side-Load

HemiGate

notiu.exe

Version.dll

RC4

Custom xor+
LZNT1

Shellcode(Mofu Loader)

RatelS

20

1st Stage main routine●

実行される関数の実装の類似はないが、RC4の利用や暗号化ペイロードのファイル命名規則などTTPレベルで類似
HemiGate 1st Stage

RatelS 1st Stage

暗号化ファイルの先頭0x10を鍵としてRC4で復号ハードコードされた鍵を使用して暗号化ファイルをRC4で復号

21

HemiGate 2nd Stage●

Dracu Loaderと呼ばれるシンプルな in-memory PE Loader○

シェルコードの後ろにPEがそのまま埋め込まれている22

HemiGate vs. RatelS●

通信実装部分に幾つかのコードレベルでの類似・共通点

HTTPリクエストヘッダが類似(左 HemiGate / 右 RatelS)23

HemiGate vs. RatelS●

通信実装部分に幾つかのコードレベルでの類似・共通点
プロキシ情報を取得するコードが合致(左 HemiGate / 右 RatelS)24

HemiGate vs. RatelS●

通信実装部分に幾つかのコードレベルでの類似・共通点
認証部分のコードが合致(左 HemiGate / 右 RatelS)25

HemiGate vs. RatelS●

実装は合致しないが、コーディングスタイルに類似点
キーログ出力パスとファイル名が類似(左 HemiGate / 右 RatelS)26

HemiGate vs. RatelS●

コンフィグの構造に類似点○○○○

1つコンフィグのサイズが同じ[Flag][Port][C2 Address]で構成されている
末尾にインターバルの数値
コンフィグ全体のサイズ、構成が類似する
HemiGatePortRatelS

Port

27

RatelS vs. PlugX●LACによってすでに報告されている通り、RatelSとPlugXには実装上の類似点がいくつか見られるモジュールのマッピング(左 RatelS / 右 PlugX)28

HemiGate vs. RatelS vs. PlugX●●●

HemiGateとRatelSには実装レベルでの合致や、マルウェアのコーディングスタイルレベルでの類似点が見受けられた
また、PlugXとRatelSにも実装レベルでの合致が報告されている
このことから、これらのRATの背後には、同一もしくは互いに協力関係にある開発者が関連している可能性やソースコードの共有が示唆される

Family

通信処理の類似

キーログ処理の類似

コンフィグの構造モジュール実装

モジュールのマッピングの類似

HemiGate◯◯◯◯-RatelS◯◯◯◯◯

PlugX---

◯◯

29

03
Other Findings

HemiGate と PlugX がホストされたサーバ●●

VTにアップロードされたHemiGateがホストされていたサーバ上にPlugXもホストされていたことを確認した
加えて、このHemiGateのC&CサーバがGroundPeonyによって使用されていたドメインと合致することも確認した
use139[.]84[.]166[.]104

onedrivo[.]com

GroundPeony

usePlugX

HemiGate

Earth Estries31

04
SummaryMofu Loaderをアップロードする不審VTアカウント●●●

VT上のMofu Loaderを調査したところ、あるアカウント(d03b8b03) が複数のMofu LoaderをCNとHKからアップロードしていることを確認
同アカウントからアップロードされているマルウェアには、テスト用のものもあり、被害者の可能性は低い
別の脅威アクターに紐づけられているSIESTAGRAPHとHUI Loaderをアップロードしている点で興味深い

First Seen

File NameCountryNote2023/06/28 9:26

Client.exe

CN,shenzhen

SIESTAGRAPH

2023/06/28 8:45versions.dll

CN,shenzhen

RC4版HUI Loader(コンパイル日時は 2023-06-21 08:16:07)

2023/04/12 3:09

OneDrive.zip

CN,shenzhen

Mofu Loader -> SlyMongo

2023/03/23 3:01

OneDrive.zip

HK

Mofu Loader -> SlyMongo

2023/03/23 2:36

NetLabs.zip

HKDracu loader -> Hemigate

33

Relationships between actors●●●

GroundPeonyとRatel MasterはMofuLoaderを共有している
Earth Estriesと GroundPeonyはC2を共有していたRatelSとHemiGateにはマルウェアの実装の類似がある○●

どちらもPlugXとの類似がある

テスト用のC2を持つHemiGateとSlyMongoは同じVTのアカウントから投稿された以上から3つのアクターは協力関係にあると推察できる
34

Timeline
GroundPeony

Earth Estries

Ratel Master

SlyMongo
2022-12-03
RatelSビルダのcompiletime2022-05-24
Hemigateのローダのcompiletime
2020-09-22
cloudshappen.comのドメイン登録2021-08-24
onedrivo.comのドメイン登録2022-04-15
Hemigateのローダのcompiletime2022-06-30
Hemigateのローダのcompiletime2022-05-09
Hemigateのcompiletime2022-02-24 03:40:11 UTC
SlyMongoをロードする
Mofu Loaderのcompiletime2022-02-24 03:38:03 UTC
SlyMongoをロードする
Mofu Loaderのcompiletime2022-12-15
SlyMongoのcompiletime2023-03-17
TW政府に対するスピ
アフィッシングメール
送信2024-10-30
RatelSのcompiletime2022-10-05
RatelSをロードするMofu Loaderのcompiletime2024-10-23
version.dllのcompiletime2024-11-06
micDownのcompiletime2024-11-08
Install.exeのcompiletime

35

IoC
File Name

Sha1

Note

1.cab

5f9c5655e779467fb353c74901cf66ede29647f1

Dracu loader -> Hemigate

2.cab

84b8c462107ab54cf660ef33f969d937efad38f1

PlugX

libvlc.dll

bc92d96b409e7bda6d46caf4843dc9507c45b00f

Mofu Loader -> SlyMongo

usost.ppt

f9b1ca8b5386bc93bbc49d63d4e18fd8f14f25a9

libvlc.dllによって復号されるSlyMongo

OneDrive.zip

3b7426be3bc95c860083516057a76f5605d59402

Mofu Loader -> SlyMongo

OneDrive.zip

86c60bb1513b98f8023b0f5e27b598125c3f75e0

Mofu Loader -> SlyMongo

OneDrive.zip

5bde79892a7944e415c9332fbf1a6768dff447b5

Mofu Loader -> SlyMongo

NetLabs.zip

213df95ee891a2235f04f7748dd2f955b2b3cb58

Dracu loader -> Hemigate

36

YARA Rules●●●

Mofu Loader
HemiGate(Payload)
SlyMongo(Payload)

37

YARA Rules
rule MofuLoader {meta:
description = "detect MofuLoader in memory"
strings:/*
LAB_0000000f
XREF[1]:00000020(j)0000000f c1 ca 0c
ROR
EDX,0xc
00000012 0f be c0
MOVSX
EAX,AL
00000015 49 ff c3
INC
R1100000018 03 d0
ADD
EDX,EAX
0000001a 41 8a 03
MOV
AL,byte ptr [R11]0000001d 41 3a c7
CMP
AL,R15B
00000020 75 ed
JNZ
LAB_0000000f
00000022 81 fa a1
CMP
EDX,0x1da0a3a1
a3 a0 1d00000028 74 62
JZ
LAB_0000008c
0000002a 81 fa d0
CMP
EDX,0x4717a7d0
a7 17 4700000030 74 45
JZ
LAB_00000077
00000032 81 fa a3
CMP
EDX,0x8f592ca32c 59 8f00000038 74 31
JZ
LAB_0000006b0000003a 81 fa a0
CMP
EDX,0xb01ff0a0
f0 1f b000000040 74 15
JZ
LAB_00000057
00000042 81 fa 4f
CMP
EDX,0xd7656a4f
6a 65 d700000048 75 52
JNZ
LAB_0000009c
0000004a 41 0f b7 02
MOVZX
EAX,word ptr [R10]0000004e 44 8b 34 87
MOV
R14D,dword ptr [RDI + RAX*0x4]00000052 4c 03 f1
ADD
R14,RCX
00000055 eb 45
JMP
LAB_0000009c*/$ror = { c1 c? 0c }$api_hashing = { 81 f? a1 a3 a0 1d 74 ?? 81 f? d0 a7 17 47 74 ?? 81 f? a3 2c 59 8f 74 ?? 81 f? a0 f0 1f b0 74 ?? 81 f? 4f 6a 65 d7 }condition:
all of them}38

YARA Rules
rule Hemigate {meta:description = "detect Hemigate in memory"

strings:$cmd1 = ".?AVCATcpSocket@@"$cmd2 = ".?AVCBaseSocket@@"$cmd3 = ".?AVCFile@@"$cmd4 = ".?AVCmd@"$cmd5 = ".?AVCPro@@"$cmd6 = ".?AVCRdp@@"$cmd7 = ".?AVCShell@@"$cmd8 = ".?AVCSocket5@@"$cmd9 = ".?AVCSTlsSocket@@"$cmd10 = ".?AVCTransf@@"$cmd11 = ".?AVCFileMoniter@@"$cmd12 = ".?AVCKeylogPlug@@"$cmd13 = ".?AVCPipe@@"condition:
8 of them}39

YARA Rules
rule SlyMongo {meta:desctiption = "Detect SlyMongo in memory"hash = "3AA9AB1C50B6F1D8878C7F6FA9E21407579534F1C213DB5433003C14A29373E7"
strings:/*
0x14000dc93 3BCF
cmp ecx, edi
0x14000dc95 0F8714030000
ja 0x14000dfaf
0x14000dc9b 0F8442020000
je 0x14000dee3
0x14000dca1 83E90A
sub ecx, 0xa
0x14000dca4 0F8482010000
je 0x14000de2c0x14000dcaa 83E903
sub ecx, 30x14000dcad 0F846C010000
je 0x14000de1f0x14000dcb3 83E901
sub ecx, 10x14000dcb6 0F84AC000000
je 0x14000dd68
0x14000dcbc 83E901
sub ecx, 10x14000dcbf 0F848D000000
je 0x14000dd520x14000dcc5 83E901
sub ecx, 10x14000dcc8 7472
je 0x14000dd3c0x14000dcca 83E901
sub ecx, 10x14000dccd 7460
je 0x14000dd2f0x14000dccf 83E901
sub ecx, 10x14000dcd2 744A
je 0x14000dd1e0x14000dcd4 83E901
sub ecx, 10x14000dcd7 7438
je 0x14000dd110x14000dcd9 83F901
cmp ecx, 10x14000dcdc 0F8554050000
jne 0x14000e236*/$cmp_cmd = {3B CF 0F 87 ?? ?? ?? ?? 0F 84 ?? ?? ?? ?? 83 E9 0A 0F 84 ?? ?? ?? ??
83 E9 03 0F 84 ?? ?? ?? ?? 83 E9 01 0F 84 ?? ?? ?? ?? 83 E9 01 0F 84?? ?? ?? ?? 83 E9 01 74 ?? 83 E9 01 74 ?? 83 E9 01 74 ?? 83 E9 01 74?? 83 F9 01 0F 85 ?? ?? ?? ??}$str1 = "DNS server URL is NULL. Call mg_mgr_init()" ascii$str2 = "error connecting to %s" ascii
condition:
all of them}40Thank youDo you have any questions?

Please keep this slide for attribution

CREDITS: This presentation template was created by Slidesgo, andincludes icons by Flaticon, and infographics & images by Freepik