SOC Prime Bias:

29 Jun 2026 06:42 UTC

ホスピタリティ業界を狙ったPhoto ZIPキャンペーン、Node.jsプラントを届ける永続的なアクセス

Author Photo
SOC Prime Team linkedin icon フォローする
ホスピタリティ業界を狙ったPhoto ZIPキャンペーン、Node.jsプラントを届ける永続的なアクセス
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

概要

複数の段階にわたるアクティブな侵入キャンペーンが、悪意のあるLNKファイルを含んだ写真をテーマにしたZIPアーカイブを通じて、ホスピタリティセクターを狙っています。この感染チェーンは、難読化されたPowerShellデコーダー、動的な.NET DLLコンパイル、持続性とC2通信のためのNode.jsベースのインプラントを使用します。脅威アクターは、CalendlyやGoogleのような合法的なサービスを利用した認証の洗浄も行い、メールベースの検出の可能性を減少させています。

調査

Microsoftは、このキャンペーンの2つの異なる波を特定し、単純なPowerShellローダーからより複雑な.NETコンパイル段階への進化を観察しました。調査では、さらに HKCURun and HKCURunOnce レジストリキーに依存したデュアル持続戦略が明らかになりました。研究者たちは、Cloudflareを前面に出したドメインや、インフラを隠すための非標準的なC2ポートの使用も確認しました。

緩和策

組織は、ショートカット実行、予期しない.NETコンパイル、ユーザ書き込み可能ディレクトリから起動されるNode.jsプロセスのための多層検出を優先させるべきです。Attack Surface Reductionルールを有効にし、Microsoft Defenderの無許可の除外変更を監視することが強く推奨されます。疑わしい .cfd ドメインパターンをブロックし、異常なポートでのアウトバウンドトラフィックを監視することも露出を減らすのに役立ちます。

対応策

この活動が検出される場合、修復措置には、Node.jsが自己復元するのを防ぐために、 ProgramData RunOnce エントリとNode.jsの Run キーの削除が含まれるべきです。セキュリティチームはまた、Node.jsランタイムと関連する .js ペイロードを AppDataLocalNodejs ディレクトリから削除する必要があります。完全なクリーンアップにはアクティブなペイロードと残された持続機構の両方に対処することが要求されます。

"フローチャート TD step_phishing["T1566.002 – フィッシング: スピアフィッシングリンク:CalendlyとGoogleリダイレクトを介した認証洗浄を使用して、写真をテーマにしたZIPアーカイブを配信します。"] step_user_execution["T1204.002 – ユーザー実行: 悪意のあるファイル: 被害者は偽の画像ショートカット(.lnk)を開き、難読化されたPowerShellダウンローダーをトリガーします。"] rules_for_user_execution("<b>ルール名</b>: 二重拡張子の可能性のある悪意のあるLNKファイル<br/><b>ルールID</b>: 13f9a3c1-b2fe-4268-8052-bf6fe353e952") step_obfuscation["T1027 – 難読化されたファイルまたは情報: PowerShellは算術デコーディング(XOR、モジュロ)を使用して後続のステージを取得します。"] rules_for_obfuscation("<b>ルール名</b>: PowerShell難読化インジケータの可能性<br/><b>ルールID</b>: a11f179d-8248-4d34-905c-e61735a72688") step_compilation["T1027.004 – 配信後のコンパイル: PowerShellはcsc.exeとcvtres.exeを使用してDLLを作成するための.NETコンパイルをトリガーします。"] step_implant_execution["Node.jsベースのインプラント実行: node.exeを通じて悪意ある.jsペイロードを展開します。"] rules_for_implant_execution("<b>ルール名</b>: 知られた悪用プロセスによってスポーンされた可能性のあるNode<br/><b>ルールID</b>: b36fbdaf-1bab-45c2-a15b-f0c25c696d72") step_persistence["T1547.014 – ブートまたはログオン自動起動実行: アクティブセットアップ: Node.jsコンポーネントとProgramData実行可能ファイルのための「Run」および「RunOnce」レジストリキーを使用したデュアルモデル。"] rules_for_persistence("<b>ルール名</b>: 持続ポイントの可能性 [ASEPs – ソフトウェア/NTUSERハイブ]<br/><b>ルールID</b>: 4cb3ac97-0fab-4447-9054-6f2d6ca102a1") step_command_and_control["TA0011 – コマンドとコントロール: 固定IPインフラへの非標準ポート(8443、56001)とヘッドレスブラウザの自動化を利用したビーコニング。"] rules_for_c2("<b>ルール名</b>: 異常なトップレベルドメイン(TLD)DNSリクエストによる疑わしいコマンドとコントロール(dns経由)<br/><b>ルールID</b>: 63f3e8bc-0241-4f00-b9db-d4c309e61036") rules_for_c2_network("<b>ルール名</b>: TLS接続のアウトバウンドを開始するスクリプトランタイム(network_connection経由)<br/><b>ルールID</b>: 1ac66e9b-fd10-4c8c-af41-8c3d901ba03d") step_phishing –>|leads_to| step_user_execution step_user_execution –>|triggers| step_obfuscation step_user_execution -.->|detected_by| rules_for_user_execution step_obfuscation –>|leads_to| step_compilation step_obfuscation -.->|detected_by| rules_for_obfuscation step_compilation –>|enables| step_implant_execution step_implant_execution –>|establishes| step_persistence step_implant_execution -.->|detected_by| rules_for_implant_execution step_persistence –>|leads_to| step_command_and_control step_persistence -.->|detected_by| rules_for_persistence step_command_and_control -.->|detected_by| rules_for_c2 step_command_and_control -.->|detected_by| rules_for_c2_network "

