This post is also available in: English (英語)
要約
Unit 42 のリサーチャーは悪名高いバンキングトロイの木馬Emotetの新たな更新を特定し、分析しました。Emotetは2020年12月から活発に利用されており、そのしつこさ、息の長さ、回避テクニックの手強さが防御側の頭痛の種となっています。
国際法執行機関による最近の措置はEmotet脅威アクターやインフラストラクチャにとっての痛手となりましたが、この更新版Emotetによって採用されていた手法、戦術、手順(TTP)は、あらゆる業界へのアクティブで突出した脅威の内情をあばく結果となりました。
本稿では、このEmotetの更新のエンドツーエンドの攻撃チェーンについて詳しく解説します。これには、第1段階の悪意のあるおとり文書、第2段階のPowerShellローダへのペイロードの難読化解除、第3段階のバイナリR43H.dllのダウンロードが含まれます。
また、このEmotetの更新で使用される永続性メカニズム、およびコマンド & コントロール(C2)チャネルとそのセキュリティ侵害の兆候(IOC)についても詳しく解説します。最後に、セキュリティソリューションがEmotetの回避技術に立ち向かうことの難しさを示します。
パロアルトネットワークスの次世代ファイアウォールをご使用のお客様は、脅威防御およびWildFireセキュリティサブスクリプションによってEmotetから保護されています。お客様はまた、Cortex XDRによっても保護されています。
攻撃チェーン分析
Emotetは多くの場合フィッシング電子メールに添付されたWord文書によって配布されます。以下に、Emotet攻撃チェーンのステップを示します。
- Word文書が配布され、マクロが有効にされて開きます。
- VBScriptマクロが実行され、悪意のあるPowerShellスクリプトが生成されます。
- 悪意のあるPowerShellスクリプトがローダとして最初のDLLバイナリをダウンロードします。
- 最初のローダが後続のDLLバイナリをインストールします。このバイナリはそれ自体を更新します。
- 最後のDLLが被害者の機微データを窃取するかC2サーバーと通信してさらに攻撃を実行します。

第1段階のマルウェア - Wordマクロランチャ
Sha256(2cb81a1a59df4a4fd222fbcb946db3d653185c2e79cf4d3365b430b1988d485f)
この分析サンプルは、Microsoft Office OLE2 Compound File BinaryのWordファイルです。多くのスピアフィッシング攻撃と同様、ソーシャルエンジニアリングによってユーザーを操り、マクロで悪意のあるVisual Basic for Applications (VBA)コードの配布を開始できるようにします。

ユーザーがMicrosoft Wordのマクロを有効にしてルアー(おとり)文書を開くと、組み込みのVBAマクロコードが実行され、Document_Open()イベントが生成されます。

次に呼び出されるのは、Jotxu6biv0471oy0()という関数です。この関数の振る舞いと、第1段階のマルウェアの実行内容の続きを以下に示します。
1. この文書のStoryRanges.Item()メソッドからwdMainTextStoryタイプの単一のStoryRangeを取得し、変数mKbjhqsに格納します。この変数の内容は難読化されたペイロードデータで、攻撃チェーン内で後ほど難読化が解除されます。VBAにおけるStoryRangeは、文書内でテキストを検索または置換するために使用されます。

2. 一連のGo To呼び出しで難読化されたデータが収集され、いくつかの変数に格納されます。その後、データは連結され、変数C_tmpi32le9に割り当てられます。

3. C_tmpi32le9に格納された文字列が難読化解除され、図4に示すように一連の関数呼び出しに置き換えられます。

