SOC Prime Bias:

13 2月 2026 17:05

OysterLoader解析:多段階型回避ローダーの内側

Author Photo
Ruslan Mikhalov SOC Primeの脅威リサーチ責任者 linkedin icon フォローする
OysterLoader解析:多段階型回避ローダーの内側
shield icon

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 “

攻撃フロー

シミュレーション実行

前提条件: テレメトリー&ベースラインプレフライトチェックが合格している必要があります。

根拠: このセクションは、検出ルールをトリガーするために設計された敵対者技術(TTP)の正確な実行を詳細に説明します。コマンドおよび説明は、特定されたTTPを直接反映する必要があり、検出ロジックが期待する正確なテレメトリーを生成することを目的としています。抽象的または無関係な例は誤診につながります。

  • 攻撃の説明 & コマンド:
    エンドポイントへの初期の足場を得た敵対者は、OysterLoaderペイロードをデプロイします。

    1. Rundll32を使用したDLL登録 – ローダーは、悪意のあるDLL(COPYING3.dll)を一時ディレクトリにコピーし、 rundll32.exe を使用して、 DllRegisterServer エントリポイントを使用して登録し、 選択1.
    2. アンチデバッグチェック – 分析を回避するために、ペイロードは ntdll.dll をロードし、 IsDebuggerPresentを呼び出します。これにより、プロセスレコードが生成され、 イメージ に含まれ、コマンドラインに ntdll.dll が含まれ、 IsDebuggerPresentを満たします 選択2.
    3. メモリアロケーション – メモリ内実行のために、ローダーは NtAllocateVirtualMemory via ntdll.dllを呼び出します。これにより、プロセス作成イベントが生成され、コマンドラインに NtAllocateVirtualMemory が含まれ、 選択3.
  • 回帰テストスクリプト:

    # 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 }