※ 本ブログは、2021年1月19日にBromium BlogにポストされたDridex Malicious Document Analysis: Automating the Extraction of Payload URLsの日本語訳です。
2020年の最後の3カ月間は、Dridexマルウェアを配布する悪質なスパムが持続的に増加しました。HP Sure Clickによって隔離されたDridexのサンプル数は、第3四半期に比べて第4四半期には3倍以上に増加し、239%の増加を示しました。HP Sure Clickのテレメトリーによると、Dridexは現在、Emotetに次いで2番目に広く流通しているクライムウェア・ファミリーです。2012年のバンキング型トロイの木馬に端を発しますが、2017年以降Dridexの運営者はますますランサムウェアの配信に戦術をシフトしています。
Dridexの配布者は、リモートのWebサーバからトロイの木馬をダウンロードする悪意のあるOfficeドキュメント(maldoc)を使用してマルウェアを伝播させるのが一般的です。興味深いことに、2020年半ば以降、マルウェアをダウンロードするための何百ものURLを含むmaldocが登場しています。この技術は、ホスティング・プロバイダやドメイン・レジストラによるテイクダウン・アクションに対して、ローダーの耐性を高めています。また、ペイロードのダウンロードに成功する可能性も高くなります。1つのURLをブロックする代わりに、ウェブプロキシなどのネットワークセキュリティを制御する場合には、マルウェアのダウンロードを防ぐために数百のURLをブロックする必要があります。
昨年のDridex初段ローダーの変更に注目し、サンプルを集めて解析しました。この記事では、ペイロードのURLがどのように保存され、デコードされているかの概要を説明します。また、セキュリティチームのブロックリスト作成作業を支援するために、URLを抽出するPythonスクリプトも提供しています。
今回の解析では、主に Excel 形式のローダーに焦点を当てましたが、これは最も一般的なファイル形式だったためです。Dridex には、以前にも記事にした Word ドロッパーもあります。ドロッパーとは対照的に、マルウェアローダーには、少なくとも1つペイロードをダウンロードするために使用されるのネットワーク宛先が含まれています。これにより、ローダーは小型化できますが、マルウェアをインストールするためにはネットワークを介した通信が必要になります。Dridex ローダーは一般的に、ペイロードをダウンロードするために図 1 に示すアプローチを使用します。
我々は、異なる方法でペイロードのダウンロードと実行を行う、いくつかのタイプのDridexローダーを特定しました。ドキュメントでコードを実行するためにVisual Basic for Applications(VBA)マクロを使うもの、Excel 4マクロを使うもの、またはその両方を使用するものがありました。ローダーは、ネットワーク接続を開き、ペイロードをダウンロードするためにPowerShellまたはWindows API呼び出しのいずれかを使用します。コードの実行方法に基づいて、Dridexのローダーを2つのタイプに分けることができます。
Excel 4のマクロを使って実行されるコード
一番目のタイプのローダーは、Excel 4 のマクロを使用して PowerShell コードを生成する、あるいはWindows API 関数を呼び出してマルウェアをダウンロードします。どちらの場合も、ローダーは1つのURLからペイロードをダウンロードするだけです。
VBAマクロを使って実行するコード
2番目のタイプのローダーは、VBAマクロを使用してDridexをダウンロードします。このタイプのローダーは、これを実現するためにさまざまな方法を使用します。1つの方法は、ペイロードをダウンロードするためにPowerShellを呼び出すエンコードされたシェルコマンドを生成するものです。このローダーも、1つのURLからのみペイロードをダウンロードします。
この2番目のタイプのローダーで使用される、より注目すべき方法は、エンコードされたデータをExcelワークシートに格納することです。実行すると、VBAコードはワークシートからデータをロードし、多くのルーチンのうちの1つを使ってデコードします。デコードされたデータは、数百のURLのリストで、その中の一つがDridexをダウンロードするためにランダムに選ばれます。ペイロードURLの膨大な量はローダーとしては珍しいので、このダウンロードメカニズムをより詳細に分析することにしました。
このタイプのローダーについての最初の疑問は、URLがドキュメントにどのように格納されているかということでした。この具体的な答えを見つけるために、我々はVBAコードを手動でデバッグしてドキュメントを分析しました。最初にExcelでサンプルからVBAプロジェクトを開くと、「Project Is Unviewable」という警告が発生しました。この警告の原因と解決方法については、こちらの記事が参考になります。この問題を解決した後、私たちはローダーのVBAコードを読んで動かすことができました。
このコードは、ファイルを開いたときに発生するスプレッドシートのレイアウトが変更されたときに実行されます。メイン関数には、アクティブなワークシートのセルを繰り返し処理するループが含まれています。繰り返しの間に、エンコードされたデータがワークシートから読み込まれ、デコードされて変数内に格納されます。その後、この変数は複数の要素に分割され、ExecuteExcel4Macro関数の引数として使用されます。この関数は、その名の通り、引数として与えられたMicrosoft Excel 4マクロを実行します。エンコードされたURLは、ワークシートから読み込まれます。ワークシート内のすべてのセルを選択し、テキストの色を変更することで、エンコードされたテキストを見ることができます。
URLに興味があるので、VBAのコードを少し修正して、データのデコード機能を実行して印刷してみました。図5は、これらのURLのスニペットを示しています。
Excel 4 マクロの実行を見てみると、戻り値が評価されていないことがわかります。これは、URL ホストがオフラインの場合、ローダーは別の URL からペイロードをダウンロードしないことを意味します。
デコード関数を分析したところ、多くの関数がサンプル間で再利用されていたり、わずかしか変更されていないことがわかりました。デコード関数は、アクティブなワークシート内のすべての値を繰り返し処理します。約30回のDridexスパムからの約60体のサンプルから、6種類のデコードルーチンを発見しました。
ワークシートのデータが文字オフセットエンコーディングを使用してエンコードされている場合、DridexローダーはURL内の各文字のASCII値を1 or 2 or 3減少させます。いくつASCII値を減少させるかはランダムに選択されます。文字列をデコードして正しいURLを返す関数のPython実装は以下のようになります。
リバースエンコーディングを使用している Dridex ローダーの特徴は、ワークシート上に数字が散らばっていることです。これらの数字は配列のインデックスを示しています。対応する値は行番号を ASCII 値で表したもので、デコーダ関数はこれを文字に変換します。ソートされた配列は、URLのリストを出力します。
スクランブルエンコーディングは、文字オフセットエンコーディングに似ています。文字はに ASCII 値に別の値を加算または減算した後に変換されます。値が加算されるか減算されるかの判断は、文字の位置に依存します。
部分文字列連結エンコーディングでエンコードされたURLを含むドキュメントは、ワークシート内に多数の小さな文字列を含んでいます。URLは、値を繰り返し処理することでデコードされます。値が2文字よりも長い場合は、部分文字列は抜き取られます。繰り返し処理が終了した後、ドキュメントの中の部分文字列は完全なURLを含む文字列に組み立てられます。
ここでは、URLの文字は16進数値としてエンコードされ、アクティブなワークシートのランダムなセルに格納されます。各値の文字への変換を繰り返し、URL全体を含む文字列に再構成していくことでデコードされます。
フォーマットエンコーディングを使用する Dridex ローダーを開くと、アクティブなワークシートに値が表示されません。セルの値の代わりに、このタイプのエンコーディングでは、URL をデコードするためにセルがフォーマットされているかどうかをチェックします。デコーダはすべてのセルを繰り返し処理し、そのフォーマットをチェックします。セルが "General "としてフォーマットされていない場合、対応する列のインデックスがURL文字に対応するASCII値となります。
説明したルーチンのいずれかにより含まれるURLをデコードした後、Dridexペイロードがダウンロードされ、ドキュメントは自動的に閉じられます。
6つの異なるエンコーディングメカニズムの使用法を時系列で追跡すると、Dridexのmaldocの配布者は数回のスパムの波の後にURLのエンコーディングのタイプを切り替える傾向があることがわかります。これらの変更の間では、エンコーディングのメカニズムはほとんど変わらず、わずかな変更しかありませんでした。
我々は、6つのエンコーディング・アルゴリズムのうちの1つを使用しているDridexのMaldocからすべてのURLを抽出するPythonスクリプトを書きました。セキュリティチームはスクリプトの出力を使用して、典型的なサンドボックスが動的解析で抽出するただ1つのURLではなく、すべての可能性のあるDridexペイロードURLをブロックすることができます。
Dridexとその配布の背後にいる脅威アクターは、その技術を絶えず変化させているので、我々はエンコーディング・アルゴリズムが変化すると想定しています。この自動化は将来のローダーでは機能しないかもしれませんが、我々の解析はセキュリティチームに新しいデコード機能を実装する方法についての手掛かりを与えるでしょう。
2020年半ば以降、DridexのMaldocには、トロイの木馬をホストする数百のURLが含まれているものがありました。この期間のドキュメントを検証して、URLを難読化するために使用された6種類のエンコーディングを特定しました。エンコーディングはスパムの波によって異なりますが、ドキュメントの基本的な構造は大きく変わっていません。我々は、このアプローチをベースに、将来のDridex maldocで使用されるエンコーディング方法のデコーダを実装することは可能だと考えています。
Pythonスクリプトを使ってURLの抽出を自動化し、56のドキュメントから2,082のURLを収集しました。この分析に対応するIOCとURL抽出スクリプトは、HP Threat ResearchのGitHubリポジトリにあります。
Author : Patrick Schläpfer
監訳:日本HP