2022年5月24日

Emotetの検知回避手法を解説:Microsoft Officeにおける4種類のドロッパー マルウェアとメッセージボックスの悪用

長年にわたって攻撃者のお気に入りとなっているのはMicrosoft Officeのドロッパーで、頻繁に発見され、悪用されています。サイバーセキュリティ ベンダーは、侵入経路に注目し、ブロックしていますが、これは終わりのない猫とネズミの追いかけっこゲームのようであり、不幸なことに、悪質な攻撃集団が少なくとも短期間は完全優位に立つことができています。そして、AIベースの予測型ソリューションが成熟し、市場シェアが拡大するにつれて、これらのツールも回避の標的になってきました。

このブログでは、最近のEmotetの再来(https://www.deepinstinct.com/ja/blog/the-re-emergence-of-emotet)で使用された回避方法の分析を含め、異なるバイパス技術を採用した様々なVBAドロッパーのレビューを行います。また、これらの脅威を検知する可能性を高めるために私が書いたPythonスクリプトも紹介します。

You Got Malware - AggahMsgBoxコメント使用法

2019年から活動を開始した脅威アクターグループAggahは、RevengeRATを中心とした多くのペイロードを多数の被害者に配信しています。このグループは特にMicrosoft Officeドキュメントを扱うことに長けており、VBAスクリプトにさまざまな手法を採用し、ステルス性を高めています。AIベースのサイバーツールを回避するために使われていると思われるこれらの手法の1つは、「MsgBox」という文字列を含むコメントを使用することです。

「MsgBox」は、VBAでメッセージボックスを促すために使われる関数で、多くのVisual Basicスクリプトに登場し、通常は良性のものです。VBAコードのコメントにこの文字列があると、AIモジュールによって良性に分類される可能性が高くなります。コードが短く、長い「MsgBox」コメントがコードの大部分を占めている場合、良性として分類される可能性がさらに高まります。

AggahドロッパーのVBAコード
AggahドロッパーのVBAコード

コメントスタックの中のコマンド - Emotet のランダムな文の使用

最近の Emotet VBA ドロッパーに、ランダムな単語で構成された長いコメントが含まれているのを見かけました。下の図に見られるように、実行されたコマンドとそれを含む変数は難読化されておらず、ただ長いランダムなコメントの海に浮かんでいるだけです。

このような過剰に配置されたコメントは、アナリストとAIソリューションの両方を欺く可能性をもたらします(前者に対してはコードを見たときに悪意のあるMSHTAの実行を見逃してしまう可能性を生み、後者に対しては悪意のあるコードの特徴よりも良性の特徴、つまり多くのコメントが存在するという特徴がファイル自体が良性という間違った判定に導いてしまう可能性があります)。

図 2: Emotet スポイトの VBA コード。実際のコマンドを黄色でハイライトしています。注:いくつかの長いコメントは、それぞれランダムな単語のコンパイルに過ぎず、コードの実効機能の理解に寄与しないため、ここでは省略しています。
図 2: Emotet スポイトの VBA コード。実際のコマンドを黄色でハイライトしています。注:いくつかの長いコメントは、それぞれランダムな単語のコンパイルに過ぎず、コードの実効機能の理解に寄与しないため、ここでは省略しています。

自前の難読化 - Dridexの自作関数の使用法

最近観測された最も興味深いドロッパーの1つは、悪名高い脅威グループであるDridexによって作成されたものです。以下の例では、Dridexは、検知されずにペイロードの配信を成功させるため、いくつかの洗練された方法を採用しています。

このスクリプトは、Excelのセルに格納された文字列を取得し、「slow」関数を実行して、入力の難読化を解除したバージョンを返します。最初の文字列は、「B101」セルから収集され、「WScript.Shell」に変換されます。2番目の文字列は、セル範囲「K111:K118」に対してVBAの「転置」と「結合」コマンドを有効にして組み立てられています。

Dridexドロッパーが出力したVBA。注:このブログと無関係なコードの一部は省略しています。
Dridexドロッパーが出力したVBA。注:このブログと無関係なコードの一部は省略しています。

セルからデータを取得した後、以下を受信することになります。

この部分の難読化を解除するために、「${PJ}」と「${GAB}」に記載されているすべての文字をそれぞれカンマと引用符に置き換えています。また、インデックス付きのプレースホルダーを適切な文字列に置き換え、バックチックのような不要な文字を削除しました。

その結果、以下のようなコードになりました。

これは明らかに難読化されており、主な実行文字列はbase64でエンコードされ、deflate圧縮されています。注目すべきは、攻撃者はさらに一歩進んで、「iex」コマンド(「Invoke-Expression」の略)の使用を隠そうと、PowerShellディレクトリへのパスを含む環境変数「pshome」の値から「i」と「e」という文字を取得したことです(上のハイライト部分で確認できます)。

base64 エンコードされた文字列を base64 デコードして解凍すると、さらに別の難読化された文字列になります。

文字列を組み立て直し、不要な文字を削除した後、次のように文字列になります

以前と同様に、次のステージのコードを取得するためにbase64デコードと解凍が必要ですが、今回のDridexでは、これまでのステージでは見られなかったエイリアス(aliases)が使用されています。

上のスニペットでは、「nal」 ('New-Alias') と 「sal」 ('Set-Alias') を使って、それぞれ 「cf」 と 「ox」を「New-Object」と「iex」のエイリアスとしてセットしています。

「.('yi')(${aB})」は「yi」関数の別の呼び出しを返し、その結果、次のような出力になります。

そして、いくつかのクリーンアップを経て、ようやくスポイトが何をしようとしているのかが、うっすらと見えてきたのです。

上記のコードを見直した結果(途中、自分用にいくつかのメモを追加し、スニペットに残しました)、最終的にこのドロッパーの真意について結論に達しました:ユーザーのIDを取得し、そこに含まれるハイフンを削除して、次のようなURLを組み立てます。https://geronaga[.]com/gero?myHyphenLackingUID.

そして、ユーザーのtempディレクトリにファイルをダウンロードし、それをデコードして復号化し、「regsvr32」を使ってファイルの内容を実行し、最後に、痕跡を残さないためにこの内容を削除します。

ドメインが非アクティブであり、当ブログの焦点はMicrosoft Officeドロッパーの回避技術を紹介することであるため、ダウンロードしたファイルの分析を拡大することはしませんでした。しかし、ファイルの内容を実行するために「regsvr32」が使用され、ペイロードがDLLであることが分かっているため、ダウンロードしたファイルにはペイロードのDLL登録コマンドが含まれていると推測されます。

複雑でない、より多くのファイル

特に、感染フローに複数のステージと異なるスクリプト言語で書かれたファイルが含まれる場合、単純な難読化技術で十分に検知を回避できることがあります。これは、最近復活したマルウェア ファミリーのEmotetドロッパーの分析で実証されています。

Emotet ドロッパーが出力したVBA。注: コードの一部は、このブログとは無関係であり、さらにその一部は決して実行されないため、編集しています。
Emotet ドロッパーが出力したVBA。注: コードの一部は、このブログとは無関係であり、さらにその一部は決して実行されないため、編集しています。

ご覧のように、VBA関数 「Cells」は、指定されたExcelセルの内容を抽出し、VBAスクリプトで使用するために、このスクリプトで使用されています。これらのセルに何が含まれているかが分からないと、特にどのコマンドも機能するのに十分に見えないため、このファイルが悪意のあるものかどうかを判断することは困難です。

より明確なイメージを得るために、私は、上記のコードスニペットで強調表示された関数を、以下のコードスニペットで黄色く強調表示された一致する文字列値ですべてのセルを置き換えました。

「Wscript.shell」という文字列は、Wscript を使用して追加のコマンドを実行することを示唆しており、「c: \programdata\ughldskbhn.bat 」および「c: \programdata\yhjlswle.vbs 」は、この感染フローで Emotet がこれらのバッチファイルと VBS ファイルを使用することを示唆しています。

Excelのセルから抽出した長大な文字列を、VBAの「Replace」関数で空文字列に置き換えています。実際のコマンドの一部をこれらの文字列でパディングすることで、静的解析時にフラグが立てられる可能性を低くしています。VBAの「Replace」コマンドを実行すると、以下のような受信が行われます。

上記の解読された文字列の情報を手にして、感染フローの次の段階がVBSスクリプトであり、VBAドロッパーが 「wscript」を使用して実行することが判断できました。VBAのコードにはBATスクリプトの直接の呼び出しがなかったため、もし使用された場合はVBSスクリプトから実行されると推測できたのです。

基本的に、VBAドロッパーはVBSファイルとBATファイルを作成し、それぞれに内容を書き込むだけで、あとはVBSスクリプトが主役になります。

c:\programdata</yhjlswle.vbs の元の内容
c:\programdata

上記のように、VBSスクリプトにはいくつかのコマンドが含まれており、すべてコロンで連結されています。コマンドを別の行に分け、「replace」関数を起動すると、次のようになりました。

基本的に、このスクリプトは先に作成されたBatchファイルを実行し、rundll32を使用して 「hjyldksfkw3」という値を与えながら 「countain:programdatax08neuihlows.dll 」を実行しようとするものです。「x08neuihlows.dll」の最初の記述であり、VBSファイルはDLLを実行する前にBATスクリプトを実行するので、BATスクリプトは実行ファイルを正しい場所にドロップする役割を担っていると考えるのが妥当です。

VBSファイルがコロンでコマンドを連結するように、BATスクリプトもアンパサンドを使って同じように連結します。

要するに、いくつかの変数を設定し、その値を以下のコマンドに連結しているのです。

これを訳すと、次のようになります。

PowerShell スクリプトを base64 でデコードした後、Emotet が DLL ペイロードをダウンロードする方法と、そのダウンロード元を発見しました。

以下に示すように、変数 「MJXdfshDrfGZses4」 には、スクリプトが 「for」 ループを使用して確認する URL のリストが含まれています。forループが実行されるたびに、Emotet DLL を 「c:\programdatabneuihlows.dll」に 「Invoke-WebRequest」d を使用してダウンロードしようとします。そして、ダウンロードしたファイルの長さが47436byteより大きいかどうかを調べます。ダウンロードしたファイルの長さが47436バイト以上であれば、ダウンロードに成功したことになり、ループを抜けます。

Emotetペイロードを取得するために使用されるPowerShellコード
Emotetペイロードを取得するために使用されるPowerShellコード

興味深いセルとそれを見つける場所

上記の分析で分かるように、実際のコマンドを VBA コード自体ではなく Excel のセルに格納することは、検知を回避する良い方法です。なぜなら、静的分析メカニズムが VBA コードだけを調べた場合、実行されたコンテンツが悪意のあるものかどうかを判断できなくなるからです。ExcelのセルはVBAコード内でも良性の用途があるため、セキュリティ製品は誤検知を避けるために良性と判断することがあります。

もちろん、セルをその内容に置き換えれば、検出される可能性は高くなります。そこで私は、解析中にVBAコードを実行することなく、「セル」の関数呼び出しを正しい文字列に置き換える方法を探しました。

OOXMLファイルに着目して調査したところ、Excelがデフォルトで作成する、「sharedStrings.xml」 と 「xl/worksheets/sheetName.xml」 という二つのファイルで、この目的を達成できる可能性があることを発見しました。

最初のファイルである 「sharedStrings.xml 」には、Excelファイル内のすべての文字列が含まれています。SharedStringItem (ssi) というクラスが文字列アイテム (si) を表し,各siの要素にテキスト (t) が含まれています。このファイルには一意の文字列が含まれており、それぞれが1つ以上のExcelセルの完全な内容を表しています。

SharedStrings.xmlの例
SharedStrings.xmlの例

T文字列を正しいセルにマッチさせるために、セルと文字列のマッピングが必要です。ここで、「xl/worksheets/sheetName.xml 」が登場します。OOXMLのExcelファイルでは、セルを含むデータはXMLファイルにマッピングされ、次のパス - 「xl/worksheets/sheetName.xml」にあり、例えば、「sheet1 」のセルは、「xl/worksheets/sheet1.xml 」にマッピングされることになります。これらのセルマッピングファイルは、それぞれ 「SheetData」というタグを含み、このタグは、データを含むシートの各行に対して「row」タグを含みます。各行には、「c」(セル)項目があります。文字列を含むセルの 「t」 (type) の値は 「s」 に設定され、 「v」 (value) タグには 「sharedStrings.xml」でセルが含む文字列の 「si」 オブジェクトのインデックスである整数が格納されます。整数や浮動小数点などの他のタイプのデータを含むセルは、その「v」タグにそのデータが含まれます。

「xl/worksheets/sheetName.xml」ファイルの例
「xl/worksheets/sheetName.xml」ファイルの例

このデータを抽出し、セルを適切な値にマッチングさせ、「セル」関数呼び出しをこれらの値に置き換えるスクリプトを書くことで、スクリプトを難読化させず、静的解析メカニズムでフラグが立つ可能性を高めることができました。また、VBAの「置換」関数の問題にも対処し、その機能を私のコードで模倣しました。

このスクリプトはまだ作成中で、現在は「セル」「転置」「置換」関数のみを扱っています。また、OOXMLファイルでのみ動作し、VBAコードを入力として取得することを想定しています(調べたOfficeファイルからoledumpを使って抽出しました)。まだ、やるべきことはたくさんあり、例えば、関数呼び出しでの変数の使用など、対処すべきケースもあります。例えば、「cell($i, $j)」やOLEファイルなどです。

予防と検知、そのやり方

難読化されたドロッパーは、静的シグネチャを回避するために意図的に壊れた文字列を含んでいたり、Excelのセルに不正なコンテンツを格納していたり、不正なコンテンツを隠すために過剰なコメントを使用していたりと、検知がより困難になっています。しかし、困難だからといって、不可能というわけではありません。静的に検知できる手法もあれば、動的に検知できる手法もあります。また、もっと強力なセキュリティアプローチを取るなら、すべてのスクリプトの実行を(少なくともそのほとんどを)禁止にすればよいのです。

まとめ

Deep Instinctのエージェントは、ディープラーニングを使用して悪意のあるドロッパーを防止し、お客様の環境では実行できないようにします。Deep Instinct Prevention Platformは、既知、未知、ゼロデイ脅威を、業界で最も高い精度と最も低い誤検知率で阻止します。悪意のあるファイルを20ミリ秒未満で識別し、実行される前に攻撃を阻止します。

実際のプラットフォームの動作と真の予防がどのようなものかにご興味ある方は、こちらからデモをリクエストください。

https://info.deepinstinct.com/request-a-demo

侵害の指標 (IoC)

0042404ac9cbe7c082b9c0ae130e956ab7989cfa72a3f3b0c7f2226e23a6c6cb Emotet (Excel cells method) Officeドロッパー

40a1e0aa0e580e2a15bbfd70ba4b89d3dd549bdc7bc075a223f12db0ddd2195d Emotet (Excel cells method) VBAコード

ed7c68c3c103beaa7e5f30a3b70a52bb5428ce1498b7f64feda74342f93e16fe Emotet (excessive comments method) VBA コード

028a5447d36c7445e3b24757d5cb37bafa54c5dfa7c3393fa69dd26e278442a4 Emotet (excessive comments method) Office ドロッパー

9caed14e7f7d3e4706db2e74dc870abff571cce715f83ef91c563627822af6ad Dridex Officeドロッパー

4f5ecf2c3073edd549e8ea2b1e65d8c478f3390567cffa3c909d328a3969ddd8 Dridex VBAコード

cb9a5f0ad26cbb7b9f510b80df97f0045d7232d31cfde3cbce095d1c88c90e89 Aggah VBAコード