脅威リサーチ
FortiGuard Labsは先頃、実際の攻撃に使用されているファイルが埋め込まれたExcel文書を取得しました。もちろん、フォーティネットではこうした発見は常時行っています。私は今回、埋め込みファイル名がランダム化されていることに興味を引かれ、このExcel文書を分析することにしました。ファイルを簡単に調査したところ、CVE-2017-11882の脆弱性を悪用して不正なコードを実行し、被害者のデバイスにマルウェアを配信し実行していることがわかりました。
この分析では、細工されたExcel文書がCVE-2017-11882を悪用する方法、この脆弱性を悪用する際の動作、被害者のデバイスにダウンロードされるマルウェアファミリー、攻撃者が実行する不正行為について解説します。
影響を受けるプラットフォーム: Microsoft Windows
影響を受けるユーザー: Windowsユーザー
影響: 被害者のデバイスを制御して、機密情報を収集
深刻度: クリティカル
Excel文書の名前は「GAT412-IFF22.xlsx」です。このファイルは、Microsoftが開発したOOXML形式(Office Open XML、zip圧縮されたXMLベースファイル式)で保存されています。解凍プログラムでこのファイルを解凍すると、図1.1のように左側にフォルダツリー、右側にすべてのファイルが表示されます。「\xl\embeddings\」サブフォルダの最後にある「xtgjls.4flk6W」ファイルが、ランダム化された埋め込みファイルです。
それでは、Excelプログラムがどのように埋め込みファイルをロードするかを見ていきましよう。図1.2は、関連するファイルのコンテンツを示しています。「..\xl\ worksheets \sheet1.xml」と、それに対応するリレーションシップファイル「..\xl\ worksheets\_rels\sheet1.rels」が表示されています。
Excelプログラムは「sheet1.xml」のXMLデータを解析し、Oleオブジェクトデータを取得します。定義は以下のとおりです。
<oleObjects>
<oleObject r:id=“rId1” autoLoad=“true” shapeId=“1907” progId=“L00”/>
</oleObjects>
ご存じのように、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]oLE10NATiVE」には細工された数式データが格納されており、これを使用して脆弱な「EQNEDT32.EXE」で悪意のあるシェルコードが実行されます。
適切な長さ検知を行わずに、nullで終了するデータをローカルバッファにコピーすると、スタックバッファオーバーフローが発生し、任意コードの実行が可能になります。影響を受けたローカルバッファは、関数リターンアドレスに対して2CHバイトの長さしかありません。したがって、コピーされたデータの長さが2CHバイトを超えていると、関数リターンアドレスが上書きされます。
図2.1に色付きで示した部分が、nullで終了するコピー対象のデータで、長さは30Hバイトです。最後のdword(0x42F72E)(赤線で囲まれた部分)は、関数リターンアドレスを上書きするデータです。
図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つ目のパラメータはダウンロードするファイルの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 |
ここでは分析例として、「lsbjqoyofgkmqbuleooykdekgopmtglvjl.exe」ファイル(保存名は「C:\Users\{ユーザー名}\AppData\Roaming\word.exe」)を選択しました。これは、マルウェアサンプルのログの中で最新のFormbookサンプルです。
「Formbook」は良く知られた商用マルウェアです。「Mlware-as-a-Srvice」(MaaS)として、2016年から販売されています。Formbookは、いくつかの制御コマンドを使用して、被害者のデバイスから機密情報を窃取し、デバイスを乗っ取ることを目的としています。
今回は、Formbookサンプルが被害者のデバイスでどのように動作するかを解説します。
Formbookの実行ファイルは、BorlandのDelphi言語を使って開発されました。分析したところ、これはFormbookダウンローダー兼ローダーです。Formbookは複雑な手法を駆使して、容易に検知または分析されないようにしています。その方法を見ていきましょう。
サンプルを実行すると、図3.1のように、いずれかのビットマップリソース(「BBOKK」)からメモリにDllファイルが抽出されます。
メインフォームのFormCreate()関数が呼び出されると、サンプルはリソースセクションからビットマップデータを読み取り、Dllファイル(“BBOKK” Dllと呼ばれる)に復号します。“BBOKK” Dllがメモリ内に配置され、最後にエントリ関数が呼び出されます。
“BBOKK” Dllファイルは、Delphiでコンパイルされたもう一つのファイルです。このファイルはAPI timeSetEvent()を呼び出し、9秒間休止した後、タイマーを起動してタイマー関数を実行します。
タイマー関数の目的は、被害者のデバイスにFormbookペイロードをダウンロードして実行することです。
図3.2のスクリーンショットでは、“BBOKK” DllがAPI InternetOpenUrlA()を呼び出してFormbookペイロードファイルをダウンロードしています。メモリを見るとわかるとおり、2つ目のパラメータはペイロードファイルのURLです。このファイルは、DiscordのCDN(コンテンツ配信ネットワーク)に添付ファイルとして保存されていました。
攻撃者は、ペイロードファイルがブロックまたは検知されるのを回避するために、このファイルの暗号化と変換を何度も繰り返していました。我々は復号とデータ復帰を4回行い、ようやく図3.3の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を組み合わせたフラグです。
これ以降は、無作為に選択されたプロセスでFormbookペイロードファイルが実行されます。
“BBOKK” Dllは、被害者のデバイスでFormbookを永続化します。Formbookペイロードファイルを取得すると、“BBOKK” Dllは図5.1のように、システムレジストリのサブキー「HKCU\Software\Microsoft\Windows\CurrentVersion\Run」の下に文字列値を作成します。
自動実行プロセスは「C:\Users\Public\Libraries\foyoqjbsL.url」です。これはインターネットショートカットファイル(*.url)で、通常はWebブラウザでWebサイトを開くために使用されます。図5.2に示すように、「URL」のプロパティはローカルファイルの完全パス(Webサイトのアドレス)です。この例では「C:\Users\Public\Libraries\Lsbjqoyof.exe」であり、これは「lsbjqoyofgkmqbuleooykdekgopmtglvjl.exe」ファイルからコピーされたものです。したがって、「foyoqjbsL.url」ファイルを介してシステムが起動すると、Formbookが起動します。
私は以前、添付のPowerPoint文書によるフィッシング攻撃で拡散された、別のFormbook亜種を詳細に分析したことがあります。そのときのFormbookサンプルの詳細については、Part I、Part II、Part IIIでご確認いただけます。
コード、データ構造、および機能を新旧の亜種で比較したところ、大きな違いは見られませんでした。
“BBOKK” Dllが無作為に選択したプロセス(「rasphone.exe」など)は、前回の分析のPart IIで調査した「AddInProcess32.exe」と同じ役割を果たします。
どちらの亜種も以下のデータ構造と機能を備えています。
この亜種で使用されるC2サーバーの完全なリストは、このブログ記事の末尾にあるIOC(Indicators of Compromise:侵害指標)のセクションに記載されています。
窃取したデータをC2サーバーに送信する際、Formbookはそのデータを暗号化し、Base64アルゴリズムでエンコードします。FormbookがC2サーバーに送信したHTTP GETパケットの例を以下に示します。
hxxp[:]//www[.]waraporn[.]net/dy47/?Rt=cJEPCFYxXhcTq&nBZhXF=VgD07dflFaksGVxdFL46l5VyvbABpSxwWaaMvOL1tn3EVaDMwmxyqfSWThCs5+vZuoswEw==
上記の例について:
次回の分析では、前述したマルウェアの表から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アンチウイルスサービスは、FortiGate、FortiMail、FortiClient、FortiEDRによって強化されています。これらの各ソリューションには、Fortinetアンチウイルスエンジンが組み込まれています。したがって、これらの製品をお使いのお客様は、最新の保護機能によって保護されます。
ユーザーの皆様には、無償で提供されているNSEトレーニング:NSE 1 – 情報セキュリティ意識向上を受講することもお勧めします。このトレーニングにはインターネットの脅威に関するモジュールが含まれ、エンドユーザーはフィッシング攻撃を識別して自らを保護する方法を学習できます。
hxxp[:]//lutanedukasi[.]co[.]id/wp-includes/Cikncbxlojqanjsfotzhopechujkgkeeyz.exe
hxxp[:]//lutanedukasi[.]co[.]id/wp-includes/lsbjqoyofgkmqbuleooykdekgopmtglvjl.exe
https[:]//cdn[.]discordapp[.]com/attachments/937614907917078588/1009001073970794576/Lsbjqoyofgkmqbuleooykdekgopmtglr
[GAT412-IFF22.xlsx]
D1EA94C241E00E8E59A7212F30A9117393F9E883D2B509E566505BC337C473E3
[Formbook, lsbjqoyofgkmqbuleooykdekgopmtglvjl.exe]
C7B7CC6B73B04E2CD7D026A69D47139770ACE5A92457DA0F0C058EE438251B18