攻撃グループLuoYuが使用するマルウェアWinDealer
2021年1月28日に開催されたJSAC2021で、2014年から活動が確認されている韓国や日本の組織をターゲットにした攻撃グループ「LuoYu」についての発表がありました[1][2]。今回は、JPCERT/CCが確認したLuoYuが使用するマルウェアWinDealerについてご紹介します。
マルウェアWinDealerの概要
マルウェアWinDealerは、感染したPCの各種情報を窃取し、C2サーバーへ送信する情報窃取型のマルウェアです。マルウェアの動作概要を図1に示しています。
図1:マルウェアWinDealerの動作概要
マルウェアWinDealerは起動初期にC:\ProgramData配下のファイルから設定情報をロードし、DLLモジュールを自身のメモリ上に展開します。マルウェアの機能として、PCの機器情報、ネットワーク設定、SNSアプリなどのデータを窃取し、%TEMP%配下に“.a”という拡張子でファイルを保存します。その後、保存されたファイルをC2サーバーへ送信します。
以降では、WinDealerの以下の機能について解説します。
- 設定情報の読み込み方法
- C2サーバーとの通信
- 窃取したデータの加工と送信処理
- メモリ上に展開されるモジュールの機能
設定情報の読み込み方法
マルウェアWinDealerの設定情報は、C:\ProgramData配下に複数のファイルに分かれて保存されており、実行時に読み込まれます。設定情報は、鍵を“b6a7%7486”としたXORベースのエンコードがされています。設定情報の各ファイルパスとその内容についてはAppendix Aをご覧ください。図2は、設定情報を読み込んだ際のデータをデコードする関数です。
図2:設定情報が格納されているファイルのデコード関数
C2サーバーとの通信
マルウェアWinDealerは下記の設定情報ファイルが存在した場合、それらのファイルから通信先を読み込み、C2サーバーと通信します。
- C:\ProgramData\ad5f82e8
- C:\ProgramData\1c76cbfe
- C:\ProgramData\9c3b6294
それらのファイルが存在しなかった場合、WinDealerは以下に示すどちらかの範囲のランダムなIPアドレスへ通信(宛先ポート6999/UDPか55556/TCP)します。一定時間ごとに、もう片方の範囲のランダムなIPアドレスへと通信先が切り替わることを確認しています。
- 113.62.0.0 - 113.63.255.255
- 111.120.0.0 - 111.123.255.255
C2サーバーとの通信フローを図3に示します。はじめにAESの鍵をRSA暗号にて暗号化し、配送します。二回目以降の通信では、配送したAES鍵を用いて窃取されたデータを暗号化し、一定間隔で送信します。その後、C2サーバーから送られてくるコマンドを受信し、コマンド実行結果を同じくAES鍵で暗号化し、送信します。また、この通信フロー以外の通信として、www[.]microsoftcomという現時点で存在しないドメインに対する通信や、icanhazip[.]comへの通信が確認されています。
図3:C2サーバーとの通信フロー
図4にAES鍵配送時の通信内容の例を示します。AES鍵とその鍵のCRC32チェックサムの値をRSA1024bitの公開鍵によって暗号化後、配送されます。なお、公開鍵は検体内にハードコードされており、類似検体でも同じ公開鍵がハードコードされていることを確認しています。
図4:AES鍵配送時の通信内容の例
2回目以降の通信では初回の通信で配送された、動的に生成されたAES鍵を用いてAES128bitのECBモードによってデータの暗号化を行い、通信します。なお、送受信の詳しいフォーマットについてはAppendix B をご参照ください。
窃取したデータの加工と送信
マルウェアWinDealerでは窃取した各種データを%TEMP%配下のフォルダーへ“.a”ファイルとして加工し、AESによる暗号化後に送信する機能を確認しています。データの窃取から送信までの流れを図5に示しています。各種データの窃取から加工までをモジュールが行い、C2サーバーへの送信をWinDealer本体が行います。
図5:マルウェアWinDealer本体とモジュールによるデータ送信までの流れ
モジュールによる“.a”ファイルの生成についてコードの一部を図6に示しています。
図6: DLLモジュールによる“.a”ファイルの生成部分
一度、窃取した各種データを“.t”の拡張子でファイルを作成し、“.a”の拡張子にリネームすることで“.a”ファイルが作成されることを確認しています。なお、加工される前の各種データはデータの種類に応じたディレクトリに保存されており、“.a”ファイルを作成する際にそれらのディレクトリから取り出されます。各ディレクトリの詳細についてはAppendix Eをご参照ください。
生成されるファイルへのアクセス時には図7に示す“YYYY”を鍵としたXORベースの関数によってエンコード・デコード処理が行われた後に書き込みや読み込みの処理が行われています。
図7:“.a”ファイルアクセス時のXORベースエンコードを行う関数
メモリ上に展開されるモジュールの機能
マルウェアWinDealerは起動初期に図8に示すように検体内にエンコードされたPE形式のDLLモジュールをメモリ上に展開し、実行します。
図8:エンコードされたモジュールデータ
はじめに自身のファイルパスを取得し、ファイルから0xFF3456FF00のバイト列を検索し、検索されたバイト列のオフセット0xEからデータを抽出します。その後、検索されたバイト列のオフセット0x4の値を用いて図9のXORをベースとしたデコードルーチンを介してDLLモジュールがメモリ上に展開され、実行されます。
図9:モジュールのデコード部分
展開されたDLLモジュールのDLL名は、MozillaDll.dllとなっています。また、Export関数は以下の3つがあります。
- AutoGetSystemInfo:各種データの窃取
- GetConfigInfo:設定情報の設定
- partInitOpt:コマンドの設定
展開されたDLLモジュールは、以下の内容を常時監視し、確認した関連ファイルを別名ファイルとして保存したり、送信するデータとして取得したりします。
- USBメモリに保存されたファイル
- マイドキュメントやデスクトップ、ゴミ箱配下のファイル
- 各種SNSアプリケーションに関連するフォルダー配下のファイル
なお、C2サーバーから受け取るコマンドとその内容の詳細についてはAppendix Dをご参照ください。
おわりに
今回は、攻撃グループLuoYuが使用するマルウェアWinDealerについて紹介しましたが、LuoYuはこれ以外にもさまざまなプラットフォームで動作するマルウェアを使用することで知られています。新しいマルウェアが確認された際は、報告したいと思います。
なお、今回解説したマルウェアの類似検体についてSHA256ハッシュ値をAppendix Fに記載しています。
インシデントレスポンスグループ 増渕 維摩
参考情報
[1] “LuoYu” The eavesdropper sneaking in multiple platforms
https://jsac.jpcert.or.jp/archive/2021/pdf/JSAC2021_301_shui-leon_en.pdf
[2] Japan Security Analyst Conference 2021 開催レポート ~3RD TRACK~
https://blogs.jpcert.or.jp/ja/2021/02/jsac2021report1.html
Appendix A WinDealerの設定情報
ファイルパス | マルウェア内での識別文字列 | 内容 |
C:\ProgramData\923b5fd7 |
remark |
- |
C:\ProgramData\ad5f82e8 |
remotedomain |
ドメイン名 |
C:\ProgramData\8fe4c114 |
password |
- |
C:\ProgramData\1c76cbfe |
remoteip |
通信先のIP |
C:\ProgramData\9c3b6294 |
reverseip |
通信先のIP再設定値 |
C:\ProgramData\789406d0 |
- |
ダミーのホストへの接続結果 |
C:\ProgramData\c25549fe |
otherinfo |
- |
C:\ProgramData\f46d373b |
- |
起動時に作成 |
C:\ProgramData\windows.inf |
- |
- |
C:\ProgramData\Destro |
- |
runキーに登録する名前情報 |
Appendix B WinDealer送受信データの内容
オフセット |
長さ(byte) |
内容 |
0x00 |
4 |
0x91DA8106 |
0x04 |
4 |
0x439FC7CE |
0x08 |
4 |
識別ID |
0x0C |
1 |
設定ファイル"789406d0"の内容で決定 |
0x0D |
3 |
0x001400 |
0x10 |
128 |
AES鍵+AES鍵のCRC32値をRSAで暗号化したデータ |
オフセット |
長さ(byte) |
内容 |
0x00 |
4 |
0x91DA8106 |
0x04 |
4 |
0x439FC7CE |
0x08 |
4 |
識別ID |
0x0C |
1 |
設定ファイル"789406d0"の内容で決定 |
0x0D |
1 |
Type |
0x0E |
2 |
0x1400 |
0x10 |
1 |
長さ(オフセット0x10以降はAESで暗号化) |
0x11 |
1 |
0x6 |
0x12 |
1 |
remarkの長さ |
0x13 |
|
remark |
- |
1 |
0x3 |
- |
1 |
passwordの長さ |
- |
- |
password |
- |
1 |
0x5 |
- |
1 |
otherinfoの長さ |
- |
- |
otherinfo |
- |
- |
システム情報 |
オフセット |
長さ(byte) |
内容 |
0x00 |
4 |
0x91DA8106 |
0x04 |
4 |
0x439FC7CE |
0x0D |
1 |
コマンド(オフセット0x0D以降はAESで暗号化) |
0x10 |
2 |
コマンドデータの長さ |
0x12 |
2 |
未使用 |
0x14 |
2 |
未使用 |
0x16 |
2 |
未使用 |
0x18 |
コマンドデータの長さ |
コマンドデータ |
Appendix C WinDealerコマンド一覧
値 |
パラメーター文字列※ |
内容 |
0x06 |
content-length: 2 |
uninstall |
0x09 |
content-length, filename, time |
%TEMP%配下のファイル削除 |
0xC |
filename, flg |
CreateProcess |
0x1F |
speed |
各Sleep timeの設定 |
0x2D |
filepath |
指定ファイルの内容取得 |
0x50 |
filename, md5 |
指定ファイルの削除 |
0x51 |
filepos,filename, filelen, block, md5 |
指定ファイルへ書き込み |
0x5A |
datastate |
"C:\ProgramData\windows.inf"への書き込み |
0x5B |
- |
レジストリへ永続化設定 |
0x5C |
list |
プロセスチェック、永続化設定 |
0x5D |
yes |
{HKCU}\\Softwaware\MicrosoftのSTypeに値を設定 |
0x5E |
otherinfo |
"c25549fe"へ書き込み |
0x60 |
headsign, 1, 2 |
"789406d0"へ書き込み |
0x61 |
reverseip |
"9c3b6294"へ書き込み |
0x63 |
- |
設定情報の取得 |
0x64 |
- |
timeの読み込み |
0x66 |
remoteip, remark, password |
各設定ファイル書き込み |
0x67 |
sessionid: |
- |
0x8F |
Hkey, subkey, valuename, classesroot, currentuser, localmachine, users, currentconfig |
RegQueryValueの実行 |
0xAA |
pname |
スクリーンキャプチャ |
0xAB |
- |
スクリーンキャプチャ関連の設定 |
0xAD |
- |
スクリーンキャプチャ関連の設定 |
※パラメーター文字列:受信したコマンドデータからこれらの文字列をパースし、コマンドのパラメーターとして使用している
Appendix D 展開されるモジュールのコマンド一覧
値 |
パラメーター文字列※ |
内容 |
0x02 |
- |
スクリーンキャプチャ関連 |
0x03 |
bootdir, filetype |
フォルダー・ファイル情報 |
0x05 |
filename, monitortype, begpos, block |
ファイル送信 |
0x07 |
- |
ドライブ情報の取得 |
0x0A |
- |
lnkファイルの設定 |
0x0D |
- |
コマンド0xC0, 0xC5, 0xC3, 0xC1, 0xC2, 0xC4, 0xC6をそれぞれ実行 |
0x12 |
freq, storetm, quality, type |
パラメーターの設定 |
0x1E |
srhdir, srhcont, srhnum, sessid |
- |
0x28 |
filename |
ファイル情報の取得 |
0x29 |
filefilter, settype, usbfilter, checkdirfilter |
モニター用パラメーターの設定 |
0x2A |
monitortype, monitorvalue |
モニター結果のファイル取得 |
0x2B |
- |
- |
0x30 |
- |
"c:\windows", "c:\program files"等の内容を"~BF24"へ書き込み |
0x32 |
freq, storetm |
パラメーターの設定 |
0x3E |
file |
%TEMP%配下にjpegファイルを作成 |
0x65 |
filename, fileoffset |
指定ファイルとオフセットから内容を取得 |
0x69 |
filename, delete, yes |
指定ファイルの削除 |
0x7A |
cmdtype, command: ,reset, downfile, getmypath, dealmd5 |
cmd.exeの実行 |
0x7B |
session, command, reset, downfile, exit, getmypath |
リモートシェルを実行 |
0xC0 |
- |
プロセス一覧を"28e4-20a6acec"へ書き込み |
0xC1 |
- |
アプリ一覧を"28e4-20a6acec"へ書き込み |
0xC2 |
- |
キーボード情報を"28e4-20a6acec"へ書き込み |
0xC3 |
- |
SNSに関連するレジストリ内容を"28e4-20a6acec"へ書き込み |
0xC4 |
- |
Skype, QQ, WeChat, wangwangの設定情報を"28e4-20a6acec"へ書き込み |
0xC5 |
- |
MACアドレス等を"28e4-20a6acec"へ書き込み |
0xC6 |
- |
ネットワーク設定を"28e4-20a6acec"へ書き込み |
※パラメーター文字列:受信したコマンドデータからこれらの文字列をパースし、コマンドのパラメーターとして使用している
Appendix E 生成されるディレクトリ一覧
ID |
パス |
マルウェア内での識別文字列 |
なし |
%TEMP%\\~FEFEFE |
- |
0x01 |
%TEMP%\\070a-cf37dcf5 |
- |
0x02 |
%TEMP%\\d0c8-b9baa92f |
audio |
0x03 |
%TEMP%\\~B5D9 |
keylog |
0x04 |
%TEMP%\\632c-0ef22957 |
- |
0x05 |
%TEMP%\\8e98-fb8010fb |
filelist |
0x06 |
%TEMP%\\7a4a-90e18681 |
- |
0x07 |
%TEMP%\\d4a5-30d3fff6 |
- |
0x08 |
%TEMP%\\d4dc-3165f4cf |
- |
0x09 |
%TEMP%\\~CE14 |
monitortype |
0x0A |
%TEMP%\\~CE2E |
- |
0x0B |
%TEMP%\\~B5BE |
skypeaudio |
0x0C |
%TEMP%\\~B61A |
skypeshoot |
0x0E |
%TEMP%\\5a7e-42ccdb67 |
- |
0x0F |
%TEMP%\\~BF24 |
browser |
0x10 |
%TEMP%\\65ce-731bffbb |
md5filter |
0x11 |
%TEMP%\\~BF34 |
browsercookie |
0x12 |
%TEMP%\\28e4-20a6acec |
systeminfo |
0x61 |
%TEMP%\\~FFFE |
otherfile |
0x62 |
%TEMP%\\FFFF |
otherdata |
0x63 |
%TEMP%\\63ae-a20cf808 |
- |
Appendix F 類似検体のSHA256ハッシュ値
- EXE形式
- 1e9fc7f32bd5522dd0222932eb9f1d8bd0a2e132c7b46cfcc622ad97831e6128
- b9f526eea625eec1ddab25a0fc9bd847f37c9189750499c446471b7a52204d5a
- DLL形式
- 0c365d9730a10f1a3680d24214682f79f88aa2a2a602d3d80ef4c1712210ab07
- 2eef273af0c768b514db6159d7772054d27a6fa8bc3d862df74de75741dbfb9c