Internet Explorerを標的とする攻撃者にスクリプト系マルウェアを利用する傾向

By , , and

Category: Unit 42

Tags: , , , ,

This conceptual image represents Remote Access Trojans, such as the one examined here as an example of script-based malware.

This post is also available in: English (英語)

要約

ここ数か月、Windows ユーザーに感染するIE (Internet Explorer) ブラウザ用の高度なスクリプト系マルウェアが検知されています。今回はこれらスクリプトを調査し、その主たる機能を特定することで、攻撃者がスクリプト系マルウェアを好んで利用していることや、それが今後注意を要するトレンドにつながる可能性があることについて取り上げていきたいと思います。

攻撃者がスクリプト言語を使用する利点は、複数の機能を持たせられること、フレキシブルで使いやすいツールで、簡単に難読化された高度なマルウェアを作れることにあります。その実証をするのに、Windows ユーザーの感染に使用されるスクリプト系マルウェアのサンプルとして、今回はマルウェアを2つ検証しました。これらのサンプルは2つの異なるソースで発見されてはいますが、同じIEブラウザのエクスプロイトCVE-2019-0752脆弱性から派生しています。1つ目のサンプルはJScriptによるリモートアクセス型トロイの木馬(RAT)で、標的システムで永続性を確保してからエンコードしたネットワーク接続を使い攻撃者側のシステムに接続します。その後は標的マシン上で任意のコマンドを実行することで潜在的には同マシンを完全に自身の制御下におけるようになります。2つ目のサンプルはAutoITダウンローダーで、ネットワーク接続とスクリプト関数を使用してマルウェアをダウンロード・実行します。これにより、ランサムウェアやスパイウェアなどのマルウェアで標的システムを感染させることができます。

最後に、スクリプトベースのマルウェアで使用されているスクリプト言語をさらに詳しく紹介するために、攻撃者がブラウザエクスプロイトのペイロードとして、通常の実行ファイルの代わりにスクリプトを選択する理由について考察します。

安全なWebブラウジングのためのセキュリティのベストプラクティスに従って最新Windowsホストを使用している組織であれば感染リスクは大きく低下します。パロアルトネットワークスのお客様はIPSシグネチャでこの脅威から保護されています。またURLフィルタリング、WildFireはいずれも関連するサンプルやインフラをマルウェアと識別します。

CVE-2019-0752

CVE-2019-0752は2019年4月に更新プログラムが公開されたスクリプトエンジンのメモリ破損脆弱性で、標的マシン上でのリモートコード実行(RCE)につながる可能性があるものです。ここで検証する事例では、対象となる2つのサンプルのダウンロードのさい、同脆弱性のエクスプロイトによってPowerShellコマンドを実行していました。CVE-2019-0752脆弱性エクスプロイトの詳しいwrite-upはZero Day Initiativeのブログ記事を参照してください。

ブラウザ内のJScript RAT

私たちは、4月18日にassurancetemporaireenligne[.]comドメインからダウンロードしたc.js JScript RATを調査しました。CVE-2019-0752脆弱性のエクスプロイトで使用されているPowerShellコマンドを図1に示します。ここでは、c.jsファイルを分析します。まずはファイルの静的分析を行って、悪意のあるスクリプトの概要を把握していきます。次に動的分析を行ってスクリプトの動作を検証します。特に、悪意のあるスクリプトが標的マシン上で永続性を確保し、リモートサーバーに接続するさいに利用する手法について考察します。

このコマンドは、JScript RATサンプルをダウンロードして起動するためにCVE-2019-0752脆弱性のエクスプロイトで使用されているPowerShellコマンドのセットを示しています。
図1: JScript RATサンプルのダウンロードと起動に使用されるコマンド

c.jsファイルの静的分析

c.jsスクリプトは難読化されていて一見しただけでは動作がわかりません(以下)。

難読化を解除すると、図2に示すように、data1data2に、2つのパックされたJScriptコードのまとまりが格納されていることがわかります。

この図に示すように、スクリプトの難読化を解除すると、検証しているスクリプトベースのマルウェアを実行する、2つのパックされたJScriptコードのまとまりがdata1とdata2に格納されていることがわかります。
図2: 難読化が解除されたc.jsスクリプト、パート1

図3は、data1に格納されているコードがHKCU\Software\loaderNameレジストリキーに挿入され、data2に格納されているコードがEncodeScriptFile関数を使用してエンコードされ、loader.jseファイルに書き込まれることを示しています。続いて、loader.jseスクリプトのパスがHKCU\Software\Microsoft\Windows\CurrentVersion\Runレジストリキーに渡され、それ以降は使用されることはありません(この動作については、次の項で詳しく説明します)。また、host変数が、hxxp://seemee[.]ddns[.]net/loader/loader2/www URLで初期化されています。この変数はこのスクリプトでは使用されていませんが、実行時にネットワーク活動が行われることを示しています。最後にloader.jseが実行され、c.jsは自身を削除します。

