MedusaHVNCは隠れたデスクトップを通じてライブWindowsセッションを盗みます
Detection stack
- AIDR
- Alert
- ETL
- Query
概要
MedusaHVNCは、新たに発見されたリモートアクセス型トロイの木馬(RAT)で、マルウェア・アズ・ア・サービス(MaaS)モデルを通じて配布されます。隠された仮想ネットワークコンピューティング(HVNC)モジュールを使用して、別の見えないWindowsデスクトップセッションを作成します。これにより、攻撃者はアクティブなブラウザセッション、クッキーや認証されたセッション状態を被害者に気づかれずに乗っ取ることができます。
調査
研究者はMedusaHVNCのサンプルを分析し、難読化されたJScriptランチャーから始まる5段階の感染チェーンを発見しました。調査の結果、AutoItが復号化に使用され、正規のWindowsキャラクターマップユーティリティ(charmap.exe)へのプロセスインジェクションに使用されていることが示されました。最終ペイロードはChaCha20暗号化に依存し、カスタムTCPプロトコルを介してハードコーディングされたC2サーバーと通信します。
緩和策
効果的な緩和には、既知のC2インフラストラクチャのブロックと、異常なアウトバウンドネットワーク接続のためのエンドポイントの監視が含まれます。組織は、送信元のプロセスに関係なく送信トラフィックを検査できるデータ流出防止コントロールを展開するべきです。正規のシステムバイナリを含む、疑わしい子プロセスやインジェクション活動を監視することも検出を改善します。 charmap.exe 検出の向上に役立ちます。
対応
MedusaHVNC活動が検出された場合、セキュリティチームは直ちに影響を受けたエンドポイントを隔離し、C2サーバーとの通信を終了させるべきです。調査者は、JScriptランチャーの初期配信パスを特定し、スタートアップフォルダにペルシステンスメカニズムがないか確認するべきです。また、セッションと認証ログを見直し、侵害ウィンドウ中の不正な活動がないか確認するべきです。
攻撃フロー
検出
LOLBAS WScript / CScript(プロセス作成経由)
Proof of Value
自動起動場所の疑わしいバイナリ/スクリプト(ファイルイベント経由)
Proof of Value
検出すべきIOC(ソースIP):MedusaHVNC:ライブWindowsセッションを盗む隠されたデスクトップ
Proof of Value
検出すべきIOC(宛先IP):MedusaHVNC:ライブWindowsセッションを盗む隠されたデスクトップ
Proof of Value
MedusaHVNC C2通信の検出 [Windowsネットワーク接続]
Proof of Value
MedusaHVNC感染チェーンでのJScriptランチャーとAutoItインタープリタの検出 [Windowsプロセス作成]
Proof of Value
シミュレーション実行
前提条件:テレメトリー&ベースラインプレフライトチェックが合格していること。
根拠:このセクションでは、検出ルールを引き起こすよう設計された敵技術(TTP)の正確な実行を詳細に説明します。コマンドとナラティブは、特定されたTTPを直接反映し、検出ロジックによって想定される正確なテレメトリーを生成することを目的としています。抽象的または無関係な例は誤診につながります。
-
攻撃のナラティブ&コマンド: 攻撃者は被害者のワークステーションにMedusaHVNCを正常に展開しました。コマンドアンドコントロール(C2)を確立し、リモートデスクトップの操作を開始するため、マルウェアはそのハードコードされたリスナーに接続しようとします。このシミュレーションでは、ポート4444でローカルリスナーへの接続を強制することにより、この動作を模倣します。このアクションは、MedusaHVNCライフサイクルの「フォーンホーム」フェーズをシミュレートし、
宛先ポート:4444. -
リグレッションテストスクリプト:
# シミュレーションスクリプト:MedusaHVNC C2通信エミュレーション # 目的:Sigmaルールをトリガーするためにポート4444でネットワーク接続イベントを生成する。 $TargetIP = "127.0.0.1" $TargetPort = 4444 Write-Host "[+] MedusaHVNC C2シミュレーションを開始..." -ForegroundColor Cyan # ステップ1:接続をキャッチするローカルリスナーを作成(C2サーバーをシミュレート) $Listener = New-Object System.Net.Sockets.TcpListener([System.Net.IPAddress]::Loopback, $TargetPort) $Listener.Start() Write-Host "[+] ローカルC2リスナーが$TargetIP:$TargetPortで開始されました" -ForegroundColor Green try { # ステップ2:マルウェアのアウトバウンド接続をエミュレート Write-Host "[+] C2へのアウトバウンド接続をエミュレート中..." -ForegroundColor Yellow $Client = New-Object System.Net.Sockets.TcpClient $Client.Connect($TargetIP, $TargetPort) Write-Host "[!] 成功:接続が確立されました。SIEMでアラートを確認してください。" -ForegroundColor Red } catch { Write-Host "[-] 接続に失敗しました:$($_.Exception.Message)" -ForegroundColor Red } finally { # 接続のクリーンアップ if ($Client) { $Client.Close() } $Listener.Stop() Write-Host "[+] シミュレーションクリーンアップ完了。" -ForegroundColor Cyan } -
クリーンアップコマンド:
# 残存するプロセスやリスナーが存在しないことを確認する Stop-Process -Name "powershell" -Force -ErrorAction SilentlyContinue # (注意:実際の環境では、手動でポート4444が閉じられていることを確認) Test-NetConnection -ComputerName 127.0.0.1 -Port 4444