保管庫の亡霊:Obsidianが悪用されPhantomPulse RATを配信
Detection stack
- AIDR
- Alert
- ETL
- Query
概要
Elastic Security Labsは、Obsidianのノート作成プラットフォームとそのコミュニティプラグインエコシステムを悪用する新しいソーシャルエンジニアリングキャンペーンを発見しました。これは、以前に文書化されていなかったRATであるPhantomPulseをWindowsとmacOSの両方のシステムにターゲットとして届けるものです。この運用は、LinkedInとTelegramを使用して、初期の餌として改ざんされたObsidianボールトを配布する方法で、金融および暗号通貨の分野の個人を対象にしているようです。Windowsでは、感染チェーンはPowerShell、PhantomPullと呼ばれるカスタムのメモリ内ローダー、およびリフレクティブローディング技術に依存しています。macOSでは、攻撃者はAppleScriptを使用し、Telegramベースのデッドドロップ指令および制御メカニズムを利用しています。このキャンペーンはまた、Ethereumのトランザクションデータを通じてブロックチェーンベースのC2ディスカバリーも取り入れています。
調査
研究者は、悪意のある実行を引き起こすためにShell CommandsおよびHiderプラグインを使用した武器化されたObsidianボールトを構築して攻撃を再現しました。分析中に、彼らはPowerShellスクリプトがローダーをダウンロードすることを観察しました。 syncobs.exe から 195.3.222.251、そしてそれにより暗号化されたペイロードを取得し、メモリ内にリフレクティブに読み込みました。ローダーはミューテックスを作成し、 panel.fefea22134.netでホストされているコントロールパネルと通信し、ブロックチェーンデータから導出されたフォールバックインフラストラクチャをサポートしました。macOSでは、マルウェアはLaunchAgent plistを通じて永続性を確立し、ハードコーディングされたドメインとTelegramチャンネルから二次的なAppleScriptペイロードをダウンロードしました。調査者は、両方の感染経路に関連するJSON設定ファイルとメモリリソースからキーアーティファクトを回収しました。
緩和
組織は、Obsidianが無認可の子プロセスを生成することを防ぎ、コミュニティプラグインの使用に厳しい制御を適用し、親プロセスとしてObsidianが表示されるPowerShell活動を監視するべきです。ネットワーク防御は、アウトバウンドトラフィックをブロックするべきです。 195.3.222.251 とドメイン panel.fefea22134.net, 0x666.info、およびキャンペーンに関連する既知のTelegramデッドドロップの場所です。 セキュリティチームはまた、リフレクティブロード、タイマーキューコールバックの濫用、およびマルウェアローダーによって使用される特定のミューテックス値の兆候を探すべきです。
対処
Obsidianからの疑わしい子プロセスが検出された場合は、影響を受けたホストを即座に隔離し、 .obsidian ディレクトリを収集して、悪意のあるプラグインファイルとボールトコンテンツのフォレンジックレビューを行います。ミューテックス hVNBUORXNiFLhYYhを検索し、エンドポイントをスキャンしてPHANTOMPULLローダーとPHANTOMPULSE RATバイナリの痕跡を探します。識別されたコマンドアンドコントロールインフラをブロックし、任意の侵害されたObsidian関連の認証情報を取り消し、金融および暗号通貨アカウントに関わる認証情報窃盗露出のより広範囲なレビューを行います。
攻撃フロー
検出
Powershellを介したダウンロードまたはアップロード(コマンドライン経由)
Proof of Value
疑わしいPowershell文字列 (コマンドライン経由)
Proof of Value
Invoke-RestMethod の疑わしい使用(powershell経由)
Proof of Value
疑わしいPowershell文字列 (powershell経由)
Proof of Value
Bits Transfer活動の可能性あり (powershell経由)
Proof of Value
Trycloudflareドメインとの疑わしい通信 (プロキシ経由)
Proof of Value
ファイルの直接IPダウンロードの疑わしい活動 (プロキシ経由)
Proof of Value
Trycloudflareドメインとの疑わしい通信 (DNS経由)
Proof of Value
Obsidianを悪用したコード実行と持続性 [Windowsプロセス生成]
Proof of Value
Obsidian を親プロセスとして持つ疑わしいPowerShell実行 [Windows PowerShell]
Proof of Value
シミュレーション実行
前提条件:テレメトリーとベースラインの事前チェックが通過している必要があります。
論理的根拠:このセクションでは、検出ルールをトリガーするために意図された敵技術の正確な実行を詳細に説明します。 コマンドとナラティブは、特定されたTTPsを直接反映し、検出ロジックによって期待される正確なテレメトリーを生成することを目的とする必要があります。 抽象的または無関係な例は、誤診につながるでしょう。
-
攻撃の物語とコマンド:
- 初期妥協: 攻撃者は悪意のあるObsidianプラグイン(
evil-plugin.js)をユーザーのObsidianプラグインディレクトリに挿入します。 - 実行トリガー: Obsidianが開始されると、プラグインはPowerShellのワンライナーを実行して
notepad.exeviaを起動します。これにより、ルールが監視する正確なプロセスチェーンが作成されます。プロセスチェーンが作成されます。process chain the rule watches. - 持続性: プラグインは毎回のObsidian起動時に自動ロードされるように設定されており、悪意のある子プロセスが再現されます。
- 回避: プラグインはまた、短時間
rundll32.exe(T1216.002)を呼び出して無害なDLLをロードし、真の意図を隠しつつ、検出トリガーチェーンを維持します。
- 初期妥協: 攻撃者は悪意のあるObsidianプラグイン(
-
回帰テストスクリプト:
# ------------------------------------------------- # 悪意のある Obsidian プラグインシミュレーション(PowerShell) # ------------------------------------------------- # 1. Obsidian が期待されるパスにインストールされていることを確認する $obsidianPath = "C:Program FilesObsidianObsidian.exe" if (-Not (Test-Path $obsidianPath)) { Write-Error "Obsidian not found at $obsidianPath" exit 1 } # 2. Obsidian を*親として*起動し、直ちに Notepad を生成する $startInfo = New-Object System.Diagnostics.ProcessStartInfo $startInfo.FileName = $obsidianPath $startInfo.Arguments = "-c `"Start-Process notepad.exe`"" $startInfo.UseShellExecute = $false $startInfo.CreateNoWindow = $true $proc = [System.Diagnostics.Process]::Start($startInfo) # 3. オプション: サインされたバイナリ (rundll32) を呼び出して T1216.002 をシミュレートする Start-Process -FilePath "C:WindowsSystem32rundll32.exe" -ArgumentList "shell32.dll,Control_RunDLL" -WindowStyle Hidden # 4. ログが生成されるまでに必要な間、スクリプトを一時停止する Start-Sleep -Seconds 5 # ------------------------------------------------- -
クリーンアップコマンド:
# テストで作成されたすべての異常なObsidianまたはNotepadインスタンスを終了する Get-Process -Name "Obsidian","notepad","rundll32" -ErrorAction SilentlyContinue | Stop-Process -Force # シミュレーションで作成された悪意のあるプラグインファイルを削除する(存在した場合) $pluginPath = "$env:APPDATAObsidianpluginsevil-plugin.js" if (Test-Path $pluginPath) { Remove-Item $pluginPath -Force } Write-Host "Cleanup complete."