SOC Prime Bias: 中程度

20 May 2026 22:01 UTC

ファントムステイラーの分析: 二層攻撃チェーンの内部

Author Photo
SOC Prime Team linkedin icon フォローする
ファントムステイラーの分析: 二層攻撃チェーンの内部
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

概要

Phantom Stealerは、悪意のある pdh.dll を用いたローダーで始まり、その後 jsc.exeに注入された.NETペイロードで終わる、二段階のWindows情報窃取マルウェアです。ローダーはDLLハイジャッキング、プロセスホローイング、ネイティブAOTコンパイルを使用して検出の可能性を減らします。活動を開始すると、第二段階のペイロードが資格情報、ブラウザーデータ、暗号通貨ウォレットの情報、クリップボードの内容などの機密データを盗み盗者が制御する値に置き換えることができます。このマルウェアは商業犯罪ウェアとして提供されており、現在も活動中の攻撃で使用されています。

調査

研究者は、ローダーが自身をコピーして %APPDATA%MicrosoftRasManagementMpDlpService.exe に保存し、持続性を維持するためにRunキーを作成することを発見しました。その後、二重RC4で暗号化されたペイロードを復号し、サスペンドされた jsc.exe プロセスに注入し、データ盗難を開始する前に複数の分析対策を行います。内側の.NETスティーラーは、Chrome 127+アプリバインディング暗号化をバイパスし、偽装ドメインを使用してSMTPを通じて盗まれた情報を送信します。異なるスレッドが暗号クリッピングとキーロギング機能を処理します。

緩和策

防御者は、非システムパスからの予期しない pdh.dll のロードを監視し、DLLハイジャッキングリスクを軽減する制御を施行する必要があります。セキュリティチームはまた、 %APPDATA%MicrosoftRasManagement に配置された見慣れない実行ファイルを検出し、 RasManSvc Runキーを監視します。行動ベースの検出は、 jsc.exeに関係するプロセスホローイングに焦点を合わせるべきです。一方、ネットワーク監視は特定されたコマンド・アンド・コントロールドメインへの疑わしい接続を警告としてフラグすべきです。未承認のアプリケーションによるクリップボードアクセスに対する厳しい制御やブラウザーの資格情報ストレージの追加強化により、さらなる露出を低減できます。

対応

RasManagementディレクトリ内に MpDlpService.exe を作成した場合や関連するRunレジストリキーに変更があった場合にアラートを上げます。注入されたコードの兆候を示す jsc.exe プロセスを調査し、悪意のある活動を即座に停止します。関連する侵害指標を収集し、関連ファイルを隔離し、公開された資格情報やウォレットデータが何であったかを判断するためにフォレンジック分析を実施します。影響を受けたアカウントをリセットし、必要に応じて影響を受けたユーザーに通知します。

