FortiGuard Labs 脅威リサーチ
影響を受けるプラットフォーム: Microsoft Windows
影響を受けるユーザー: 64ビットWindowsユーザー
影響: デバイスを制御して、機密情報を収集
深刻度: クリティカル
フォーティネットのFortiGuard Labsは先日、被害者のデバイスに新たなトロイの木馬型Emotet(エモテット)を拡散するキャンペーンに使われた500個以上のMicrosoft Excelファイルをキャプチャしました。
Emotetはモジュール型トロイの木馬として知られ、2014年の半ばに初めて発見されました。それ以来、絶えず自己更新を繰り返し、攻撃を活発化させています。サイバーセキュリティに関する報道でも、折に触れて取り上げられています。EmotetはEメールなどのソーシャルエンジニアリングを使用して、添付された文書ファイル(Word、Excel、PDFなど)を開く、あるいはEメールの本文に記載されたリンクをクリックするなどの行為に受信者を誘導し、最新のEmotetの亜種を被害者のデバイスにダウンロードさせた後、それを実行します。
このブログのパート1では、Emotetの亜種がExcel文書内の悪意あるVBAコードによってどのように拡散されるか、ダウンロードされたEmotetマルウェアがRundll32プログラムでどのように動作するか、さらにはこの亜種で使用されている解析回避技術、被害者のデータを暗号化してC2サーバーに送信する方法、C2サーバーから応答データを受け取ったEmotetの動作、Emotetが被害者のデバイスで持続的攻撃を可能にするための手段などを解説しました。
今回のブログでは、悪意あるモジュールが含まれた応答パケットのデータの内容、C2サーバーから送信される最新のEmotet攻撃用モジュール、それを被害者のデバイスで展開する方法を解説します。さらに、それらのモジュールが被害者のデバイスからどのような機密データを窃取するかについても説明します。
C2サーバーは、重要データ(被害者のデバイスのシステムバージョン、Windowsアーキテクチャなど)を格納して最初に送信されたパケットを処理および確認すると、被害者のデバイスでEmotetが実行するための悪意あるモジュールを応答に含めて送信します。送信されるすべてのモジュールはファイルレスです。つまり、メモリ上にのみ存在し、Rundll32.exeを使用して実行されたX.dll(Emotetのコア)によって処理されます。
図1.1は、X.dllのコードとメモリのスクリーンショットです。下側がC2の応答パケットで、10012371の関数を呼び出してメモリ内で復号されています。このシリーズのパート1の図5.3を参照すると、このパケットの構造をより深くご理解いただけます。
赤線で囲まれた部分(99 DE~DD A5)は検証データで、パケットの残りのデータの署名済みハッシュです。その次の黄色で示されたdword、0x00000000は、返送したモジュールの実行方法をEmotetに通知するフラグです。0x00は、新しく作成されたスレッドでモジュールを実行するよう指示しています。青線で囲まれた部分がモジュールです。先頭がモジュールサイズ(この例では0x79400)、残りの部分(4D 5A 90 00以降)はモジュールのバイナリデータです。
図1.1が示すように、Emotetは40Hの検証データを使用して、復号されたデータを検証する必要があります。
その後、受け取ったモジュールをメモリ内に展開し、モジュールを実行する準備をします。次に、新しく作成されたスレッド内でモジュールのエントリポイントを呼び出します。このブログでは、このモジュールを「スレッドモジュール」と呼ぶことにします。スレッドモジュールの主な目的は、被害者のデバイスから機密データを窃取することと、窃取したデータをC2サーバーに送信する最終的な機能モジュールを展開して実行することです。これについては後述します。図1.2では、スレッド関数のASMコードが、展開されたスレッドモジュールのエントリポイントを呼び出しています。
スレッドモジュールは、.textセクションにあるPEファイル、すなわち最終的な機能モジュールをメモリ内で復号します。このモジュールを実行するために、スレッドモジュールはプロセスハロウイングを実行します。そのために、Windowsファイル「certutil.exe」を「%Windir%\SysWOW64\certutil.exe」または「%Windir%\system32\certutil.exe」から「%temp%」フォルダにコピーします。次に、ファイル名を「uvbubqj.exe」などのランダムな名前に変更します。その後、このファイルを使って一時停止プロセスを作成します。
図2.1のコマンドライン文字列が示すように、「uvbubqj.exe」は「certutil.exe」のコピー、「/scomma」とそれに続く一時ファイル「C:\Users\Bobs\AppData\Local\Temp\60B2.tmp」はプロセスのパラメーターです。この一時ファイル名は、GetTempFileNameW() APIを呼び出すことで作成されます。一時ファイルのパス「60B2.tmp」が機能モジュールによって読み取られ、窃取した情報の保存に使用されます。CreateProcessW()への6つ目の引数は0x00000004で、これは「CREATE_SUSPENDED」を指定する作成フラグです。これによってCreateProcessW()がプロセスを作成し、一時停止状態が開始されます。
続いて、GetThreadContext()、VirtualAllocEx()、ReadProcessMemory()、WriteProcessMemory()など一連のAPIを呼び出し、新しいプロセスのメモリに最終的な機能モジュールをインジェクトします。その後、SetThreadContext() APIが呼び出されます。これは、新しいプロセスのEIPレジスタを設定して、機能モジュールのエントリポイントを指定するためです。機能モジュールは、ResumeThread() APIが呼び出されると起動します。
以後、被害者のデバイスから窃取した情報を使って一時ファイルが作成されるまで、スレッドモジュールは一時ファイルの監視を続けます。
上記の解析では、C2モジュールがどのように被害者のデバイスに読み込まれ、実行されるかを説明しました。
C2サーバーは多数のモジュールを返送でき、それらの各モジュールは前述と同じ処理を実行します。機能モジュールは、それぞれのスレッド内で動作するスレッドモジュールを保持するほか、個々にプロセスハロウイングを実行します。
筆者は3つのC2モジュールを受信しました。次のセクションでは、C2モジュールが被害者のデバイスでどのように動作するかを解説します。
自己解凍型のパッカーがこのモジュールを保護しています。パッカーが起動するとPEファイルを復号し、「certutil.exe」の既存コードを上書きし、PEファイルを実行します。
解凍されたPEファイルは「WebBrowserPassView」というフリーウェアで、NirSoftによって開発されたものです。このソフトウェアはパスワード復旧ツールとして設計されましたが、被害者の認証情報を盗むために悪意あるアクターによって不正利用されています。ユーザーインタフェースには、複数のWebブラウザに保存された認証情報が表示されます。
筆者のテスト環境でこのモジュールを開くと、図3.1のように表示されます。このEmotetの亜種は、WebBrowserPassView v2.06を使用しています。
スレッドモジュールがコマンドラインパラメーター(/scomma C:\Users\Bobs\AppData\Local\Temp\7B3C.tmpなど)をプロセスに渡すと、WebBrowserPassViewは非ウィンドウモードに切り替わり、抜き取った認証情報を指定された一時ファイルに保存することができます。
コードを確認したところ、このモジュールは次のようにさまざまなWebブラウザから認証情報を収集できることがわかりました。
Microsoft IE、Microsoft Edge、Google Chrome、Mozilla Firefox、Opera、Apple Safari、SeaMonkey、Yandex、Vivaldi、Waterfox、Chromiumベースの全ブラウザ
以下のような認証情報が窃取されています。
• URL:保存された認証情報に対応するURL
• Webブラウザ:認証情報が格納されているブラウザの名前
• ユーザー名、パスワード:認証情報
• パスワードの強度:強、弱
• ユーザー名フィールド:ユーザー名フィールドに入力されたコントロール名
• パスワードフィールドパスワードフィールドに入力された文字列
• 作成時刻:認証情報が保存された時刻
• 変更時刻:認証情報が更新された時刻
• ファイル名:認証情報が窃取されたファイル
すべての認証情報は一時ファイルに保存されます。
このモジュールは、被害者のEメールを一つ一つ確認し、Microsoft OutlookのEメールフォルダから被害者のEメール連絡先を盗み取ります。収集された連絡先情報は、双方向に連結されたチェーン構造で保存されます。
図4.1は、筆者のテスト用Outlookアカウント内のEメールから取得されたEメール連絡先です。下側の図のように、その後この連絡先は双方向に連結されたチェーンに追加されました。収集されたデータには、Eメール送信者の個人名とメールアドレスが表示されています。この例では、表示されたEメールメッセージから「Outlook」と「outlook@email2.office.com」が収集されました。
このモジュールは、収集したすべてのEメールを列挙し、固有のEメール連絡先情報を双方向に連結されたチェーンに保存します。Outlookのデータを収集するために、モジュールは複数のAPI(MAPIInitialize()、MAPILogonEx()、MAPIFreeBuffer()など)を呼び出します。また、いくつかのCOMオブジェクト(OlkAccountManager、OlkMailなど)を作成するために、CoCreateInstance() APIも呼び出します。
最後に、連結されたチェーンからEメール連絡先を一つずつ取得し、コマンドラインパラメーターで指定された一時ファイルに保存します。図4.2は、この例の一時ファイル「%temp%\6827.tmp」と、収集されたEメール連絡先のスクリーンショットです。
この機能モジュールは、メールクライアントから被害者のメールアカウント設定と認証情報を窃取することを目的としています。これはパッカーで保護されたモジュールでもあるので、エントリポイントが呼び出されると、モジュール1と同じ処理を実行します。
筆者の解析では、解凍されたPEファイルはEXEファイルで、これは「Mail PassView」というもう一つのNirSoft製フリーウェアです。Mail PassViewは、元々はメールクライアント向けの簡単なパスワード復旧ツールとして設計されました。Emotetは、その最新バージョンのv1.92を使用しています。図5.1は、筆者のテスト環境で実行されているMail PassViewのスクリーンショットです。
コードと定数文字列を調べたところ、このソフトウェアは以下のメールクライアント(またはEメール認証情報を保存できるその他のクライアント)からメールアカウント設定と認証情報を取得できることが判明しました。
Mozilla Thunderbird、Eudora、Microsoft Outlook、Microsoft Outlook Express、Windows Mail、MSNMessenger、Windows Live Mail、Group Mail、IncrediMail、Yahoo! Mail、Yahoo! Messenger、Hotmail、Google Desktop、Google Talk
Mail PassViewは、これらのメールクライアントのシステムレジストリとローカル構成ファイルの両方から設定と認証情報を収集します。図5.2は、多数のバリュー名を事前に定義した共通関数のASMコードの部分です。
Mail PassViewは、サブキー 「HKCU\Software\Microsoft\Internet Account Manager\Accounts」および「HKCU\Software\Microsoft\Office\Outlook\OMI Account Manager\Accounts」配下のバリュー名を使用して、システムレジストリからユーザー名、サーバーアドレス、サーバーポート、およびそれらに類似する情報を繰り返し読み取ります。これらのサブキーには、Microsoft OutlookとMicrosoft Outlook Expressの設定と認証情報が保存されています。
ここでMail PassViewに渡されるコマンドラインパラメーター文字列は、「/scomma C:\Users\Bobs\AppData\Local\Temp\8042.tmp」です。「/scomma」によってプロセスはウィンドウなしで動作し、抜き取った情報を指定された一時ファイルに保存することができます。
機能モジュールが機密データを窃取する一方、スレッドモジュールは、窃取した情報を使って一時ファイルが作成されるまで、一時ファイルの監視を続けます。
そして、窃取したデータを一時ファイルからメモリに読み込み、その一時ファイルを削除します。窃取したデータを圧縮し暗号化した後、C2サーバーに送信します。
図6.1の例は、BCryptEncrypt() APIを呼び出して、4790E0から始まるパケットを暗号化しているところを示しています。赤線で囲まれた部分がパケットヘッダーに相当します。ここには、C2サーバーにパケット内のデータの内容を伝えるパケットタイプ(0x3EA)、データのsha256ハッシュコード(69 35~3C 4A)、モジュールID(0x14)、被害者のIDが含まれています。その次の青線で囲まれた部分は、後続のデータ(10 55 52 4Cから最後まで)のデータサイズ(0x398)で始まっています。後続のデータは、圧縮されたWebブラウザ認証情報です。
このスレッドモジュールは、被害者のデバイスから窃取したデータの受信用に11台のC2サーバーを使用しています。これらのC2サーバーのIPとポートは、メモリ内では暗号化されており、窃取データを送信する前に復号されます。ダウンロードされた3つのモジュールは、同じC2サーバーリストを保有しています。このリストは、本ブログ記事の末尾にある「IOC」のセクションでご確認いただけます。
図6.2はプロキシツールのスクリーンショットで、窃取された被害者の機密データを格納したパケットがC2サーバーに送信される様子を示しています。
このツールはURLをランダム化し、HTTP Postメソッド使って窃取データを送信します。図6.2が示すように、ボディは40Hのエクスポートされた鍵で始まり、その後に暗号化されたデータが続きます。C2サーバーは、40Hのエクスポートされた鍵を使用して、送信されたデータを復号できます。
この解析のパート2では、まずC2サーバーから受信したモジュールパケットとその構造について説明しました。次に、新たに作成されたスレッド内でモジュール(スレッドモジュール)がどのように実行されるかを確認しました。さらに、スレッドモジュールがプロセスハロウイングを行い、機能モジュールを実行する方法も検証しました。
受信した3つのモジュールの解説では、Emotetが被害者のデバイスからどのようなデータを窃取できるかについて詳しく述べました(被害者のメールアカウントのEメール連絡先情報、メールアカウント設定、メールクライアントの認証情報、さまざまなWebブラウザに保存された認証情報など)。
最後に、スレッドモジュールをもう一度取り上げました。Emotetは、窃取した情報を所定の一時ファイルから読み取り、その後データを圧縮して暗号化します。これらのデータは最終的に、HTTP POSTメソッドを使用してC2サーバーに送信されます。
フォーティネットのお客様は、FortiGuardのWebフィルタリング、アンチウイルス、FortiMail、FortiClient、FortiEDR、CDR(コンテンツ無害化)の各サービスにより、このマルウェアからすでに保護されています(以下参照)。
このブログのパート1で取り上げた、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:情報セキュリティ認識をエンドユーザーに受講させることをお勧めします。このトレーニングモジュールでは、さまざまな種類のフィッシング攻撃を特定し、自分自身を守る方法を習得できます。
FortiPhishフィッシングシミュレーションサービスを利用すると、このトレーニングをさらに強化することもできます。このサービスは、実際の攻撃シナリオを使用してトレーニングを実施し、ユーザーの意識や防備をテストし、フィッシング攻撃に正しく対処できるよう支援します。
3つのスレッドモジュールのC2サーバーリスト:
144[.]217[.]88[.]125:443
67[.]205[.]162[.]68:8080
54[.]36[.]98[.]59:7080
45[.]184[.]36[.]10:8080
47[.]110[.]149[.]223:8080
159[.]65[.]1[.]71:8080
51[.]178[.]186[.]134:443
131[.]100[.]24[.]199:8080
51[.]91[.]142[.]158:80
51[.]79[.]205[.]117:8080
176[.]31[.]163[.]17:8080