掲載日:2020/11/14

Bromium Blog記事

Emotet (Part 2/3) : 捕まるもんなら捕まえてみな!

※ 本ブログは、2019年4月30日にBromium BlogにポストされたEmotet: Catch Me If You Can (Part 2 of 3)の日本語訳です。

 

  • Emotetは、指定されたタスクを実行するのに適切なディシジョンツリーベースのアルゴリズムを持った、高度にモジュール化されたオンラインバンキング・マルウェアの一種のトロイの木馬です。
  • 難読化されたペイロードを配信し、自己アップグレード可能なモジュールを介してその機能を拡張する能力から、Emotetは組織への標的型攻撃で一般的に使用されるペイロードランチャーになりました。 Emotetが複数の段階と、複数の経路での攻撃に使用されていることから悪名を上げています。
  • Emotetの使用者側は “malware-as-a-service (サービスとしてのマルウェア)” ビジネスモデルを採用しています。この場合、このトロイの木馬はTrickbotなどの他のマルウェアファミリをダウンロードして配布するために使用されます。

「身代金」を要求するため感染が明示的なWannaCryとは異なる問題を生み出すEmotet。今回は、Emotetに関するJames Wrightの投稿の続きで、Emotetが企業にもたらすリスクのレベルについて説明しました。 Jamesは、他のセキュリティツールでは見逃されてきた、Emotetを配信する攻撃をBromiumがどのように検出できるかを詳しく説明しています。

 

この投稿シリーズのパート1: Emotet (Part 1/3):PCにどのように感染するか

 

バンキングシステムを狙ったトロイの木馬として2014年に端を発して以来、Emotetは複数コンポーネント型のマルウェアファミリーとして進化し続けています。 長年にわたりって下記の機構を含んだ非常に柔軟なコードベースを採用しています。

  • マルウェア分類を回避するためのパッカーの使用
  • 分析回避技術の使用
  • プロセスチェーンベースの分析を回避するためのペイロードの間接実行
  • ペイロードをサービスとして起動したり、管理者の資格情報の盗用による特権の昇格
  • 攻撃の段階をまたいで難読化されたコード
  • 複数の永続化メカニズムの使用
  • 暗号化されたインポートと関数名
  • リバースエンジニアリングツールを混乱させる、コード内の複数のJMP命令
  • 自己アップグレード可能モジュール
  • 侵害されたネットワーク内を横方向に伝搬する機能
  • Webブラウザやメールクライアントからアドレス帳と認証情報を盗用し、感染ホストにフィッシングメール配信活動をさせる機能
  •  

分析

Emotetの分析を3つの段階に分けて行いました。パート1は前述のとおりここにあります。今回のパート2では、Emotetを配信するフィッシング配信活動の振舞い分析について詳しく解説します。この記事ではMicrosoft Word文書から、難読化されたVBAマクロを実行してペイロードをドロップする機能について詳しく説明します。パート3では、近日公開予定のEmotet検体のバイナリ分析について解説して、マルウェアの機能を探ります。

 

今回の分析のために、 Bromium Secure Platformによって隔離された、最近の実際の攻撃で使用された検体を入手しました。

 

ファイル:Receipt(1).doc

MD5 097acffec441bdcd69ff3c56fdf0f615
SHA1 7049bbf580e598cc6bf111a0670f0d25a8ccd6c0
SHA256 6a1a7e4618a1803fce47331915610ffacc49abf261ee5783ef409e20b78c8e6d

 

 

ドロッパー(Dropper)

今回のEmotet展開では、Microsoft Word文書をダウンロードするハイパーリンクとして拡散していました。 文書が開かれると「コンテンツを有効にする」をクリックするようにユーザーを促します。文書にマクロまたはActiveXコントロールが含まれている場合、既定では、Microsoft Wordはセキュリティの警告を表示してユーザーに通知します。 通常、マルウェアの作成者はソーシャルエンジニアリングの手法でユーザーをだまして[コンテンツを有効にする]ボタンをクリックさせて、攻撃の次の段階を実行させます。

 

この場合、コンテンツを有効にすると、ドキュメントはVBA AutoOpenマクロを実行します。 Emotet VBAスクリプトからの予想通り、文字列は非常に複雑に難読化されており、断片化された文字列が多数含まれています。 これは、静的な分析エンジンによる悪意のあるコンテンツの検出を難しくするための、よく知られた手法です。

 

スクリプトを精査して、興味深いパターンを見つけながらコードを難読化解除していきます。