スクリプトベースのマルウェアサンプルからの難読化が解除されたコードのこのセクションは、悪意のあるコードがどこに格納されているかを示しています。
図3: 難読化が解除されたc.jsスクリプト、パート2

悪意のあるスクリプトのコードの概要を把握したら、次は動的分析により、その動作について詳しく見ていきましょう。

永続性を確保する手法

まず、c.jsスクリプトは、レジストリキーHKCU\Software\Microsoft\Windows\CurrentVersion\Runを作成して新しい値を設定します。loaderNameという名前のこの値には、以下の図4に示すように、特定のloader.jseファイルのパスが設定されます。

この図は、スクリプトにより、特定のloader.jseファイルのパスが設定されたレジストリキーの新しい値がどのように作成されるかを示しています。

この図は、スクリプトにより、特定のloader.jseファイルのパスが設定されたレジストリキーの新しい値がどのように作成されるかを示しています。
図4: RegSetValueExAのAPIフック

Runキーにより、ユーザーがログオンするたびにプログラムが実行され、Windows OSが起動するたびに、(まだ作成されていませんが)loader.jseスクリプトが自動的に実行されます。図5に、c.jsスクリプトの永続性確保の次のステップを示します。ここでは、スクリプトにより、実際のloader.jseファイルが作成されています。図5は、loader.jseスクリプトがAppDataフォルダに作成されることも示しています。AppDataフォルダはWindows OSではデフォルトで非表示のフォルダなので、被害者はシステムに悪意のあるファイルが存在することになかなか気づけません。

この図は、Windows OSではデフォルトで非表示フォルダであるAppDataフォルダにloader.jseスクリプトが作成されることを示しています。

この図は、Windows OSではデフォルトで非表示フォルダであるAppDataフォルダにloader.jseスクリプトが作成されることを示しています。
図5: CreateFileWのAPIフック

loader.jseファイルの作成後、図6に示すように、c.jsスクリプトはこのファイルのオープンハンドルを使用して、図7に示すように、そのファイルにコードを挿入します。

loader.jseファイルの作成後、c.jsスクリプトはこのファイルのオープンハンドルを使用して、この図に示すように、そのファイルにコードを挿入します。

loader.jseファイルの作成後、c.jsスクリプトはこのファイルのオープンハンドルを使用して、この図に示すように、そのファイルにコードを挿入します。
図6: CreateFileW関数の戻り値

この図は、ファイルに書き込まれるコードが難読化されていることを示しています。強力な難読化を比較的簡単に達成できることが、攻撃者がスクリプトベースのマルウェアの使用を選択する理由の1つです。

この図は、ファイルに書き込まれるコードが難読化されていることを示しています。強力な難読化を比較的簡単に達成できることが、攻撃者がスクリプトベースのマルウェアの使用を選択する理由の1つです。
図7: WriteFileのAPIフック

図7は、ファイルに書き込まれるコードが難読化されていることも示しています。ファイルの先頭にあるマジックバイト「#@~^」のおかげで、loader.jseスクリプトがMicrosoftのスクリプトエンコーディングでエンコードされていることがわかります。これは、私たちの静的分析と一致しています。その後、エンコードされたファイルはShellExecute関数により実行され(図8)、c.jsファイルは自身を削除します。

この図は、エンコードされたファイルがShellExecute関数により実行された後、c.jsファイルが自身を削除することを示しています。

この図は、エンコードされたファイルがShellExecute関数により実行された後、c.jsファイルが自身を削除することを示しています。
図8: ShellExecuteExWのAPIフック

要約すると、標的ホスト上で永続性を確保するために、c.jsファイルは痕跡を残さないようにしています。このために、WindowsレジストリキーRunを使用し、エンコードされたファイルloader.jseを非表示フォルダにドロップしてから、自身を削除します。

リモートサーバーへの接続

loader.jseの動作とリモートサーバーへの接続を分析する前に、c.jsファイルの実行に戻る必要があります。静的分析で確認したように、このファイルはHKCU\Software\loaderNameというレジストリキーも作成し、このキーに値dataを設定して、パックされたJScriptコードを格納します。図9にこの動作を示します。

この図は、c.jsファイルによりどのようにレジストリキーが作成され、このキーに値を設定して、パックされたJScriptコードを格納するかを示しています。

この図は、c.jsファイルによりどのようにレジストリキーが作成され、このキーに値を設定して、パックされたJScriptコードを格納するかを示しています。
図9: c.jsファイルの実行中のRegSetValueExAのAPIフック

