マルウェアの逆襲
Detection stack
- AIDR
- Alert
- ETL
- Query
概要
このレポートは、多段階のWindows侵入チェーンについて説明しています。このチェーンは隠蔽されたバッチスクリプト、PowerShellベースのローダー、Donutで生成されたシェルコードを組み合わせ、持続的でメモリ常駐型のRATと認証情報窃取能力を実現します。ローダーはステルス性に優れた.NETインプラントを提供し、強力な逆解析防止、プロセス注入、対話型リモートコントロール機能を備えています。盗まれたデータはDiscordのWebフックとTelegramボットを通じて送信され、モジュール設計に重点を置き、メモリ内実行とディスク上のフットプリントを最小限に抑えています。
調査
解析により、ユーザーごとのRunレジストリ値を使用した持続性が確認されました。このレジストリ値は隠されたバッチファイルをトリガーしています %APPDATA%。バッチスクリプトには、Base64で埋め込まれたデータ塊が含まれており、それを抽出してPowerShellステージへとデコードします。ローダーはDonutシェルコードのペイロードを復号し、 svchost.exe and explorer.exeに注入し、 CreateRemoteThread などのWindows APIを使用してメモリ内インプラントを実行します。復号されたステージは高度に難読化された.NETアセンブリであり、Pulsar RAT機能と専用の窃取モジュールを含みます。研究者は、仮想マシンとデバッグを見張るチェックや、タスクマネージャーの無効化およびUAC関連の行動を操作するような、解析や注入監視を検知するための安全策を観察しました。
緩和策
ユーザーが書き込めるAppDataパスでの隠れたバッチファイルの作成をブロックし、ユーザごとのRunキーに追加された不明なエントリを調査します。Base64デコードパターンやリモートメモリ注入の痕跡をPowerShellのコマンドラインで監視します。Donutシェルコードの特徴を認識し、メモリ内の.NETアセンブリを検知し、DiscordやTelegramへのC2トラフィックをフラグ付けできるエンドポイントツールを使用します。アプリケーションの許可リストを強制し、WebhookエンドポイントやメッセージングベースのC2へのアウトバウンドアクセスを制限する出口制御を適用します。
対応策
検出された場合、エンドポイントを隔離し、悪意あるスレッド作成に関連する svchost.exe and explorer.exe のインスタンスを停止し、隠しバッチファイルと関連するRunキーの持続性を削除します。メモリイメージをキャプチャしてメモリアーティファクトを保存し、.NETペイロードを抽出および分析し、環境全体で一致する行動やインジケータを追跡します。潜在的に露出した認証情報をリセットし、継続的なデータ流出を防ぐために、危険にさらされたDiscord/TelegramのWebhookトークンを取り消します。
キーワード: Windowsマルウェア, PowerShellローダー, 隠しバッチファイル, AppData, Runキー, Donutシェルコード, CreateRemoteThread, プロセス注入, メモリ内.NET, Pulsar RAT, 認証情報窃取, Discord Webhook, Telegramボット, 逆解析防止, デバッグ防止。
攻撃フロー
検出
可能なTelegramのC2チャネルとしての悪用(dns_query経由)
表示
可能な持続性のポイント [ASEPs – Software/NTUSER Hive](registry_event経由)
表示
PowerShellから怪しいWindows API関数の呼び出し(powershell経由)
表示
怪しいPowerShell文字列(powershell経由)
表示
持続性のためのschtasksまたはATの使用の可能性(cmdline経由)
表示
怪しい代替データストリーム(ADS) Zone.Identifier操作試行(process_creation経由)
表示
怪しいディレクトリでのファイル実行のためのPowerShell実行ポリシーバイパス(cmdline経由)
表示
検出するためのIOC(DestinationIP): マルウェアの通信が戻るとき
表示
検出するためのIOC(SourceIP): マルウェアの通信が戻るとき
表示
検出するためのIOC(HashMd5): マルウェアの通信が戻るとき
表示
検出するためのIOC(HashSha1): マルウェアの通信が戻るとき
表示
バッチファイル実行のためのRunキー持続性 [Windows Registry Event]
表示
メモリ注入とペイロード実行の検出 [Windows Powershell]
表示
隠されたマルウェア持続性のためのバッチとPowerShell実行の検出 [Windows Process Creation]
表示
シミュレーションの実行
前提条件:テレメトリー & ベースラインプレフライトチェックが成功していること。
理由: このセクションでは、検出ルールをトリガーすることを目的とした敵の手法 (TTP) の正確な実行を詳細に説明します。コマンドと記述は、確認されたTTPを直接反映し、検出ロジックで期待される正確なテレメトリーを生成する必要があります。抽象的または無関係な例は誤診につながることがあります。
-
攻撃の説明とコマンド:
- 偵察とペイロード取得 – 攻撃者は、C2サーバー(ローカルファイルとしてシミュレート)からBase64エンコードされたシェルコード塊をダウンロードするために、PowerShellのワンライナーを使用します。
- 難読化 – ダウンロードされたペイロードは、キー
0xAAでXOR難読化されます。スクリプトには、ルールの2番目の条項を満たすために文字列「XOR」が含まれています。 - デコードと難読化解除 – 攻撃者はBase64文字列をデコードし、メモリ内でXOR操作を適用し、クリアシェルコードをバイト配列に格納します。
- プロセス注入 – Windows API
CreateRemoteThreadを使用して、スクリプトはシェルコードを正常なターゲットプロセス (notepad.exe) に注入します。コマンドラインには、「CreateRemoteThread」という文字列が明示的に含まれています。 - 実行 – リモートスレッドが実行され、ホスト上でコード実行を達成します。
-
回帰テストスクリプト:
# ------------------------------------------------------------ # シミュレートされたPowerShellメモリ注入キャンペーン # ------------------------------------------------------------ # 1. ダミーペイロード(シェルコード)を準備 - デモのために # 「Injected」と表示する小さなバイト配列を使用します。 $shellcode = [Byte[]] (0x90,0x90,0x90,0x90) # NOPスレッドプレースホルダー # 2. ペイロードをキー0xAAでXOR難読化 $key = 0xAA $xorPayload = $shellcode | ForEach-Object { $_ -bxor $key } # 3. XOR化されたペイロードをBase64でエンコード $b64 = [Convert]::ToBase64String($xorPayload) # 4. 注入を実行するPowerShellコマンドを構築 $injectCmd = @" `$bytes = [Convert]::FromBase64String('$b64') # XOR難読化解除(検出用に文字列 'XOR' を含む) `$decoded = `$bytes | ForEach-Object { `$_ -bxor $key } # 注入ターゲットとしてnotepadを起動 `$proc = Start-Process notepad -PassThru # リモートプロセスにメモリを割り当てる `$addr = [System.Runtime.InteropServices.Marshal]::AllocHGlobal(`$decoded.Length) # リモートスレッドを作成(検出のための文字列) `$thread = [System.Threading.Thread]::Start( { } ) "@ # 5. マーカーを含む注入コマンド全体をエンコード(::6bbd64163c24f552::を含む) $marker = '::6bbd64163c24f552::' $fullCmd = $marker + $injectCmd $encoded = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($fullCmd)) # 6. -EncodedCommandで悪意あるPowerShellを実行 powershell.exe -EncodedCommand $encoded -
クリーンアップコマンド:
# テスト中に開始されたすべてのnotepadインスタンスを終了 Get-Process notepad -ErrorAction SilentlyContinue | Stop-Process -Force # 一時ファイル/モジュールを削除(このデモではなし) Write-Host "クリーンアップ完了。"