OysterLoader解析:多段階型回避ローダーの内側
Detection stack
- AIDR
- Alert
- ETL
- Query
概要
OysterLoaderは、ランサムウェアやVidarのような一般的なマルウェアをデプロイするためのC++によるマルチステージローダーです。正当なソフトウェアインストーラーを偽装した侵害されたサイトを介して配布され、Microsoft Installer (MSI)として配信されます。分析を複雑にするために、API呼び出しの過剰発生、カスタム動的API解決、アンチデバッグチェック、カスタムLZMAデコンプレッションルーチンを使用します。ローダーは、HTTPS C2インフラストラクチャと段階的に通信し、難読化されたHTTPヘッダーと独自のBase64に似たエンコーディングを使用します。
調査
レポートでは、4つの段階について概説しています:パックされた難読化ツール (TextShell)、LZMAでコンテンツをインフレートするシェルコードレイヤー、環境チェックを行いミューテックスを作成するダウンローダー、DLLをドロップしスケジュールタスクをインストールする最終段階です。C2トラフィックは、ハードコードされたIP/ドメイン、カスタムユーザーエージェント、PNGアイコンを使用したステガノグラフィックなペイロード配信に依存します。持続性は、13分毎に実行されるように構成されたスケジュールタスクによって維持されます。
軽減策
信頼されていないソースからの署名されていないMSIインストーラーをブロックし、既知のミューテックスパターンの作成を監視します。スケジュールタスクの名前パターンと%APPDATA%からDLLをロードするためのrundll32.exeの使用を警告します。可能な場合は、ローダーが使用するカスタムHTTPヘッダーとユーザーエージェントを特定するため、TLSインスペクションを強制しましょう。
対応
検出された場合、ホストを隔離し、スケジュールタスクを終了し、ドロップされたCOPYING3.dllファイルを削除します。追加のペイロードを探索し、ミューテックス値に一致するプロセスを列挙し、リストされたC2ドメイン/IPをブロックし、APIの過剰発生動作とカスタムBase64エンコーディングに対する検出を更新します。
“グラフ TB %% クラス定義 classDef action fill:#99ccff classDef malware fill:#ffcc99 classDef process fill:#ffeb99 classDef persistence fill:#c2f0c2 classDef c2 fill:#d9b3ff %% ノード initial_access[“<b>初期アクセス</b> – <b>T1218.007 システムバイナリプロキシ実行: Msiexec</b><br/>侵害されたウェブサイト経由で配信された署名された悪意のあるMSI。”] class initial_access action process_msiexec[“<b>プロセス</b> – msiexec.exe<br/>悪意のあるMSIを実行”] class process_msiexec process stage1[“<b>ステージ 1</b> – パッカー/難読化器<br/><b>技術</b>: T1027 難読化ファイルまたは情報, T1027.007 動的API解決, T1614.001 システム言語発見, T1480.002 実行ガードレール: 相互排除, T1497.002 仮想化/サンドボックス回避: ユーザーアクティビティベースのチェック”] class stage1 malware stage2[“<b>ステージ 2</b> – シェルコード<br/><b>技術</b>: T1140 デコード/デコードファイル (RC4), LZMAデコンプレッション”] class stage2 malware stage3[“<b>ステージ 3</b> – ダウンローダ & C2<br/><b>技術</b>: T1102 ウェブサービス, T1001.003 プロトコルまたはサービスを偽装, T1001.002 ステガノグラフィー, T1102.001 デッドドロップリゾルバ”] class stage3 malware c2_server[“<b>C2</b> – HTTPSサーバー<br/>カスタムヘッダーと偽のユーザーエージェント”] class c2_server c2 dll_payload[“<b>マルウェア</b> – ドロップされたDLL<br/>%APPDATA%に保存”] class dll_payload malware process_rundll32[“<b>プロセス</b> – rundll32.exe<br/>DllRegisterServer経由でDLLを実行”] class process_rundll32 process task_schtasks[“<b>持続性</b> – 予定タスク<br/>ドロップされたDLLでrundll32を実行”] class task_schtasks persistence stage4[“<b>ステージ 4</b> – 持続性 & 実行<br/><b>技術</b>: T1546.009 イベントトリガー実行: AppCert DLLs, T1027.003 ステガノグラフィー, T1102.002 双方向通信”] class stage4 malware %% コネクション initial_access u002du002d>|実行| process_msiexec process_msiexec u002du002d>|配信| stage1 stage1 u002du002d>|生成| stage2 stage2 u002du002d>|ダウンロード| stage3 stage3 u002du002d>|通信相手| c2_server c2_server u002du002d>|ペイロード提供| stage3 stage3 u002du002d>|書き込み| dll_payload dll_payload u002du002d>|使用| process_rundll32 process_rundll32 u002du002d>|トリガ| task_schtasks task_schtasks u002du002d>|スケジュール| stage4 “
攻撃フロー
検出
Schtasksが不審なディレクトリ/バイナリ/スクリプトを指す(cmdline経由)
表示する
Rundll32 Dll 不審なパス実行(process_creation経由)
表示する
IOC(SourceIP)を検出する: OysterLoader Unmasked: マルチステージ回避ローダー
表示する
IOC(DestinationIP)を検出する: OysterLoader Unmasked: マルチステージ回避ローダー
表示する
OysterLoader C2通信検出 [Windows ネットワーク接続]
表示する
OysterLoaderのアンチ分析および実行技術の検出 [Windowsプロセス作成]
表示する
シミュレーション実行
前提条件: テレメトリー&ベースラインプレフライトチェックが合格している必要があります。
根拠: このセクションは、検出ルールをトリガーするために設計された敵対者技術(TTP)の正確な実行を詳細に説明します。コマンドおよび説明は、特定されたTTPを直接反映する必要があり、検出ロジックが期待する正確なテレメトリーを生成することを目的としています。抽象的または無関係な例は誤診につながります。
-
攻撃の説明 & コマンド:
エンドポイントへの初期の足場を得た敵対者は、OysterLoaderペイロードをデプロイします。- Rundll32を使用したDLL登録 – ローダーは、悪意のあるDLL(
COPYING3.dll)を一時ディレクトリにコピーし、rundll32.exeを使用して、DllRegisterServerエントリポイントを使用して登録し、選択1. - アンチデバッグチェック – 分析を回避するために、ペイロードは
ntdll.dllをロードし、IsDebuggerPresentを呼び出します。これにより、プロセスレコードが生成され、イメージに含まれ、コマンドラインにntdll.dllが含まれ、IsDebuggerPresentを満たします選択2. - メモリアロケーション – メモリ内実行のために、ローダーは
NtAllocateVirtualMemoryviantdll.dllを呼び出します。これにより、プロセス作成イベントが生成され、コマンドラインにNtAllocateVirtualMemoryが含まれ、選択3.
- Rundll32を使用したDLL登録 – ローダーは、悪意のあるDLL(
-
回帰テストスクリプト:
# OysterLoader検出検証スクリプト – PowerShell # ---------------------------------------------------- # 1. ダミーの悪意のあるDLL(シミュレーション用の空ファイル)を作成 $dllPath = "$env:TEMPCOPYING3.dll" New-Item -Path $dllPath -ItemType File -Force | Out-Null # 2. 選択1をトリガ – rundll32でDllRegisterServerを使用 Write-Host "選択1の実行 (rundll32 DLL登録)..." Start-Process -FilePath "rundll32.exe" -ArgumentList "`"$dllPath`" DllRegisterServer" -NoNewWindow # 3. 選択2をトリガ – ntdllでIsDebuggerPresentを使用 Write-Host "選択2の実行 (IsDebuggerPresent)..." $scriptBlock = { Add-Type -MemberDefinition @" [DllImport("ntdll.dll", SetLastError = true)] public static extern bool IsDebuggerPresent(); "@ -Namespace WinAPI -Name NativeMethods [WinAPI.NativeMethods]::IsDebuggerPresent() | Out-Null } Start-Job -ScriptBlock $scriptBlock | Wait-Job | Receive-Job # 4. 選択3をトリガ – ntdllでNtAllocateVirtualMemoryを使用 Write-Host "選択3の実行 (NtAllocateVirtualMemory)..." $scriptBlock2 = { Add-Type -MemberDefinition @" [DllImport("ntdll.dll", SetLastError = true)] public static extern int NtAllocateVirtualMemory( IntPtr ProcessHandle, ref IntPtr BaseAddress, IntPtr ZeroBits, ref UIntPtr RegionSize, uint AllocationType, uint Protect); "@ -Namespace WinAPI -Name NativeMethods $process = [System.Diagnostics.Process]::GetCurrentProcess() $handle = $process.Handle $base = [IntPtr]::Zero $size = [UIntPtr]::Zero [WinAPI.NativeMethods]::NtAllocateVirtualMemory($handle, [ref]$base, [IntPtr]::Zero, [ref]$size, 0x1000, 0x04) | Out-Null } Start-Job -ScriptBlock $scriptBlock2 | Wait-Job | Receive-Job # クリーンアップ Remove-Item -Path $dllPath -Force Write-Host "シミュレーション完了。" -
クリーンアップコマンド:
# 余分なrundll32またはジョブプロセスが残っていないか確認し、終了 Get-Process -Name "rundll32" -ErrorAction SilentlyContinue | Stop-Process -Force Get-Job | Remove-Job -Force # 一時DLLがまだ存在する場合、削除 $tempDll = "$env:TEMPCOPYING3.dll" if (Test-Path $tempDll) { Remove-Item $tempDll -Force }