C_tmpi32le9に格納されたテキストペイロードは、関数Lehj73snaqzhyepdw9()を呼び出すことで難読化を解除されます。この関数は、単純な文字列置換ルーチンを実装する関数Jumkzxvtzz2s()のラッパーとして機能します。この関数はまた、組み込み関数Replace()を呼び出します。これに区切り文字として文字列]b2[sが渡され、ペイロード文字列内の検索および置換が行われます。これによって生成されるペイロードは、WMIモニカーwinmgmts:win32_processで、変数H4qcty67722xqmrmnに格納されます。
4. CreateObject()関数を呼び出し、パラメータとしてwinmgmts:win32_process文字列を渡すことで、新しいオブジェクトが生成されます。生成されるオブジェクトの値はFcqv6woostm0変数に格納されます。これはWin32_Process WMIクラスのオブジェクトです。この変数は、新しいプロセスを生成できるオブジェクトに対するハンドルです。

5. 長さ修正ルーチンを実行し、その結果データを変数Ma9hdg7q365lpbに格納します。関数Lehj73snaqzhyepdw9()の呼び出しは、パラメータとしてMa9hdg7q365lpbを指定して実行されます。

6. メソッドWin32_Process.Create()の呼び出しは、以前にインスタンス化したオブジェクトを参照し、以前に実行したLehj73snaqzhyepdw9()関数の戻り値を最初のパラメータとして渡して実行します。戻り値には、難読化解除された最終的なペイロードが含まれます(オペレーティングシステムとPowerShellのコマンド)。

このEmotet攻撃チェーンの第1段階は、もともとこの悪意のある文書に組み込まれていた難読化解除されたペイロードを実行して終了します。このペイロードには、引数としてbase64データが渡されるPowerShellの難読化された呼び出しの前後でネストされている一連のcmd.exeの呼び出しが含まれています。

第2段階のマルウェア - PowerShellダウンローダ
攻撃チェーンの第2段階は、ネストされたcmd.exeの呼び出しで始まります。この最初の呼び出しによって、msg.exeが起動されます。これにより、おとりのWordエラー“Word experienced an error trying to open the file (Wordでファイルを開く際にエラーが発生しました)”を含むメッセージウィンドウが表示されます。
次に、パラメータとしてbase64符号化データが指定された状態でPowerShellが起動され、cmd.exeが引数として文字列P^Ow^er^she^L^Lを取ります。この引数は、静的な検出を回避するため、エスケープ文字、キャレット(^)で細工されます。-wオプションは、PowerShell.exeプロセスがバックグラウンドで起動されるように設定します。-ENCODオプションは、PowerShellにその場でbase64引数をデコードするように指示します。

PowerShell – Base64分析

この難読化されたコードの目的は次のとおりです。
1. ServicePoint Managerで使用されるセキュリティプロトコルをTLS 1.2に設定します。
2. ランダムに生成されるファイルの絶対パスを設定します。
3. 全部で7つのUniform Resource Identifier (ユニフォームリソース識別子、URI)の配列を生成します。

4.WebClient .NET Classの新しいオブジェクトをインスタンス化します。これは、DownloadFile()メソッドを活用して、前のステップで生成された配列に含まれる各項目(URI)からファイルを取得します。ダウンロードされたファイルは、固定の絶対パスおよびファイル名%USERPROFILE%\Ygyhlqt\Bx5jfmo\R43H.dllに保存されます。
このステップで使用されるフォルダの名前は、攻撃チェーンの第1段階のマクロ実行で生成されたフォルダの名前と一致しています。
5.長さチェックを実行し、37652バイトとなることを確認します。このチェックはおそらく、バイナリコンテンツが正しく転送されたことを確認するためのものです。
6.rundll32.exeコマンドを実行し、エントリポイント関数としてControl_RunDLLを指定することにより、ダウンロードしたDLLファイルを実行します。次の画像は、難読化解除されたコマンド全体を示しています。

上記のとおり、PowerShellスクリプトはさまざまなURIに対していくつかのHTTPリクエストを実行します。サーバーからの応答は、DLLファイルがダウンロードされていることを示します。ファイルの名前はNK05DJ2yiA.dllに設定されます。

第3段階のマルウェア – DLL分析
Sha256(bbb9c1b98ec307a5e84095cf491f7475964a698c90b48a9d43490a05b6ba0a79)
KEY: “k1>@dY0V<o)afFNz7v68r^Kn6)h)OGcSc”
図15は、親プロセスpowershell.exeの後にrundll32.exeの実行が続くプロセスツリーを示しています。

最初のプロセスには、引数としてR43H.dllへの絶対パスが指定され、2番目のプロセスには、ランダムパスとファイル名でファイルへのパスが指定されます。ただし、どちらのプロセスも、Control_RunDLLと呼ばれる同じエントリポイント関数で開始されます。以下に、このDLLの内部の仕組みと感染の連鎖への関与について説明します。
ダウンローダコードが第2段階のDLLファイルを受け取ると、このファイルは%USERPROFILE%\Ygyhlqt\Bx5jfmo\のパスに保存され、名前がR43H.dllに変更されます。ExeInfoPEツールで生成された検出結果によると、これはMicrosoft Visual C++バージョン~6.0~7.10の実行ファイルであることがわかります。

第3段階のマルウェアの実行では、新しい絶対パスがランダムに生成されます。MoveFileExW()関数を呼び出すと、ファイルが元の場所からこの新しい場所に移されます。絶対パスのフォーマットは次のとおりです。
- %SYSTEMROOT%\system32\<random_folder_name>\<random_filename>.<random_ext>
次に、図17に示すように、CreateProcessW()関数を呼び出すことで、lpCommandLineパラメータの値を設定します。このパラメータには、先ほど移動したDLLファイルの絶対パスと、前述のエントリポイント関数Control-RunDLLが含まれます。