graph TB classDef technique fill:#ffcc99 classDef file fill:#c2f0c2 classDef process fill:#add8e6 classDef action fill:#ffd699 step1_ext[“<b>テクニック</b> – <b>T1176 ソフトウェア拡張</b><br/><b>説明</b>: pdh.dllを正規アプリと同じフォルダに配置し実行させる。”] class step1_ext technique step1_masq[“<b>テクニック</b> – <b>T1036.005 既存リソース偽装</b>”] class step1_masq technique step1_dynapi[“<b>テクニック</b> – <b>T1027.007 動的API解決</b>”] class step1_dynapi technique file_dll[“<b>ファイル</b> – pdh.dll (悪性)”] class file_dll file step1_ext –>|使用| step1_masq step1_ext –>|使用| step1_dynapi step1_ext –>|配置| file_dll file_dll –>|読み込まれる| step1_ext step2_compromise[“<b>テクニック</b> – <b>T1554 ホストバイナリ改変</b>”] class step2_compromise technique step2_activeSetup[“<b>テクニック</b> – <b>T1547.014 Active Setup</b>”] class step2_activeSetup technique step2_runkey[“<b>テクニック</b> – <b>T1547.001 レジストリRunキー</b>”] class step2_runkey technique file_loader[“<b>ファイル</b> – MpDlpService.exe”] class file_loader file step1_ext –>|移行| step2_compromise step2_compromise –>|有効化| step2_activeSetup step2_activeSetup –>|作成| file_loader file_loader –>|登録| step2_runkey step3_evasion[“<b>テクニック</b> – <b>T1497.002 サンドボックス回避</b>”] class step3_evasion technique step3_queryReg[“<b>テクニック</b> – <b>T1012 レジストリ照会</b>”] class step3_queryReg technique step2_compromise –>|トリガー| step3_evasion step3_evasion –>|使用| step3_queryReg step4_hollow[“<b>テクニック</b> – <b>T1055.012 プロセスホロウイング</b>”] class step4_hollow technique step4_threadHijack[“<b>テクニック</b> – <b>T1055.003 スレッドハイジャック</b>”] class step4_threadHijack technique process_jsc[“<b>プロセス</b> – jsc.exe”] class process_jsc process process_mal[“<b>プロセス</b> – .NETペイロード”] class process_mal process step3_evasion –>|移行| step4_hollow step4_hollow –>|作成| process_jsc step4_hollow –>|メモリ置換| process_jsc process_jsc –>|ホスト| process_mal step4_hollow –>|使用| step4_threadHijack step5_browserDisc[“<b>テクニック</b> – <b>T1217 ブラウザ検出</b>”] class step5_browserDisc technique step5_credWeb[“<b>テクニック</b> – <b>T1555.003 ブラウザ認証情報</b>”] class step5_credWeb technique step5_privateKey[“<b>テクニック</b> – <b>T1552.004 秘密鍵</b>”] class step5_privateKey technique step4_hollow –>|移行| step5_browserDisc step5_browserDisc –>|有効化| step5_credWeb step5_credWeb –>|追加| step5_privateKey step6_keylog[“<b>テクニック</b> – <b>T1056.001 キーロギング</b>”] class step6_keylog technique step5_credWeb –>|有効化| step6_keylog step7_screen[“<b>テクニック</b> – <b>T1113 画面キャプチャ</b>”] class step7_screen technique step6_keylog –>|移行| step7_screen step8_clipboard[“<b>テクニック</b> – <b>T1115 クリップボード</b>”] class step8_clipboard technique step7_screen –>|移行| step8_clipboard step9_emailCollect[“<b>テクニック</b> – <b>T1114 メール収集</b>”] class step9_emailCollect technique step9_identity[“<b>テクニック</b> – <b>T1589.002 メール識別情報</b>”] class step9_identity technique step9_exfil[“<b>テクニック</b> – <b>T1048.003 SMTP流出</b>”] class step9_exfil technique step8_clipboard –>|移行| step9_emailCollect step9_emailCollect –>|含む| step9_identity step9_identity –>|流出| step9_exfil step10_reflective[“<b>テクニック</b> – <b>T1620 リフレクティブローディング</b>”] class step10_reflective technique step9_exfil –>|トリガー| step10_reflective

攻撃フロー

シミュレーション実行

前提条件:テレメトリーおよびベースラインプレフライトチェックが合格していること。