難読化されたAutoOpenマクロ 難読化されたAutoOpenマクロ
変数 ‘dBCwQQZ’は結果的には文字列 ‘winmgmts:Win32_Process’を定義 変数 ‘dBCwQQZ’は結果的には文字列 ‘winmgmts:Win32_Process’を定義
変数 ‘TCXD_U’には文字列’GetObject(winmgmts:Win32_ProcessStartup)’を定義 変数 ‘TCXD_U’には文字列’GetObject(winmgmts:Win32_ProcessStartup)’を定義
変数 ‘jDD_UwDB’ には、文字列  ‘GetObject(winmgmts:Win32_Process).Create’ を定義 変数 ‘jDD_UwDB’ には、文字列 ‘GetObject(winmgmts:Win32_Process).Create’ を定義
‘GetObject(winmgmts:Win32_ProcessStartup).ShowWindow’のパラメータに値0を設定 ‘GetObject(winmgmts:Win32_ProcessStartup).ShowWindow’のパラメータに値0を設定
文字列 ‘powershell -e’ を生成 文字列 ‘powershell -e’ を生成

 

VBAスクリプトがWMIクラスwinmgmts:Win32_ProcessStartupおよびwinmgmts:Win32_Processを参照していることがわかります。 実行時に、autoopen()SubはこれらのWMIクラスを使用して、バックグラウンドでBase64エンコードコマンドを実行するPowerShellのインスタンスを起動するのです。

 

間接実行

Bromiumコントローラーで表示されたBase64エンコードPowerShellコマンド Bromiumコントローラーで表示されたBase64エンコードPowerShellコマンド

マクロはWMIを使用してPowerShellを実行しているので、プロセスはWmiPrvSe.exe(WMIプロバイダーホスト)を使用してバックグラウンドで起動されます。 このようにPowerShellを実行することで、マルウェアの作成者はプロセスチェーンベースの検出を回避できます。

 

Ursnifで使用されている回避技術についての記事で説明したように、これは正規のWindowsプロセスを使用してマクロからPowerShellを起動するための知られた手法です。 Bromiumはこのタイプの間接実行を検出し、関連するプロセス作成をすべて、悪質なVBAコードの実行を担当する、元の実行可能ファイル(この場合はWINWORD.exe)に帰属させます。

 

難読化されたPowerShellコマンド

Base64でエンコードされた文字列をデコードした後、下図の出力が生成されます。 アナリストやスキャンエンジンによる認識を困難にするために、同じ文字列結合と大文字と小文字の不一致の手法を使用してコマンドを難読化しています。

デコードされた文字列は、文字列の結合に使われる ‘+’文字、および大文字と小文字の混合文字を含む デコードされた文字列は、文字列の結合に使われる ‘+’文字、および大文字と小文字の混合文字を含む

 

難読化を解除した状態でコマンドを表示するには、単にすべての「+」文字を削除します。

すべての「+」文字を削除した後のコマンド出力 すべての「+」文字を削除した後のコマンド出力

 

上記のPowerShellコマンドは、Base64でエンコードされた文字列を縮小してデコードし、文字列の最後に達するまでそれをストリームとして読み取ります。 次に、Invoke-Expressionコマンドレットの別名 ‘iex’を使用してメモリ内で結果の出力を実行します。これは、マルウェア作成者の間でコマンドを実行するためのもう1つの一般的な手法です。 これを実現するために、文字列 ‘SilentlyContinue’を含む変数$ Verbosepreferenceを使用しました。 最初の文字と3番目の文字( ‘i’と ‘e’)が文字列から選択され、それらが ‘X’と結合されて文字列 ‘ieX’を形成します。

Invoke-Expressionコマンドレットのエイリアスである文字列 “ieX”の形成 Invoke-Expressionコマンドレットのエイリアスである文字列 “ieX”の形成

 

 

難読化解除されたPowerShellスクリプト

難読化解除されたPowerShellスクリプトは、最初に ‘@’文字を区切り文字として使用して変数$ XXQCZAxAに割り当てられた文字列を分割し、次にForEachループに入り、Net.WebClientクラスを使用して実行可能ファイルを被害者のファイルシステムにダウンロードします。スクリプトは環境変数 $env:userProfile を使用して、現在ログインしているユーザーのユーザープロファイルディレクトリを取得します。 ダウンロードされたファイルは、犠牲者のユーザプロファイルディレクトリ(例えばC:\Users\[ユーザ名])に ’15.exe’というファイル名で保存されます。 ダウンロードされたファイルのサイズが40KBを超える場合、スクリプトはForEachループを終了し、Invoke-Itemコマンドレットを使用して ’15.exe’を実行します。

難読化解除されたPowerShellコマンド 難読化解除されたPowerShellコマンド

 

 