loader.jseの実行時に、レジストリキーHKCU\Software\loaderNameが開かれ(図10)、データ値に含まれるコードが実行されるため、c.js実行のこのステップは非常に重要です。

このステップは、loader.jseファイルがどのようにレジストリキーを開き、データ値に含まれるコードを実行するかを示しています。
図10: loader.jseファイルの実行中のRegOpenKeyExAのAPIフック

次に、レジストリキーloaderName内のパックされたコードを見てみると、function(p,a,c,k,e,d)パターンが含まれることがわかります(図11)。このパターンは、コードの難読化にDean Edwardsパッカーが使用されていることを示しています。このパッカーは今はもう古いですが、一般的であったときには、安全なスクリプトでも広く使用されていました。このため、多くの検知テクノロジでホワイトリストに登録されています。

この図は、レジストリキー内のパックされたコードを確認すると、コードの難読化にDean Edwardsパッカーが使用されたことを示すパターンが含まれていることを示しています。
図11: loaderNameレジストリキーとパックされたコード

コードをアンパックすると、図12に示すように、hxxp://seemee[.]ddns [.]netドメインのloader.phpページに対してGET要求が送信されています。引数rは悪意のあるスクリプトとリモートサーバーで共有されている乱数であり、ネットワーク上を送受信されるデータをエンコードおよびデコードするためのトークンのように使用されています。ここでは、GET要求への応答をデコードするために、文字列をデコードする機能を持つ別の関数が使用されています。リモートサーバーとの接続が確立されたため、悪意のあるスクリプトはGET要求への応答で受信したコードを使用して、攻撃者が標的マシン上で実行するコマンドを選択できるパネルであるcmd.phpページに接続します。

アンパックされたコードのこの図は、悪意のあるドメインのloader.phpページに対して送信されたGET要求およびコードにより実行されたその他のコマンドを示しています。
図12: loader.jseにより実行されるアンパックされたコード

要求の応答に含まれるスクリプトは、cmd.phpページに対して要求を送信して、実行するタスクの指示を取得する無限ループです(図13)。

要求の応答に含まれるスクリプトは、cmd.phpページに対して要求を送信して、実行するタスクの指示を取得する無限ループです。
図13: タスクの起動

攻撃者は、コマンドの実行、ファイルのダウンロード、Windows OSの再起動、現在のタスクの終了、Windows OSのシャットダウンなど、標的システム上で複数のタスクを実行できます(図14)。

この図は、Download、Exectue、Terminate、Reboot、Shutdownなど、標的マシンで実行可能なコマンドを示しています。
図14: 標的マシンで実行可能なコマンド

AutoITダウンローダー

JScript RATの発見直後の2020年4月30日に、私たちは同じ脆弱性CVE-2019-0752を使用してdark[.]crypterfile[.]comドメインからダウンロードされた2.exeファイルを調査しました(図15)。この項では、コンパイルされたAutoITスクリプトを分析します。

このコマンドは、コンパイルされたAutoITサンプルをダウンロードして起動するためにCVE-2019-0752脆弱性のエクスプロイトで使用されているPowerShellコマンドのセットを示しています。
図15: AutoITダウンローダーのサンプルのダウンロードと起動に使用されるコマンド

技術分析

Portable Executable (PE)ファイルを逆アセンブルしたところ、コンパイルされたAutoITスクリプトが存在するというヒントが見つかりました。コードには、PEファイルをデバッガーとともに実行しているかどうかを確認するチェックが含まれていました(図16)。実行している場合は、「This is a third party compiled AutoIT script」(これはサードパーティ製のコンパイルされたAutoITスクリプトです)というメッセージを含むメッセージボックスが表示されます(図17)。

この図は、PEファイルをデバッガーとともに実行しているかどうかを確認するコード内のチェックを示しています。特に興味深いのが、ピンクで示した行です。
図16: デバッガーチェック
これは、チェックに応じて表示されるメッセージボックスを示しています。
図17: コンパイルされたAutoITスクリプトの存在を示すメッセージ

AutoITスクリプト逆コンパイラを使用してコードを逆コンパイルしたところ(図18)、スクリプトが2つの部分に分かれていることがわかりました。最初の部分では、システム情報の取得を制御しています。この情報が$asysinfo配列に格納されます。続いて、論理プロセッサの数に対応している、この配列の6番目の要素がチェックされます。このチェックでは、論理プロセッサの数が4以上であるかどうかを確認し、スクリプトの2番目の部分である、悪意のあるファイルのダウンロードに入ります。InetGetおよびRun AutoIT関数を使用して、悪意のあるスクリプトは標的システム上で複数のファイルをダウンロードして実行します。最後にダウンロードされたファイルは現在のユーザーのスタートアップフォルダに格納されるため、ユーザーがWindows OSにログインするたびに、このファイルが実行されます。これにより、攻撃者は標的システム上での永続性を確保することができます。