理由:このセクションは、検出ルールをトリガーするために設計されたいじくり出した手法(TTP)の正確な実行を詳述しています。コマンドと説明は、特定されたTTPを直接反映し、検出ロジックによって期待される正確なテレメトリーを生成することを目的としています。

  • 攻撃の説明とコマンド:
    攻撃者は最初に悪意のあるペイロード(例えば、リバースシェルDLL)を盗み、ユーザーの中に保存します %APPDATA% ディレクトリ。攻撃者は、ホローイングホストとして使用して、新しいプロセスを作成し、ペイロードを挿入して実行を再開します。 jsc.exe T1055.012 T1055.012 and T1055.003.
    持続性を確保するために、攻撃者は悪意のあるDLLを %APPDATA%MicrosoftRasManagementMpDlpService.exe にコピーし、ログオン時に実行されるサービスとして登録し、正当なサービス名を悪用します(T1620).

  • 回帰テストスクリプト:

    # ---------------------------------------------------------
    # シミュレートされた敵のスクリプト – プロセスホローイング + 永続性
    # ---------------------------------------------------------
    
    # 変数
    $appData = "$env:APPDATAMicrosoftRasManagement"
    $loaderPath = Join-Path $appData "MpDlpService.exe"
    $maliciousDll = "$env:TMPmalicious.dll"   # ペイロードのプレースホルダ
    
    # 1. 永続性ディレクトリを準備
    New-Item -Path $appData -ItemType Directory -Force | Out-Null
    
    # 2. ダミーの悪意のあるDLLをドロップ(シミュレートされたペイロード)
    #    実際の攻撃ではこれはコンパイルされたペイロードです。ここではゼロバイトファイルを作成します。
    New-Item -Path $maliciousDll -ItemType File -Force | Out-Null
    
    # 3. DLLを偽装されたサービスロケーションにコピー
    Copy-Item -Path $maliciousDll -Destination $loaderPath -Force
    
    # 4. コピーされたファイルにポイントする一時サービスを登録(管理者権限が必要)
    $svcName = "MpDlpService"
    sc.exe create $svcName binPath= "`"$loaderPath`"" DisplayName= "Microsoft Ras Management Service" start= auto | Out-Null
    
    # 5. サービスを開始(MpDlpService.exeの実行をトリガー)
    sc.exe start $svcName | Out-Null
    
    # 6. フォローリングするホストとしてjsc.exeを使用したプロセスホローイングを実行
    #    jsc.exeをサスペンド状態で起動し、ダミーのペイロードでそのメモリを置き換え、
    #    次に再開します。これはPowerSploitからInvoke-ProcessHollowing関数を使用します。
    function Invoke-ProcessHollowing {
        param(
            [string]$HostPath,
            [string]$PayloadPath
        )
        # .NET APIをロード
        Add-Type @"
    using System;
    using System.Diagnostics;
    using System.Runtime.InteropServices;
    public class Hollow {
      [DllImport("kernel32.dll")] public static extern bool CreateProcess(string appName, string cmdLine,
          IntPtr procSec, IntPtr threadSec, bool inherit, uint flags,
          IntPtr env, string cwd, ref STARTUPINFO si, out PROCESS_INFORMATION pi);
      [StructLayout(LayoutKind.Sequential)] public struct STARTUPINFO {
          public int cb; public string lpReserved; public string lpDesktop; public string lpTitle;
          public uint dwX; public uint dwY; public uint dwXSize; public uint dwYSize; public uint dwXCountChars;
          public uint dwYCountChars; public uint dwFillAttribute; public uint dwFlags; public short wShowWindow;
          public short cbReserved2; public IntPtr lpReserved2; public IntPtr hStdInput; public IntPtr hStdOutput;
          public IntPtr hStdError;
      }
      [StructLayout(LayoutKind.Sequential)] public struct PROCESS_INFORMATION {
          public IntPtr hProcess; public IntPtr hThread; public uint dwProcessId; public uint dwThreadId;
      }
    "@
        # サスペンド状態のプロセスを作成
        $si = New-Object Hollow+STARTUPINFO
        $pi = New-Object Hollow+PROCESS_INFORMATION
        $si.cb = [Runtime.InteropServices.Marshal]::SizeOf($si)
        $CREATE_SUSPENDED = 0x00000004
        $ok = [Hollow]::CreateProcess($null, "`"$HostPath`"", [IntPtr]::Zero, [IntPtr]::Zero, $false,
            $CREATE_SUSPENDED, [IntPtr]::Zero, $null, [ref]$si, [ref]$pi)
        if (-not $ok) { Write-Error "Failed to create suspended process" ; return }
    
        # (ペイロード挿入ステップは省略 – 実際の手法のプレースホルダ)
        # スレッドを再開
        $RESUME_THREAD = 0x00000001
        [System.Runtime.InteropServices.Marshal]::WriteInt32($pi.hThread, 0, $RESUME_THREAD) | Out-Null
    }
    
    # ホストとしてリアルなjsc.exeを使用してフォローリングを実行
    $jscPath = "$env:SystemRootSystem32jsc.exe"
    Invoke-ProcessHollowing -HostPath $jscPath -PayloadPath $maliciousDll
    
    # ---------------------------------------------------------
    # シミュレーション終了
    # ---------------------------------------------------------
  • クリーンアップコマンド:

    # 一時サービスを停止して削除
    sc.exe stop MpDlpService | Out-Null
    sc.exe delete MpDlpService | Out-Null
    
    # ローダーとダミーペイロードを削除
    Remove-Item -Path "$env:APPDATAMicrosoftRasManagementMpDlpService.exe" -Force -ErrorAction SilentlyContinue
    Remove-Item -Path "$env:TMPmalicious.dll" -Force -ErrorAction SilentlyContinue
    
    # オプション:テストによって開始された残存jsc.exeプロセスを終了
    Get-Process -Name jsc -ErrorAction SilentlyContinue | Stop-Process -Force