攻撃フロー

シミュレーション実行

前提条件: テレメトリ&ベースラインのプレフライトチェックが合格したこと。

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

  • 攻撃のシナリオおよびコマンド: 敵は、スピアフィッシングリンク(T1566.002)を介して初期アクセスを得ています。持続性を確立し、C2を構築するために、彼らは軽量のPowerShellベースのインプラントを展開します。基本的なファイアウォールルールで監視されている標準ポートを避けるため、攻撃者はプライマリハートビート用に非標準ポート(8443)を使用することを決定します。さらに、インプラントは、プライマリIPがブロックされた場合の復元力を高めるために、ホストされたバックアップドメインに対するセカンダリ「ホーム通話」を実行するように構成されています。これは、ルールの参照で言及された写真ZIPキャンペーンの動作を模倣しています。 .cfd TLDで、プライマリIPがブロックされた場合に復元力を確保します。これは、ルールの参照で言及された写真ZIPキャンペーンの動作を模倣しています。

  • 回帰テストスクリプト:

    # シミュレーションスクリプト: ルール検証のためのC2エミュレーション
    # このスクリプトは、非標準のポートと.cfdドメインへのネットワーク接続をシミュレートします。
    
    Write-Host "[+] C2シミュレーション開始..." -ForegroundColor Cyan
    
    # 1. 非標準C2ポート(8443)への接続をシミュレート
    # 8443をリッスンするパブリックIP(または利用可能なローカルリスナー)を使用
    Write-Host "[+] 非標準ポート8443への接続を試みています..." -ForegroundColor Yellow
    try {
        $tcpClient = New-Object System.Net.Sockets.TcpClient
        $tcpClient.Connect("8.8.8.8", 8443) # ポートテスト用にGoogle DNSをダミーターゲットとして使用
    } catch {
        Write-Host "[!] ポート8443の接続に失敗しました(ポートが閉じている場合に期待される結果)、しかしテレメトリは生成されるはずです。" -ForegroundColor Gray
    } finally {
        $tcpClient.Close()
    }
    
    # 2. .cfdドメインへの接続をシミュレート
    # ダミーの.cfdドメインを解決して接続を試みます
    Write-Host "[+] .cfdドメインへの接続を試みています..." -ForegroundColor Yellow
    $cfdDomain = "malicious-c2-test.cfd"
    try {
        # DNSテレメトリをトリガーするためにResolve-DnsNameを使用し、その後にWebリクエスト
        Resolve-DnsName -Name $cfdDomain -ErrorAction SilentlyContinue
        Invoke-WebRequest -Uri "http://$cfdDomain" -TimeoutSec 2 -ErrorAction SilentlyContinue
    } catch {
        Write-Host "[!] .cfdドメインへの接続が失敗しました(ダミードメインの場合に期待される結果)、しかしテレメトリは生成されるはずです。" -ForegroundColor Gray
    }
    
    Write-Host "[+] シミュレーション完了。" -ForegroundColor Cyan
  • クリーンアップコマンド:

    # クリーンアップ: この特定のスクリプトによって作成された持続的なアーティファクトはありません。
    # リスナーが開始されていた場合は、停止されるべきです。
    Write-Host "[+] このステートレスシミュレーションではクリーンアップは必要ありません。" -ForegroundColor Green