この図は、AutoITスクリプト逆コンパイラを使用したコードの逆コンパイル後の状態を示しています。結果は2つの部分に分かれています。最初の部分ではシステム情報の取得を制御し、もう一方の部分ではスクリプトベースのマルウェアをダウンロードします。
図18: 悪意のあるAutoITスクリプト

スクリプトを使用する理由

2つのサンプルの分析により、攻撃者が標的システム上でスクリプトを使用してどのように悪意のある活動を実行しているかを理解することができました。この項では、攻撃者が通常の実行ファイルではなく、スクリプトを選択することにつながる理由について考察します。

まず、JScript、VBScript、そしてAutoITのようなスクリプト言語は、もともとWindows環境でのタスクの実行を自動化および簡素化するために開発されたものであるため、これらの言語にはWindows APIの呼び出しを容易にする複数の関数が用意されています。このような関数は使いやすいため、攻撃者は簡単にネットワーク接続を確立し、Windows環境とやり取りすることにより、たとえばシェルコマンドを実行できます。また、スクリプト言語はCやC++よりも高レベルであることが多く、攻撃者が簡単に習得し、利用することができます。数行のコードだけで、攻撃者はネットワーク接続、標的システム上での永続性、コマンドの実行などの多くの機能を含む、実用的で柔軟性の高い悪意のあるプログラムを構築することが可能です。

さらに、攻撃者は多様な手法およびツールを使用して、悪意のあるスクリプトを難読化できます。たとえば攻撃者がすばやく成果を得ることを主に求めているのであればMicrosoftのスクリプトエンコーディングのような非常に単純なツールを使用でき、またはアナリストが難読化の解除に苦戦するような非常に強力な難読化を実行することもできます。これもまた、スクリプトがいかに柔軟であるかを示しています。

最後に、悪意のあるスクリプトでは、攻撃者は必要であれば非常に強力な難読化を実行できます。つまり、悪意のあるスクリプトはさまざまな検知を回避し、マルウェア対策テクノロジを迂回することが可能です。スクリプトベースのマルウェアが防御側により検知され、マルウェアとしてタグ付けされても、スクリプト言語を使用していれば、攻撃者は簡単かつすばやく新たな亜種を開発し、現在の検知を回避することができます。

結論

ここで紹介した2つのサンプルは、攻撃者がどのようにスクリプトを使用して標的となるWindowsマシン上で悪意のある活動を行いうるかを示すものでした。これらのスクリプトにとくに目新しい技法はありませんでしたが、攻撃者にとっては柔軟性が高く、利用しやすいという利点があります。ここまでの分析で見てきたように、こうした利点を活かせば、コマンド実行で潜在的には標的のマシンを完全に自身の制御下におくことができることから、攻撃者はスクリプト系マルウェアを選んでいるものと考えられます。

安全なWebブラウジングのためのセキュリティのベストプラクティスに従い、最新Windowsホストを使用している組織であれば感染リスクは大きく低下します。パロアルトネットワークスのお客様は、この脅威からさらに保護されています。お客様は弊社のIPSシグネチャ55438により、CVE-2019-0752脆弱性から守られています。URLフィルタリング、WildFireもここで説明した攻撃からお客様を保護しています。

IOC

JScriptのサンプル

SHA256ハッシュ

c.js:

751D161ED4AFD822925C0373395F014578F166467D20A4B1ADFDB27FD0A83C36

loader.jse:

CCCF25DCD1FA16017B2ACCF4BC501BE583824423FC3A09779116AE07D833F2B2

HTTP URL

hxxp://assurancetemporaireenligne[.]com/c[.]js

hxxp://seemee[.]ddns[.]net/loader/loader2/www/loader[.]php

hxxp://seemee[.]ddns[.]net/loader/loader2/www/cmd[.]php

AutoITダウンローダーのサンプル

SHA256ハッシュ

2.exe:

BA60EFE2E939DA16E3D240732FDA286FBD3DB3A0F06CB12D7042C7FAC9B82B86

HTTP URL

hxxp://dark[.]crypterfile[.]com/2[.]exe

hxxp://dark[.]crypterfile[.]com/1/desktop[.]exe

hxxp://dark[.]crypterfile[.]com/1/99[.]exe

hxxp://dark[.]crypterfile[.]com/1/Calc[.]vbs

hxxp://dark[.]crypterfile[.]com/1/calculator[.]exe

hxxp://dark[.]crypterfile[.]com/1/calc[.]exe