はじめに
Elasticセキュリティラボは最近、中国語圏を標的とした新たな侵入セットを観測し、REF3864として追跡されました。これらの組織的なキャンペーンは、Webブラウザやソーシャルメディアメッセージングサービスなどの正当なソフトウェアになりすまして被害者を標的にしています。これらのキャンペーンの背後にある脅威グループは、Linux、Windows、Androidなどの複数のプラットフォームにマルウェアを配信する際に、中程度の汎用性を示しています。この調査中に、私たちのチームは、SADBRIDGEと呼ばれるカスタムローダーを使用した独自のWindows感染チェーンを発見しました。このローダーは、GOSARと呼ばれるQUASARのGolangベースの再実装をデプロイします。私たちのチームがGolangプログラミング言語でQUASARの書き直しを観察するのはこれが初めてです。
重要なポイント
- 中国語を話す人を標的としたキャンペーンが進行中で、TelegramやOperaウェブブラウザなどの正規のソフトウェアを装った悪意のあるインストーラーが登場
- 感染チェーンは、カスタムローダー(SADBRIDGE)を使用したインジェクションとDLLサイドローディングを採用しています
- SADBRIDGEは、Golang(GOSAR)で書かれたQUASARバックドアの新たに発見された亜種をデプロイします
- GOSARは、活発に開発されている多機能バックドアであり、不完全な機能と改善された機能の反復が時間の経過とともに観察されます
- Elasticセキュリティは、この攻撃チェーンに対する包括的な防止および検出機能を提供します
REF3864キャンペーン概要
11月、Elastic Security Labsチームは、VirusTotalにアップロードされたいくつかの異なるサンプルを爆発させる際に、ユニークな感染チェーンを観測しました。これらの異なるサンプルは、TelegramやOpera GXブラウザなどの正規のソフトウェアを装ったランディングページを介してホストされていました。
この調査では、同様の手法が関与する複数の感染チェーンが明らかになりました。
- トロイの木馬化されたMSIインストーラーで検出率が低い
- 悪意のあるDLLにバンドルされた正規のソフトウェアを使用したなりすまし
- カスタムSADBRIDGEローダーのデプロイ
- 最終ステージ GOSAR 搭載
これらのキャンペーンは、複数の抽象化レベルにより、目立たないところを飛んでいたと考えています。通常、最初のフェーズでは、MSI インストーラーを含むアーカイブ ファイル (ZIP) を開きます。Windows x64dbg.exe
デバッグ アプリケーションなどの正規のソフトウェアは、悪意のあるパッチが適用された DLL (x64bridge.dll
) をロードするためにバックグラウンドで使用されます。このDLLは、新しい正当なプログラム(MonitoringHost.exe
)を開始し、別の悪意のあるDLL(HealthServiceRuntime.dll
)をサイドロードし、最終的にインジェクションを実行し、インジェクションを介してメモリにGOSARインプラントをロードします。
マルウェアの研究者は、敵対者が指定したキャンペーンの日付を明らかにし、同様のTTPによる運用が少なくとも2023年12月から進行中であることを示すSADBRIDGE構成を抽出しました。GOSARのC2(C2)インフラストラクチャは、信頼できるサービスやソフトウェアを装い、無害に見え、ソフトウェアインストーラーに対する被害者の期待に沿うことがよくあります。実行チェーン全体を通じて、 360tray.exe
などの中国の AV 製品を列挙することと、ファイアウォール ルールの名前と説明を中国語で列挙することに重点が置かれています。これらのカスタマイズにより、この脅威は中国語を話す人々を標的にしていると考えています。さらに、中国語のロギングが広く使用されていることから、攻撃者は中国語を話す人でもあることが分かります。
QUASARは、 2017 年以降、中国と関係のある APT10 など、国家が支援するスパイ活動、非国家的なハクティビズム、および犯罪的な金銭的動機による攻撃に使用されてきました(Qualys、 Evolution of Quasar RAT など)。Golangの書き直しは、この期間に得られた制度的知識を活用し、以前に効果的だったTTPの広範な再訓練なしに追加の機能を可能にするかもしれない。
GOSARは、QUASARを拡張し、情報収集機能の追加、マルチOSのサポート、アンチウイルス製品やマルウェア分類器に対する回避能力の向上などを備えています。しかし、一般的なおとり捜査のウェブサイトや、追加のターゲティング情報や目標に対する行動が不足しているため、攻撃者の動機を特定するための証拠は不十分です。
SADBRIDGEの紹介
SADBRIDGEマルウェアローダーは、配信用のMSI実行可能ファイルとしてパッケージ化されており、さまざまなインジェクション手法でDLLサイドローディングを使用して悪意のあるペイロードを実行します。SADBRIDGEは、 x64dbg.exe
や MonitoringHost.exe
などの正当なアプリケーションを悪用して、 x64bridge.dll
や HealthServiceRuntime.dll
などの悪意のあるDLLをロードし、後続のステージとシェルコードにつながります。
永続性は、サービスの作成とレジストリの変更によって実現されます。管理者への権限昇格は、ICMLuaUtil
COM インターフェイスを悪用する UAC バイパス手法を使用してサイレントに行われます。さらに、SADBRIDGEには、Windowsタスクスケジューラを介した 権限昇格バイパス が組み込まれており、SYSTEMレベルの権限でメインペイロードを実行します。
SADBRIDGE 構成は、構成ストリングの各バイトで 0x1
を単純に減算して暗号化されます。暗号化されたステージはすべて .log
拡張子で追加され、実行時に XOR と LZNT1 解凍アルゴリズムを使用して復号化されます。
SADBRIDGEは、プロセスインジェクションに PoolParty、APCキュー、およびトークン操作技術を採用しています。サンドボックス分析を回避するために、長い Sleep
API 呼び出しを使用します。別の防御回避手法には、マルウェア対策スキャンインターフェイス(AMSI)やWindowsイベントトレーシング(ETW)などのWindowsセキュリティメカニズムを無効にするAPIパッチの適用が含まれます。
次の詳細では、実行チェーンを探索するように構成されており、分析されたサンプルの構成に基づいて、重要なファイルとステージの機能と機能を段階的に説明します。この分析は、各コンポーネントと最終ペイロードに到達する際のそれらの役割との間の相互作用を強調することを目的としています。
SADBRIDGEコード解析
MSI分析
初期ファイルは Advanced Installerを使用してMSIにパッケージ化され、関心のある主なファイルは x64dbg.exe
ファイルと x64bridge.dll
です。
MSI ツール (lessmsi) を使用すると、aicustact.dll
の LaunchApp
エントリポイントが AI_APP_FILE
プロパティで指定されたファイル パスを実行するように構成されていることがわかります。
この AI_APP_FILE
プロパティに移動すると、この構成に関連付けられているファイルが x64dbg.exe
であることがわかります。これは、インストールが完了した後に実行されるファイルを表し、正当な NetFxRepairTool.exe
は実行されません。
x64bridge.dll サイドローディング
x64dbg.exe
が実行されると、x64bridge.dll
から BridgeInit
エクスポートが呼び出されます。BridgeInit
は BridgeStart
関数のラッパーです。
BLISTERで観察される手法と同様に、SADBRIDGEは正当なDLLのエクスポートにパッチを適用します。
マルウェアの初期化ルーチン中に、SADBRIDGEはホスト名とマジックシード 0x4E67C6A7
を使用してハッシュを生成することから始めます。このハッシュは、暗号化された設定ファイルを保存するためのディレクトリ名として使用されます。暗号化された設定は C:\Users\Public\Documents\<hostname_hash>\edbtmp.log
に書き込まれます。このファイルには、通常のディレクトリ リストから自身を隠すための属性 (FILE_ATTRIBUTE_SYSTEM、FILE_ATTRIBUTE_READONLY、FILE_ATTRIBUTE_HIDDEN) が含まれています。
構成の復号化は簡単で、暗号化されたチャンクはヌルバイトで区切られます。暗号化されたチャンク内のバイトごとに、それらを 0x1
ずつインクリメントできます。
構成は、次のもので構成されます。
- キャンペーン実施予定日
- サービスの作成に使用する文字列
- MonitoringHost.exeの新しい名前(
DevQueryBroker.exe
) - MonitoringHost.exeによってサイドロードされる DLL の DLL 名 (
HealthServiceRuntime.dll
) - 追加ステージの絶対パス (
.log
ファイル) - GOSARをホストするための主要な注入ターゲット(
svchost.exe
)
DevQueryBroker
ディレクトリ(C:\ProgramData\Microsoft\DeviceSync\Device\Stage\Data\DevQueryBroker\
)には、実行時に復号化されるすべての暗号化されたステージ(.log
ファイル)が含まれています。このファイル (DevQueryBroker.exe
) は、Microsoft の正規アプリケーション (MonitoringHost.exe
) の名前を変更したコピーです。
最後に、同じフォルダ内の悪意のあるHealthServiceRuntime.dll
をサイドロードするDevQueryBroker.exe
を実行するプロセスを作成します。
HealthServiceRuntime.dll
このモジュールは、暗号化されたシェルコードと部分的に復号化されたシェルコードの両方をユーザーの %TEMP%
ディレクトリにドロップします。シェルコードのファイル名は、 log<random_string>.tmp
の形式に従います。部分的に復号化されたシェルコードの各バイトは、完全に復号化するために 0x10
ずつデクリメントされます。シェルコードは、同じプロセスの新しいスレッドで実行されます。
このマルウェアは、SonicWallが発表した 研究 と同じアルゴリズムを使用してAPIハッシュを利用しており、ハッシュアルゴリズムは付録 セクションに記載されています。シェルコードは DevQueryBroker.log
をPEファイルに復号化し、ファイルの最初の3分の1に1バイト(0x42)
で単純なXOR演算を実行し、LZNT1アルゴリズムを使用して結果を解凍します。
次に、シェルコードは NtUnmapViewOfSection
を使用して PE ファイルの優先ベースアドレスにある既存のマッピングをアンマップし、 VirtualAlloc
の呼び出しによって優先ベースアドレスから始まるメモリが割り当てられます。最後に、復号化されたPEファイルをこの割り当てられたメモリにマップし、実行をそのエントリポイントに転送します。SADBRIDGEによって識別および実行されるすべてのシェルコードは、復号化と実行のために参照する特定の .log
ファイルのみが異なる、同一のコード構造を共有します。
DevQueryBroker.log
このマルウェアは、 amsi.dll
を動的にロードして、Windowsの重要なセキュリティメカニズムを無効にします。これは、戻り値を 0x80070057
に変更する命令を挿入することでamsi.dll
AmsiScanBuffer
パッチを適用し、標準化された Microsoft エラー コードE_INVALIDARG
無効な引数を示し、早期に返すことで、スキャン ロジックを効果的にバイパスします。同様に、常に同じエラーコードを返すようにAmsiOpenSession
E_INVALIDARG
パッチを適用します。さらに、ntdll.dll
EtwEventWrite
にパッチを適用し、最初の命令を Event Tracing for Windows (ETW) を無効にするret
命令に置き換えて、悪意のあるアクティビティのログ記録を抑制します。
パッチ適用後、暗号化されたシェルコードがパス (C:\ProgramData\Microsoft\DeviceSync\Device\Stage\Data\DevQueryBroker\temp.ini
) の temp.ini
に書き込まれます。
マルウェアは、現在のプロセストークンのグループメンバーシップをチェックして、その特権レベルを判断します。プロセスが LocalSystem アカウントに属しているかどうかを確認するには、 SECURITY_LOCAL_SYSTEM_RID
で SID を初期化し、 CheckTokenMembership
を呼び出します。そうでない場合は、 SECURITY_BUILTIN_DOMAIN_RID
と DOMAIN_ALIAS_RID_ADMINS
を使用して SID を作成し、同様のトークン メンバーシップ チェックを実行して、Administrators グループのメンバーシップを確認しようとします。
現在のプロセスに LocalSystem または Administrator 特権がない場合、特権は最初に ICMLuaUtil
COM インターフェイスを利用して UAC バイパス メカニズムを通じて Administrator に昇格されます。モニカー文字列 "Elevation:Administrator!new:{3E5FC7F9-9A51-4367-9063-A120244FBEC7}"
を作成して、管理者特権を持つ CMSTPLUA
オブジェクトのインスタンスを作成します。オブジェクトが作成され、 ICMLuaUtil
インターフェイスが取得されると、マルウェアはインターフェイスの公開された ShellExec
メソッドを使用して DevQueryBroker.exe
を実行します。
タスクまたはサービスが DevQueryBroker.exe
を定期的に実行するように作成されていない場合、マルウェアはアンチウイルスプロセス 360tray.exe
が実行されているかどうかを確認します。実行されていない場合は、権限昇格のためのサービスが SYSTEM に作成され、次のプロパティが使用されます。
- サービス名: DevQueryBrokerService
バイナリ パス名: "C:\ProgramData\Microsoft\DeviceSync\Device\Stage\Data\DevQueryBroker\DevQueryBroker.exe -svc"。 - 表示名: DevQuery Background Discovery Broker Service
- 説明: アプリがバックグラウンド タスクを使用してデバイスを検出できるようにします。
- スタートタイプ: システム起動時に自動的に
- 特権: LocalSystem
360tray.exe
の実行が検出された場合、マルウェアは暗号化されたPEファイルをDevQueryBrokerService.log
に書き込み、次の段階のPEファイル(ステージ1)を現在のプロセスメモリにマッピングし、実行を転送します。
DevQueryBroker.exe
がSYSTEMレベルの権限で再トリガーされ、チェーンのこの部分に到達すると、マルウェアはWindowsのバージョンをチェックします。Vista 以降 (Windows 7 を除く) を実行しているシステムでは、別の次のステージ (ステージ 2) をメモリにマップし、そこで実行を転送します。
ただし、Windows 7 では、シェルコードが実行され、 DevQueryBrokerPre.log
ファイルが復号化されて実行されます。
ステージ 1 インジェクション(explorer.exe)
SADBRIDGEは、 PoolParty Variant 7 を使用して、スレッドプールのI/O完了キューをターゲットにしてシェルコードを explorer.exe
に挿入します。最初に、ターゲット プロセスの I/O 完了キューへのハンドルを複製します。次に、シェルコードを格納するために explorer.exe
内にメモリを割り当てます。細工された TP_DIRECT
構造体を格納するために追加のメモリが割り当てられ、これにはシェルコードのベースアドレスがコールバックアドレスとして含まれています。最後に、 ZwSetIoCompletion
を呼び出し、 TP_DIRECT
構造体へのポインタを渡して、ターゲット プロセスのワーカー ファクトリ (ワーカー スレッド マネージャー) の I/O 完了キューにパケットをキューイングし、挿入されたシェルコードの実行を効果的にトリガーします。
このシェルコードは、 DevQueryBrokerService.log
ファイルを復号化し、優先ベースアドレスを占有するメモリ領域のマッピングを解除し、PEファイルをそのアドレスにマッピングしてから、そのエントリポイントを実行します。この動作は、以前に観察されたシェルコードを反映しています。
ステージ 2 インジェクション(spoolsv.exe/lsass.exe)
ステージ 2 では、SADBRIDGE は、ステージ 1 と同じインジェクション手法を使用して、シェルコードを spoolsv.exe
に注入するか、spoolsv.exe
が利用できない場合は lsass.exe
に注入します。シェルコードは、 DevQueryBrokerPre.log
をPEファイルに復号化し、優先ベースアドレスを占める領域のマッピングを解除し、PEファイルをマッピングし、実行をエントリポイントに転送するという、前の段階と同様の動作を示します。
DevQueryBrokerService.log
前のセクションで述べたように、 DevQueryBrokerService.log
から復号化されたシェルコードは、Windowsタスクスケジューラを使用した権限昇格手法を活用しています。SADBRIDGE は、IElevatedFactorySever
COM オブジェクトを使用してパブリック UAC バイパス技術を統合し、スケジュールされたタスクを間接的に作成します。このタスクは DevQueryBroker.exe
、タスク名 DevQueryBrokerService
.
その痕跡を隠すために、マルウェアはプロセス環境ブロック(PEB)を直接変更することにより、イメージパスとコマンドラインをスプーフィングします。これは、COMサービスが explorer.exe
から来ているように偽装する試みです。
DevQueryBrokerPre.log
SADBRIDGE は、以下の属性を持つレジストリー・サブキー SYSTEM\CurrentControlSet\Services\DevQueryBrokerServiceSvc
の下に DevQueryBrokerServiceSvc
という名前のサービスを作成します。
- 説明: アプリがバックグラウンド タスクを使用してデバイスを検出できるようにします。
- DisplayName: DevQuery バックグラウンド検出ブローカー サービス
- ErrorControl: 1
- ImagePath:
%systemRoot%\system32\svchost.exe -k netsvcs
- オブジェクト名: LocalSystem
- 開始: 2 (自動開始)
- タイプ:16。
- 失敗アクション:
- 失敗カウントを 24 時間ごとにリセットします。
- 3 回の再起動試行を実行します (1 回目は 20 ミリ秒、2 回目と 3 回目は 1 分)。
サービス・パラメーターは、 C:\Program Files (x86)\Common Files\Microsoft Shared\Stationery\<hostname_hash>\DevQueryBrokerService.dll
にあるServiceDll
を指定します。DLLファイルが存在しない場合は、直後にディスクにドロップされます。
DevQueryBrokerService.dll
は、実行チェーンの初期の段階で見られる HealthServiceRuntime.dll
と同様のコード構造を持っています。DevQueryBroker.log
の復号化と実行を担当します。ServiceDll
は、サービスの開始時にsvchost.exe
によって読み込まれて実行されます。
さらに、SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost\netsvcs
キーを変更して、新しく作成されたサービスをnetsvcs
サービス ホスト グループによって管理されるサービスのグループに統合するための DevQueryBrokerServiceSvc
のエントリを含めます。
次に、SADBRIDGE は、レジストリー・サブキー SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Schedule\\TaskCache\\Tree\\DevQueryBrokerService
と SYSTEM\\CurrentControlSet\\Services\\DevQueryBrokerService
を削除することによって、以前に作成したスケジュールされたタスクとサービスを削除します。
最後に、新しい永続化メカニズムが導入されているため、C:\ProgramData\Microsoft\DeviceSync\Device\Stage\Data\DevQueryBroker
フォルダ内のDevQueryBroker.exe
ファイルとHealthServiceRuntime.dll
ファイルが削除されます。
GOSARインジェクション
コードの後半では、SADBRIDGE は WTSEnumerateSessionsA
API を使用して、ローカル・マシン上のすべてのアクティブ・セッションを列挙します。
セッションが見つかった場合は、各セッションを反復処理します。
- セッションごとに、
WTSQuerySessionInformationA
を使用してユーザー名(WTSUserName
)の取得を試みます。クエリが失敗すると、次のセッションに移動します。 WTSUserName
が空でない場合、コードはsvchost.exe
をターゲットとし、そのパス、セッション ID、およびローダ設定の内容を、最終ステージを挿入するサブルーチンに渡します。WTSUserName
が空で、セッションのWinStationName
が"Services"
(サービス セッションを示す) 場合、代わりにdllhost.exe
を対象とし、同じパラメーターを最終ステージのインジェクション サブルーチンに渡します。
セッションが見つからない場合は、無限ループに入り、セッションを繰り返し列挙し、最終ステージを注入するためのサブルーチンを呼び出しながら、冗長な注入を回避するためのチェックを実行します。
ログイン セッションは svchost.exe
を対象とし、サービス セッションまたはログイン ユーザーがいないセッションは dllhost.exe
を対象とします。
セッション ID が使用可能な場合、コードはそのセッションのユーザー・トークンを複製し、重複したトークンの整合性レベルを S-1-16-12288
(システム整合性) に昇格しようとします。次に、昇格したトークンを使用して、 CreateProcessAsUserA
を介して子プロセス(svchost.exe
または dllhost.exe
)を作成します。
トークンの操作に失敗した場合、またはセッション ID が使用できない場合 (システム プロセスのセッション ID は 0 でもかまいません)、 CreateProcessA
を使用してトークンのないプロセスの作成にフォールバックします。
暗号化されたシェルコード C:\ProgramData\Microsoft\DeviceSync\Device\Stage\Data\DevQueryBroker\temp.ini
は、以前に .log
ファイルを復号化するために見たのと同じXORおよびLZNT1解凍技術を使用して復号化され、APCインジェクションを使用して、新しく作成されたプロセスのスレッドで実行するシェルコードをキューに入れることができます。
最後に、挿入されたシェルコードは DevQueryBrokerCore.log
をGOSARに復号化し、新しく作成されたプロセスのメモリで実行します。
GOSARの紹介
GOSARは、WindowsおよびLinuxシステムを標的とする多機能リモートアクセス型トロイの木馬です。このバックドアには、システム情報の取得、スクリーンショットの撮影、コマンドの実行、キーロギングなどの機能が含まれています。GOSARバックドアは、QUASARのコア機能と動作の多くを保持しながら、元のバージョンと区別するいくつかの変更を組み込んでいます。
Goのような最新の言語でマルウェアを書き換えることで、多くのアンチウイルスソリューションやマルウェア分類子がこれらの新しいプログラミング構造の下で悪意のある文字列/特性を特定するのに苦労するため、検出率が低下する可能性があります。以下は、アップロード時に 5 個の検出のみを受け取る解凍された GOSAR の良い例です。
特に、この亜種は、Linuxシステム用のELFバイナリやWindows用の従来のPEファイルなど、複数のプラットフォームをサポートしています。このクロスプラットフォーム機能は、Goの適応性と一致しており、元の.NET ベースの QUASAR。次のセクションでは、オープンソースバージョン(QUASAR)と比較したGOSARのコード構造、新機能、および追加機能に焦点を当てます。
GOSAR コード解析の概要
GOSARのコード構造
バイナリはすべてのシンボルを保持していたため、バージョンのサンプルから抽出されたソースコード構造を再構築することができました 0.12.01
- vibrant/config: マルウェアの設定ファイルが含まれています。
- vibrant/proto: すべての Google Protocol Buffers (proto) 宣言を格納します。
- vibrant/network: メイン接続ループ、プロキシ処理、ファイアウォールの設定やリスナーの設定のためのスレッドなど、ネットワーキングに関連する機能が含まれています
- vibrant/msgs/resolvers: マルウェアが処理するコマンドを定義します。これらのコマンドは、
vibrant_msgs_init*
関数内のオブジェクトに割り当てられます。 - vibrant/msgs/services: キーロガー、クリップボードロガーなどのサービスの実行など、新機能を導入し、これらのサービスは
vibrant_network._ptr_Connection.Start
機能で開始されます。 - vibrant/logs: マルウェアの実行をログに記録する責任があります。ログは、設定に保存されているAESキーで暗号化されます。マルウェアは、AESを使用してログをチャンクで復号化します。
- vibrant/pkg/helpers: さまざまなマルウェアコマンドやサービスで使用されるヘルパー関数が含まれています。
- vibrant/pkg/screenshot: 感染したシステムのスクリーンショットキャプチャ機能を処理します。
- vibrant/pkg/utils: ランダムな値を生成するようなユーティリティ関数を含んでいます。
- vibrant/pkg/native: Windows API (WINAPI) 関数を呼び出すための関数を提供します。
GOSARに新たに追加されました
コミュニケーションと情報収集
この新しい亜種は、 TCP TLSに基づく元の通信方法と同じ通信方法を引き続き使用します。接続すると、まずシステム情報を C2 に送信し、 4 つの新しいフィールドが追加されます。
- IPアドレス
- ウイルス 対策
- クリップボード設定
- 財布
アンチウイルスとデジタルウォレットのリストは、ファンクション vibrant_pkg_helpers_init
で初期化されており、このドキュメントの下部にあります。
サービス
このマルウェアは、クライアントがC2に最初に接続したときに開始された 3 サービスを処理します。
- vibrant_services_KeyLogger
- vibrant_services_ClipboardLogger
- vibrant_services_TickWriteFile
KeyLogger
GOSAR のキーロギング機能は、 vibrant_services_KeyLogger
関数に実装されています。この機能は、Windows API に依存して、低レベルのキーボード イベントを監視するパラメーター ID を持つ SetWindowsHookEx
でグローバル Windows フックを設定することにより、感染したシステムでのキーストロークをインターセプトWH_KEYBOARD_LL
記録します。フック関数の名前は vibrant_services_KeyLogger_func1
です。
ClipboardLogger
クリップボードのログ記録機能は単純で、Windows API に依存しています。まず、IsClipboardFormatAvailable
を使用してクリップボード データの可用性を確認し、次に GetClipboardData
API を使用してデータを取得します。
ティックライトファイル
ClipboardLogger
サービスと KeyLogger
サービスはどちらも、TickWriteFile
によって現在の日付のファイル ( 2024-11-27
など) の下のディレクトリ (C:\ProgramData\Microsoft\Windows\Start Menu\Programs\diagnostics
) に定期的に書き込まれるデータを収集します。
復号化するには、最初に値を減算し、次に CyberChef レシピに示されているように、0x1f
0x18
の値で xor します。
ネットワークのセットアップ
サービスを初期化した後、マルウェアはネットワーク設定専用の 3つのスレッド を生成します。
- vibrant_network_ConfigFirewallRule
- vibrant_network_ConfigHosts
- vibrant_network_ConfigAutoListener
ConfigFirewallRule (ファイアウォールルールの設定)
マルウェアは、中国語の名前でポート範囲 51756-51776
のインバウンドファイアウォールルールを作成します。これは、説明が次のように設定されているすべてのプログラムとIPアドレスの受信を許可する Distributed Transaction Coordinator (LAN)
に変換されますInbound rules for the core transaction manager of the Distributed Transaction Coordinator service are managed remotely through RPC/TCP.
コンフィグホスト
この関数は、次の127.0.0.1 micrornetworks.com
c:\Windows\System32\Drivers\etc\hosts
エントリを追加します。このエントリを追加した理由は不明ですが、マルウェアの現在の開発段階で機能が欠落しているか、機能が不完全であるためである可能性があります。
ConfigAutoListener
マルウェアのこの機能は、以前はファイアウォールルールで許可されていた 51756-51776
の範囲内で最初に使用可能なポートでHTTPサーバーリスナーを実行します。興味深いことに、サーバーはコマンドを処理しないため、マルウェアがまだ開発中であることが証明されています。現在のバージョンでは、URI /security.js
へのGET
リクエストのみを処理し、文字列callback();
で応答し、その他のリクエストは 404 エラーコードを返します。この最小限の応答は、サーバーがプレースホルダーであるか、開発の初期段階の一部であり、後でより複雑な機能が追加される可能性があることを示している可能性があります
ログ
マルウェアは、ランタイムログをディレクトリに保存します: %APPDATA%\Roaming\Microsoft\Logs
ファイル名の下に、 windows-update-log-<YearMonthDay>.log
という形式で保存します。
各ログエントリはHMAC-AESアルゴリズムで暗号化されます。キーは vibrant_config
関数にハードコードされており、次に例を示します。
攻撃者は、コマンド ResolveGetRunLogs
を発行することで、マルウェアのランタイムログをリモートで取得できます。
Plugins
このマルウェアには、C2からダウンロードされ、XORアルゴリズムで暗号化されたディスクに保存されているPEファイルであるプラグインを実行する機能があります。これらのプラグインは、パス C:\ProgramData\policy-err.log
に保存されます。プラグインを実行するには、コマンド ResolveDoExecutePlugin
が呼び出され、最初にプラグインが利用可能かどうかを確認します。
次に、 plugins.dll
という名前のバイナリに base64 形式で格納されているネイティブ DLL を反射的に読み込み、エクスポート関数 ExecPlugin
.
ExecPlugin
C:\Windows\System32\msiexec.exe
の中断プロセスを引数 に /package
/quiet
で作成します。次に、 非同期プロシージャ コール (APC) をプロセスのメイン スレッドにキューに入れます。スレッドが再開されると、キューに入れられたシェルコードが実行されます。
シェルコードは、 C:\ProgramData\policy-err.log
に保存されている暗号化されたプラグインを読み取り、ハードコードされた1バイトのXORキーを使用して復号化し、反射的にロードして実行します。
HVNC
このマルウェアは、既存のソケットを介して非表示のVNC(HVNC)をサポートし、 5 コマンドを公開します
- リゾルブHVNCCコマンド
- ResolveGetHVNCScreen
- リゾルブストップHVNC
- ResolveDoHVNCKeyboardEvent
- ResolveDoHVNCMouseEvent
最初に実行されるコマンドは ResolveGetHVNCScreen
で、最初に初期化してビューを設定し、base64形式の埋め込みネイティブDLL HiddenDesktop.dll
を使用し、DLLはメモリに反射的にロードされて実行されます。
DLLは、HVNCをセットアップするための低レベルのAPIを実行する役割を担い、合計 7 つのエクスポートされた関数があります。
- エキュミュートコマンド
- DoMouseスクロール
- マウス右クリック
- マウス移動
- マウス左クリック
- ドキープレス
- キャプチャースクリーン
最初に呼び出されるエクスポート関数は、CreateDesktopA
API を使用してデスクトップを初期化するためにInitialise
されます。このHVNC実装は、ExcuteCommand
エクスポートで見つけることができる合計 17 コマンドを処理しますが、名前にタイプミスがあり、コマンドIDはマルウェアのコマンドResolveHVNCCommand
から転送されますExcuteCommand
。
コマンド ID | 説明 |
---|---|
0x401 | この関数は、最初に TaskbarGlomLevel レジストリ キーを 2 under Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced に設定して、タスク バー ボタンのグループ化を無効にします。次に、ABM_SETSTATE コマンドでSHAppBarMessage を使用して、タスクバーが常に表示され、上部に表示されるようにし、状態をABS_ALWAYSONTOP に設定します。 |
0x402 | shell32.dll の 61 番目のエクスポート機能を実行して RUN ダイアログ ボックスを生成します。C:\Windows\system32\rundll32.exe shell32.dll,#61 |
0x403 | のインスタンスを実行します。 powershell.exe |
0x404 | に保存されているPEファイルを実行します。 C:\\ProgramData\\shell.log |
0x405 | のインスタンスを実行します。 chrome.exe |
0x406 | のインスタンスを実行します。 msedge.exe |
0x407 | のインスタンスを実行します。 firefox.exe |
0x408 | のインスタンスを実行します。 iexplore.exe |
0x409 | のインスタンスを実行します。 360se.exe |
0x40A | 360ChromeX.exe のインスタンスを実行します。 |
0x40B | のインスタンスを実行します。 SogouExplorer.exe |
0x40C | 現在のウィンドウを閉じる |
0x40D | 指定したウィンドウを最小化します |
0x40E | ウィンドウをアクティブにし、最大化されたウィンドウとして表示します |
0x40F | ウィンドウのプロセスを強制終了します |
0x410 | クリップボードを設定します |
0x411 | クリップボードをクリアします |
スクリーンショット
マルウェアは、base64形式で埋め込まれた3番目と最後のPE DLLを反射的にロードします Capture.dll
、次の 5 エクスポート機能があります。
- キャプチャファーストスクリーン
- キャプチャネクストスクリーン
- GetBitmapInfo
- GetBitmapInfoSize
- セット品質
ライブラリは、最初に、CreateCompatibleDC
、 CreateCompatibleBitmap
、CreateDIBSection
などの一般的な Windows API を使用して画面キャプチャ構造を設定するDllEntryPoint
を反射的に読み込み、実行する resolvers_ResolveGetBitmapInfo
を呼び出すことによって初期化されます。 2 エクスポート機能CaptureFirstScreen
およびCaptureNextScreen
は、被害者のデスクトップのスクリーンショットをJPEG画像としてキャプチャするために使用されます。
観察
興味深いことに、元の .NET QUASAR サーバーは、同じ通信プロトコルを保持しているため、GOSAR サンプルからのビーコンの受信にも使用できます。ただし、運用上の使用には、GOSAR機能をサポートするために大幅な変更が必要になります。
著者がオープンソースの.NET QUASARサーバーを更新または拡張したのか、それともまったく新しいサーバーを開発したのかは不明です。言及する価値があるのは、デフォルトのリスニングポートである1080が、元の実装と一致していることです。
新機能
次の表に、新しく追加されたすべてのコマンドの説明を示します。
新しいコマンド | |
---|---|
ResolveDoRoboCopy (ロボコピーの解決) | ファイルをコピーするコマンドRoboCopy 実行します |
リゾルブ・ド・コンプレス・ファイル | ファイルをzip形式で圧縮する |
リゾルブ抽出ファイル | zip ファイルを抽出します |
リゾルブコピーファイル | 感染したマシン内のディレクトリまたはファイルをコピーします |
ResolveGetRunLogs (英語) | 利用可能なログを取得する |
リゾルブHVNCCコマンド | HVNCコマンドの実行 |
ResolveGetHVNCScreen | HVNCの開始 |
リゾルブストップHVNC | HVNCセッションの停止 |
ResolveDoHVNCKeyboardEvent | キーボードイベントをHVNCに送信する |
ResolveDoHVNCMouseEvent | マウスイベントをHVNCに送信する |
ResolveDoExecutePlugin | プラグインを実行する |
リゾルブGetProcesses | 実行中のプロセスの一覧を取得する |
ResolveDoProcessStart | プロセスの開始 |
リゾルブ・ドゥ・プロセス・エンド | プロセスを強制終了する |
リゾルブGetBitmapInfo | 現在の画面の表示設定の BITMAPINFO 構造体を取得します |
リゾルブGetMonitors | EnumDisplayMonitors APIによる被害者のディスプレイモニターの列挙 |
リゾルブゲットデスクトップ | 画面キャプチャ機能の開始 |
ResolveStopGetDesktop | 画面キャプチャ機能の停止 |
ResolveNewShellExecute | 生成されたcmd.exeプロセスへのパイプを開き、コマンドを送信します |
ResolveGetSchタスク | スケジュールされたタスクを取得するには、次のコマンドを実行します schtasks /query /fo list /v |
ResolveGetScreenshot | 被害者のデスクトップのスクリーンショットをキャプチャします |
リゾルブGetServices | WMI クエリを使用してサービスの一覧を取得します: select * from Win32_Service |
ResolveDoServiceOperation | サービスを開始または停止する |
ResolveDoDisableMultiLogon | キーの下の値 fSingleSessionPerUser を 1 に設定して、ユーザーによる複数のセッションを無効にします HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TerminalServer |
ResolveDoRestoreNLA | リモート デスクトップ プロトコル (RDP) のセキュリティ設定を復元し、 ネットワーク レベル認証 (NLA) を有効にし、 SSL/TLS 暗号化を適用して安全な通信を実現します。 |
ResolveGetRemoteClientInformation | 有効になっているすべてのローカル ユーザー、RDP プロパティと LAN IP、および OS 固有の情報の一覧を取得します: レジストリ キー HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion から抽出された DisplayVersion、SystemRoot、CurrentBuildNumber |
ResolveDoInstallWrapper | 非表示のリモートデスクトッププロトコル(HRDP)のセットアップ |
ResolveDoUninstallWrapper | HRDPのアンインストール |
ResolveDoRecoverPrivileges | HRDP のインストール中に変更が加えられる前の元の HKEY_LOCAL_MACHINE\\SAM\\SAM レジストリを復元します |
ResolveGetRemoteSessions | マシン上の RDP セッションに関する情報を取得します。 |
ResolveDoLogoffSession | WTSLogoffSession API を使用した RDP セッションのログオフ |
リゾルブGetSystemInfo | システム情報を取得する |
ResolveGetConnections | マシン内のすべての接続を取得する |
ResolveDoCloseConnection | 実装されていません |
マルウェアと MITRE ATT&CK
Elasticは、 MITRE ATT&CK フレームワークを使用して、脅威がエンタープライズネットワークに対して使用する一般的な戦術、手法、手順を文書化します。
戦術(Tactics)
戦術は、テクニックまたはサブテクニックの理由を表します。 それは敵の戦術的な目標であり、行動を実行する理由です。
手法
手法は、敵対者がアクションを実行することによって戦術的な目標を達成する方法を表します。
- ハイジャック実行フロー:DLLサイドローディング
- 入力キャプチャ: キーロギング
- プロセスインジェクション:非同期プロシージャコール
- プロセスディスカバリー
- アーティファクトを隠す:隠しウィンドウ
- システムプロセスの作成または変更:Windowsサービス
- 非標準ポート
- 昇格制御メカニズムの悪用:ユーザーアカウント制御のバイパス
- ファイルまたは情報の難読化
- 防御の障害:ツールの無効化または変更
- 仮想化/サンドボックス回避:時間ベースの回避
軽減REF3864
検知
- PowerShellによる潜在的なマルウェア対策スキャンインターフェイスのバイパス
- 通常とは異なる印刷スプーラーの子プロセス
- 通常とは異なるディレクトリからの実行 - コマンドライン
- 非ブラウザプロセスからの外部IPルックアップ
- 異常な親子関係
- DllHost 経由の異常なネットワーク接続
- サービスレジストリによる異常な永続化
- 親プロセスの PID スプーフィング
予防
- 通常とは異なる引数を持つプロセスによるネットワーク接続
- SVCHOSTとしてマスカレードする可能性
- ネットワークモジュールが疑わしいバックアップされていないメモリからロードされました
- ICMLuaUtil昇格COMインターフェイスによるUAC回避
- スプーフィングされた作成時間による潜在的な画像読み込み
ヤラ
Elasticセキュリティは、このアクティビティを識別するためのYARAルールを作成しました。
観測
この研究では、次の観測量が議論されました。
すぐれた監視性 | タイプ | 名前 | 参考 |
---|---|---|---|
opera-x[.]網 | ドメイン名 | ランディングページ | |
テレダウン-cn[.]コム | ドメイン名 | ランディングページ | |
15af8c34e25268b79022d3434aa4b823ad9d34f3efc6a8124ecf0276700ecc39 | SHA-256の | NetFxRepairTools.msi | MSI |
accd651f58dd3f7eaaa06df051e4c09d2edac67bb046a2dcb262aa6db4291de7 | SHA-256の | x64bridge.dll | サドブリッジ |
7964a9f1732911e9e9b9e05cd7e997b0e4e2e14709490a1b657673011bc54210 | SHA-256の | ゴサール | |
ferp.googledns[.]io | ドメイン名 | GOSAR C2サーバー | |
hk-dns.secssl[.]com | ドメイン名 | GOSAR C2サーバー | |
hk-dns.winsiked[.]com | ドメイン名 | GOSAR C2サーバー | |
hk-dns.wkossclsaleklddeff[.]is | ドメイン名 | GOSAR C2サーバー | |
hk-dns.wkossclsaleklddeff[.]io | ドメイン名 | GOSAR C2サーバー |
参照資料
上記の研究を通じて、以下のことが参照されました。
- https://zcgonvh.com/post/Advanced_Windows_Task_Scheduler_Playbook-Part.2_from_COM_to_UAC_bypass_and_get_SYSTEM_dirtectly.html
- https://www.sonicwall.com/blog/project-androm-backdoor-trojan
- https://www.safebreach.com/blog/process-injection-using-windows-thread-pools/
- https://gist.github.com/api0cradle/d4aaef39db0d845627d819b2b6b30512
付記
ハッシュ・アルゴリズム (SADBRIDGE)
def ror(x, n, max_bits=32) -> int:
"""Rotate right within a max bit limit, default 32-bit."""
n %= max_bits
return ((x >> n) | (x << (max_bits - n))) & (2**max_bits - 1)
def ror_13(data) -> int:
data = data.encode('ascii')
hash_value = 0
for byte in data:
hash_value = ror(hash_value, 13)
if byte >= 0x61:
byte -= 32 # Convert to uppercase
hash_value = (hash_value + byte) & 0xFFFFFFFF
return hash_value
def generate_hash(data, dll) -> int:
dll_hash = ror_13(dll)
result = (dll_hash + ror_13(data)) & 0xFFFFFFFF
return hex(result)
GOSARで確認したAV製品
360sd.exe | kswebshield.exe |
---|---|
360tray.exe | kvmonxp.exe |
a2guard.exe | kxetray.exe |
ad-watch.exe | mcshield.exe |
arcatasksservice.exe | mcshield.exe |
ashdisp.exe | miner.exe |
avcenter.exe | mongoosagui.exe |
avg.exe | mpmon.exe |
avgaurd.exe | msmpeng.exe |
avgwdsvc.exe | mssecess.exe |
avk.exe | nspupsvc.exe |
avp.exe | ntrtscan.exe |
avp.exe | patray.exe |
avwatchservice.exe | pccntmon.exe |
ayagent.aye | psafesystray.exe |
baidusdsvc.exe | qqpcrtp.exe |
bkavservice.exe | quhlpsvc.EXE |
ccapp.exe | ravmond.exe |
ccSetMgr.exe | remupd.exe |
ccsvchst.exe | rfwmain.exe |
cksoftshiedantivirus4.exe | rtvscan.exe |
cleaner8.exe | safedog.exe |
cmctrayicon.exe | savprogress.exe |
coranticontrolcenter32.exe | sbamsvc.exe |
cpf.exe | spidernt.exe |
egui.exe | spywareterminatorshield.exe |
f-prot.EXE | tmbmsrv.exe |
f-prot.exe | unthreat.exe |
f-secure.exe | usysdiag.exe |
fortitray.exe | v3svc.exe |
hipstray.exe | vba32lder.exe |
iptray.exe | vsmon.exe |
k7tsecurity.exe | vsserv.exe |
knsdtray.exe | wsctrl.exe |
kpfwtray.exe | yunsuo_agent_daemon.exe |
ksafe.exe | yunsuo_agent_service.exe |