マルウェアの逆襲
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ボット, 逆解析防止, デバッグ防止。
graph TB %% Class Definitions classDef action fill:#99ccff classDef file fill:#ccffcc classDef process fill:#ffeb99 classDef malware fill:#ff9999 classDef operator fill:#ff9900 %% Nodes – Files and Registry logon_script_file[“<b>ファイル</b>: 0a1a98b5f9fc7c62.bat<br/><b>場所</b>: %APPDATA%\\Microsoft\\…”] class logon_script_file file run_key[“<b>レジストリ</b>: HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\bada287ebf”] class run_key file %% Nodes – Techniques (Actions) persistence_run[“<b>技術</b> – T1037.001 起動またはログオン初期化スクリプト<br/><b>説明</b>: %APPDATA% に配置された隠しバッチファイルを Run キーに登録し、永続化を実現する。”] class persistence_run action powershell_interpreter[“<b>技術</b> – T1059.001 コマンドおよびスクリプトインタープリタ: PowerShell<br/><b>説明</b>: ポリシーをバイパスしてデコードされた PowerShell スクリプトを実行する。”] class powershell_interpreter action obfuscation[“<b>技術</b> – T1027 難読化されたファイルまたは情報<br/><b>説明</b>: XOR で暗号化されたバイト配列と配信後コンパイルのロジック。”] class obfuscation action deobfuscate[“<b>技術</b> – T1140 ファイルまたは情報の復号・デコード<br/><b>説明</b>: Base64 および XOR によりシェルコードを生成する。”] class deobfuscate action reflective_loading[“<b>技術</b> – T1620 リフレクティブコードロード<br/><b>説明</b>: 対象プロセスにメモリを割り当て、シェルコードを書き込む。”] class reflective_loading action process_injection[“<b>技術</b> – T1055.002 プロセスインジェクション: ポータブル実行ファイルインジェクション<br/><b>説明</b>: CreateRemoteThread を使用して svchost.exe および explorer.exe にシェルコードを注入する。”] class process_injection action sandbox_evasion[“<b>技術</b> – T1497 仮想化/サンドボックス回避<br/><b>説明</b>: 実行前に仮想マシンおよびサンドボックス環境を検査する。”] class sandbox_evasion action indirect_cmd[“<b>技術</b> – T1202 間接的コマンド実行<br/><b>説明</b>: C2 を通じてタスクマネージャーおよびユーザーアカウント制御を有効化/無効化する。”] class indirect_cmd action uac_bypass[“<b>技術</b> – T1548.002 昇格制御メカニズムの悪用: ユーザーアカウント制御のバイパス<br/><b>説明</b>: ユーザーアカウント制御およびセキュリティ UI を無効化する。”] class uac_bypass action scheduled_task[“<b>技術</b> – T1053 スケジュールされたタスク/ジョブ<br/><b>説明</b>: ログオン時にペイロードを実行する schtasks.exe タスクを作成する。”] class scheduled_task action autostart[“<b>技術</b> – T1547 起動またはログオン自動実行<br/><b>説明</b>: Run キーとスケジュールタスクによる二重の永続化。”] class autostart action cred_from_browser[“<b>技術</b> – T1555.003 Web ブラウザからの認証情報<br/><b>説明</b>: 保存された認証情報を取得する。”] class cred_from_browser action alternate_auth[“<b>技術</b> – T1550.004 代替認証マテリアルの使用: Web セッションクッキー<br/><b>説明</b>: セッションクッキーおよびトークンを抽出する。”] class alternate_auth action archive_data[“<b>技術</b> – T1560.002 収集データのアーカイブ: ライブラリ経由のアーカイブ<br/><b>説明</b>: 収集した認証情報をメモリ内で圧縮する。”] class archive_data action compression[“<b>技術</b> – T1027.015 圧縮<br/><b>説明</b>: 送信前にデータを ZIP に圧縮する。”] class compression action exfil_webhook[“<b>技術</b> – T1567.004 Webhook 経由の情報流出<br/><b>説明</b>: ZIP アーカイブを Discord Webhook および Telegram ボットへ送信する。”] class exfil_webhook action web_service[“<b>技術</b> – T1102.003 Web サービス: 一方向通信<br/><b>説明</b>: Discord および Telegram への HTTPS 通信を使用する。”] class web_service action compile_after_delivery[“<b>技術</b> – T1027.004 配信後コンパイル<br/><b>説明</b>: インジェクションのために C# 相互運用コードを実行時にコンパイルする。”] class compile_after_delivery action stripped_payload[“<b>技術</b> – T1027.008 ストリップされたペイロード<br/><b>説明</b>: メタデータを除去した最終 .NET アセンブリ。”] class stripped_payload action embedded_payload[“<b>技術</b> – T1027.009 埋め込みペイロード<br/><b>説明</b>: Donut シェルコードが .NET ペイロードを埋め込む。”] class embedded_payload action %% Nodes – Files Produced ps_script_file[“<b>ファイル</b>: ps_7b948266.ps1<br/><b>内容</b>: Base64 ペイロードをデコードして実行する。”] class ps_script_file file donut_shellcode[“<b>ファイル</b>: decoded.bin<br/><b>種類</b>: Donut により生成されたシェルコード”] class donut_shellcode file %% Nodes – Processes svchost_process[“<b>プロセス</b>: svchost.exe”] class svchost_process process explorer_process[“<b>プロセス</b>: explorer.exe”] class explorer_process process %% Nodes – Malware credential_stealer[“<b>マルウェア</b>: .NET スティーラー<br/><b>説明</b>: ブラウザからパスワード、クッキー、トークンを抽出する。”] class credential_stealer malware %% Connections – Attack Flow logon_script_file –>|登録先| run_key run_key –>|有効化| persistence_run persistence_run –>|実行| powershell_interpreter powershell_interpreter –>|実行| ps_script_file ps_script_file –>|含む| obfuscation obfuscation –>|必要| deobfuscate deobfuscate –>|生成| donut_shellcode donut_shellcode –>|ロード元| reflective_loading reflective_loading –>|書き込み先| svchost_process svchost_process –>|インジェクション経由| process_injection process_injection –>|対象| explorer_process process_injection –>|使用| compile_after_delivery process_injection –>|使用| embedded_payload explorer_process –>|実行| credential_stealer credential_stealer –>|抽出| cred_from_browser credential_stealer –>|抽出| alternate_auth cred_from_browser –>|収集データ| archive_data archive_data –>|圧縮者| compression compression –>|送信手段| exfil_webhook exfil_webhook –>|使用| web_service sandbox_evasion –>|事前確認| powershell_interpreter indirect_cmd –>|制御| uac_bypass scheduled_task –>|代替永続化| autostart autostart –>|保証| persistence_run
攻撃フロー
検出
可能な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 "クリーンアップ完了。"