HTTP GETリクエスト

以下のスクリーンショットからわかるように、PowerShellコマンドはHTTP GETリクエストを送信して、hxxp://dautudatnenhoalac[.]com/wp-admin/DYAsI から最初のステージのEmotet実行可能ファイルを取得します。 Webサーバーからの応答は、提供されたファイルが ‘s17zjCTuWfNF.exe’であり、ペイロードはファイルの先頭にあるマジックバイト0x4D5A(‘MZ’)のASCII表現で示されるPE形式のファイルであることを示しています。

最初のステージのEmotetペイロードをダウンロードするHTTP GETリクエスト 最初のステージのEmotetペイロードをダウンロードするHTTP GETリクエスト

 

 

振舞い分析

ペイロードをダウンロードした後、PowerShellは ’15.exe’を実行します(PID:2600)。 その後、プロセスは同じ場所から’15.exe’の別のインスタンス(PID:2412)を起動します。

PowerShellによる15.exeのプロセス起動 PowerShellによる15.exeのプロセス起動

2番目の ’15.exe'(PID:2412)は、自分自身をC:\Windows\SysWOW64ディレクトリに ‘ipropmini.exe’という名前でコピーします。 次に、BinaryPathがC:\Windows\SysWOW64 \ipropmini.exeを指し、DesiredAccessが18であるサービスを作成します。DesiredAccess ’18’は、サービスに対するSERVICE_CHANGE_CONFIGおよびSERVICE_STARTアクセス許可を付与します。

持続性を確立するためのサービス作成 持続性を確立するためのサービス作成

 

Windowsサービスを介してバイナリを起動することは、いくつかの理由から一般的な手法です。1点目はプロセスチェーンに基づく検出を中断すること、2点目はサービスの開始時に、バイナリが有効なサービス実行可能ファイルではない場合であっても常に実行されることです。

 

実行可能ファイル ‘ipropmini.exe'(services.exeによって起動されます)は、インターネットから次のステージのペイロードをダウンロードする自分自身の別のインスタンスを起動します。 その後、実行可能ファイルは最初のEmotetプロセス(’15.exe’)に対してプロセスの空洞化を実行し、そこで修正されたコードが書き込まれます。

Emotetの最初のプロセス ’15.exe’を処理しています(PID:2600) Emotetの最初のプロセス ’15.exe’を処理しています(PID:2600)

 

実行したままにしていると、Emotetはリモートサーバーからより多くのペイロードをダウンロードし、いくつかのプロセスを生成してシステム情報を収集し、それを暗号化されたチャネルを介してCommand & Control(C2)サーバーに送信します。

Bromium Controllerで見たプロセス相互作用グラフ Bromium Controllerで見たプロセス相互作用グラフ

 

 

Emotet感染のライフサイクル中に発生した重大度の高いイベント Emotet感染のライフサイクル中に発生した重大度の高いイベント

 

 

HTTP POSTリクエスト

EmotetはHTTP POSTを使用してシステム関連情報をC2サーバーに送信し、サーバーからの応答としてさらにコマンドとペイロードを受信します

C2サーバーへのHTTP POST要求 C2サーバーへのHTTP POST要求

 

 

今回の実例での侵害の痕跡(IOC)

SHA256 (15.exe) af2f82adf716209cd5ba1c98d0dcd2d9a171bb0963648bd8bd962edb52761241
SHA256 (ipropmini.exe) af2f82adf716209cd5ba1c98d0dcd2d9a171bb0963648bd8bd962edb52761241
SHA256 (ipropmini.exe) 00af24bb1be8c17106c19ba0c55acd011088c6c5b1cb01d44cc4b829b3449bcb
SHA256 (5W8Jo1G2cQJW9lWLu.exe) 00af24bb1be8c17106c19ba0c55acd011088c6c5b1cb01d44cc4b829b3449bcb
SHA256 (7hZs97N.exe ) f58322a00b576deb9c1a26b28ca8fa84c793fc8baf3c4f780a9a77966dda89e3
SHA256 (ipropmini.exe) 0eefd2619d77d7bafed95197e0c0ef30147acaddcd81eb2761ee9893fd55f91b
配信 URL http[:]//dautudatnenhoalac[.]com/wp-admin/DYAsI/
配信 URL http[:]//www.bewebpreneur[.]com/wp-admin/daHN/
配信URL http[:]//www.allgreennmb[.]com/wp-content/themes/pridezz/t9iV
配信URL http[:]//www.baiduwanba[.]com/css/Ubh/
配信URL http[:]//rileyaanestad[.]com/wp-includes/DXn1R/

関連記事