2つ目のrundll32.exeの実行によって行われたアクションについては、第4段階のマルウェアのセクションで説明します。
リソース暗号化データの検索とロード
Emotetマルウェアはいくつかのアクションを実行しますが、そのうちの1つがResource Win32 API関数の使用です。これは、実行ファイルのリソースセクションからのバイナリデータのロードとその復号化、および新たに作成されたマルウェアのドロップを目的としています。
最初に、オフセット0x10002119でVirtualAlloc()関数の呼び出しが行われます。これにより、割り当てタイプがMEM_COMMIT、メモリ保護オプションがPAGE_EXECUTE_READWRITEで、0x1B000 (110592d)バイトが割り当てられます。

オフセット0x10002128で、関数呼び出し100045C0により、リソースセクションのバイトを前のステップで新たに生成したメモリ割り当て(図18を参照)にコピーします。次の画像(図19)は、Resource Hackerツールから直接取得したリソースのバイトの内容と、実行しているプロセスから直接取得したメモリの内容との比較を示しています。

後続の命令の実行の際に、0x10001D9A関数の呼び出しが行われます。この関数は、オフセット0x10001E4Dに位置するループで、いくつかの操作が行われます。これらの操作の1つが、オフセット0x10001E4Dにある1バイトのXOR命令(xor byte ptr [esi+ecx], al)です。これは、PEバイナリデータが格納される実行ファイルのリソースデータ全110591バイトを復号化することが目的です。最終結果は、メモリ内の再構築された実行ファイルです。図20では、プロセスのメモリ内で暗号化されているデータと復号化されているデータが示されています。

オフセット0x10002167で、EAXレジスタで指定されたアドレス(インメモリ(ドロップされた)実行ファイルのControl_RunDLL関数のエントリポイント)に対して関数ポインタの間接呼び出しが行われます。図21は、参照用にこれをグラフィカルに示したものです。

call EAX命令が実行されると、実行制御が新しい実行ファイルに移されます。
永続性メカニズム
Emotetマルウェアは、CreateServiceW()関数を呼び出すことで、新しいサービスをインストールします。この関数は、オペレーティングシステムにより自動的にマルウェアのコピーを開始します。図22は、この新しいサービスがすでにインストールされている様子を示しています。

サービス名はランダムに生成されます。下のリストに、数回のテスト実行で使用されたさまざまな名前を示します。
- ディスクのデフラグメンテーション機能の提供。
- テレビおよびFM放送受信用Windows Media Centerサービス。
- アプリケーション起動の際、Application Compatibility Cacheがアプリケーションを要求するプロセス。
- Windows Media Center内でのテレビ番組の録画の開始および停止。
- アイドル状態のネットワーク帯域幅を利用した、バックグラウンドでのファイル転送。このサービスが無効の場合、Windows UpdateやMSN Explorerなど、BITSに依存するアプリケーションは、自動的にプログラムやその他情報をダウンロードできません。
第4段階のマルウェア – DLL分析
Sha256(bd1e56637bd0fe213c2c58d6bd4e6e3693416ec2f90ea29f0c68a0b91815d91a)
この段階では、最後のペイロードによって、C2サーバーに情報を送信するための環境が準備されます。このために、このペイロードは関数呼び出しを実行し、最終的にHTTP要求を実行するために必要なデータを取得します。
以降のステップでは、0x2E1000というベースアドレスを前提とし、このペイロードの配信までにEmotetマルウェアがたどるシーケンスとその詳細について説明します。

第5段階のマルウェア – C2トラフィック
関数呼び出しリストに示されているとおり、HttpSendRequestW() API関数を使用して、サーバーにデータを送信します。この関数により、送信者は、通常HTTPクライアントが送信するデータ量より多くのデータを送信することができます。

図25は、送信され、Wiresharkによって取得された後のデータを示しています。

回避テクノロジ
- 複数のダウンロードリンクを使用して、第1段階のローダをダウンロードします。セキュリティ製品によっていずれかのダウンロードリンクがブロックまたは捕捉されない限り、ローダのダウンロードは成功します。
- 複数のC2サーバーIPアドレスを使用して、C2サーバーと通信します。いずれかのIPアドレスがブロックされない限り、通信は成功します。
- C2通信では、機密情報がカスタムのアルゴリズムで暗号化される、標準のHTTPを使用します。セキュリティ軽減の観点からすると、このC2の負荷を無害のトラフィックと区別するのは困難です。
結論
連携した法執行措置により2021年1月末にそのインフラストラクチャが停止されるまで、Emotetは勢力のある攻撃者でした。前述の攻撃チェーンは精巧で、セキュリティ検出を回避するように設計されています。単一のセキュリティアプライアンスを装備してもEmotet攻撃は回避できません。セキュリティソリューションを組み合わせて初めて(つまりファイアウォール、サンドボックス、エンドポイントとこれらすべてのコンポーネントを統合するソフトウェア)、Emotet攻撃を阻止することができるのです。
この記事を書いている時点では、下記のIOCセクションにリストされているサンプルは一般には公開されていませんでした。しかし私たちは、Emotetの振る舞いと通信を検出し、これらに対応できるようにしました。
パロアルトネットワークスのお客様は、以下の方法でこのような攻撃から保護されています。
- 次世代ファイアウォールと脅威防御のシグネチャ21201、21185、および21167により、新しいペイロードをダウンロードし、機密情報を公表しようと試みるHTTP C2リクエストを特定します。
- WildFire、NGFWセキュリティサブスクリプション、およびCortex XDRは、Emotetとそのドロッパ―を特定し、ブロックします。
IoC
サンプル
- 209a975429304f771ef8a619553ffd9b8fc525a254157cbba47f8e64ec30df79
- 2a8dcfc8f1262e1c6b5f65c52cdccdbcd40ff6218f4f25f82bd3eb025593dbc0
- 2cb81a1a59df4a4fd222fbcb946db3d653185c2e79cf4d3365b430b1988d485f
- 36df660c8e323435d2bc7a5516adcadfbd0b220279f634725e407da9f2b9d4f5
- 3788c8a783fbbd61fa60d41b78568c095a8587db728a61bff67c3ffebfad82a4
- 704759a244e3f27481f6ad225a0e1c30ae46e411e01612d68ca76fe2fd8cee54
- 7a18e87591637a8e962386b9c72aed584037a953ce7fe5ae51edba7a0ca57c1a
- 96a1fea9853e6f77d4449da325dfdb1545b905bdb7ba227d24e6a1a5f8cb3bd4
- a9668efdb68bf251dae8623cb4f3dc8b9b7f42d77927d287633af94a72e9d1dc
- fc3c1ce6491bca2b028ae8806ca84d4b9dcb577fb2551aa871ca23eca19b10f5
ドロッパ
- 0a0bf0cab20ec7fb530738c4e08f8cd5062ea44c5da3d8a3e6ce0768286d4c51
- 2a0a1e12a8a948083abe2a0dcbf9128b8ec7f711251f399e730af6645e86d5c8
- 3b3a9517b61d2af8758e60d067c08edd397ad76b25efe1cbd393229088567002
- 3bbda08f5e15c5cb4472c6e610f2063eb68f54c0234a2197bc4633f4344ab27f
- 3e2fd3a5d790a0d4efe1100af08e3e2011f26416154ec11f1315db2ca6ca71bd
- 4eb1928c08d16a9407dbf89ad1279886379a0415bdd7760a3b2d0697f7d287c6
- 95bc30b35aa2d2baa80b50e970707197a26bd19d7772cbf65ff3d0300fe8e789
- 97c395e1bd0c35e9b8e6f9d97b470abdfdacec25e0e4e3b987e3813fb902de9f
- bbb9c1b98ec307a5e84095cf491f7475964a698c90b48a9d43490a05b6ba0a79
- bd1e56637bd0fe213c2c58d6bd4e6e3693416ec2f90ea29f0c68a0b91815d91a
URL
- http://abrillofurniture[.]com/bph-nclex-wygq4/a7nBfhs/
- http://allcannabismeds[.]com/unraid-map/ZZm6/
- http://ezi-pos[.]com/categoryl/x/
- http://giannaspsychicstudio[.]com/cgi-bin/PP/
- http://ienglishabc[.]com/cow/JH/
- https://etkindedektiflik[.]com/pcie-speed/U/
- https://vstsample[.]com/wp-includes/7eXeI/
IP
- 5.2.136[.]90
- 37.46.129[.]215
- 70.32.89[.]105
- 110.172.180[.]180
- 132.248.38[.]158
- 138.197.99[.]250
- 152.170.79[.]100
- 157.245.145[.]87
- 161.49.84[.]2
- 190.55.186[.]229
- 190.247.139[.]101
- 203.157.152[.]9