SOC Prime Bias:

20 May 2026 22:10 UTC

Storm-2949はどのようにして侵害されたアイデンティティをクラウド全体の侵害に変えたか

Author Photo
SOC Prime Team linkedin icon フォローする
Storm-2949はどのようにして侵害されたアイデンティティをクラウド全体の侵害に変えたか
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

概要

Storm-2949は、ソーシャルエンジニアリングとセルフサービス パスワード リセットの悪用を利用してMicrosoft Entra IDアカウントを侵害しました。特権アクセスを取得した後、脅威アクターはAzure管理プレーンのアクションを使用して、App Services、Key Vaults、Storageアカウント、SQLデータベースにアクセスしました。その後、データはMicrosoft 365、Azureストレージおよびその他のクラウドリソースから外部に送信されました。侵害はさらに進み、ScreenConnectリモートアクセスツールが仮想マシンにデプロイされ、さらなる偵察や資格情報の窃取をサポートしました。

調査

Microsoftのアナリストは、攻撃者がMicrosoft Graph APIをカスタムPythonツールで使用し、ユーザーとアプリケーションを列挙しているのを観察しました。彼らはAzure App Servicesから公開プロファイルを取得し、Key Vaultsから秘密を抽出し、ファイアウォールルールを変更し、VMAccess拡張機能を使用して仮想マシンにローカル管理者アカウントを作成しました。後の段階では、PowerShellスクリプトがScreenConnectをインストールし、ログをクリアし、サービスを偽装して可視性を低下させました。調査では、このアクティビティが3つの攻撃者管理のIPアドレスと関連付けられました。

緩和策

組織はMFAを有効にし、特権アカウントにはフィッシング抵抗性のある認証を要求すべきです。Azure RBACの権限は厳密に制限され監視されるべきであり、特にKey VaultsとApp ServicesへのOwnerレベルのアクセスが必要です。不要なAzure VM拡張機能を無効にし、Run CommandおよびVMAccessアクティビティのログを強制すべきです。また、Microsoft Defender for CloudとDefender for Endpointは改ざん防止とブロックモードで有効にすべきです。

対応策

防御者は直ちに特定の悪意のあるIPアドレスをブロックし、侵害された資格情報を取り消すべきです。影響を受けたアカウントのパスワードとMFA登録をリセットし、Key Vaultsに保存されているすべての秘密を回転させる必要があります。セキュリティチームはAzure RBACの割り当てを全面的に見直し、過剰な特権を削除するべきです。検出ルールは、疑わしい公開プロファイルのリクエスト、Key Vault秘密へのアクセス、予期しないVM拡張機能のアクティビティを識別するために更新されるべきです。

graph TB %% Class definitions classDef action fill:#99ccff classDef tool fill:#ffcc99 classDef operator fill:#ff9900 action_phishing[“<b>アクション</b> – <b>T1566 フィッシング</b><br/><b>説明</b>: 攻撃者は標的型フィッシングメッセージを配信し、セルフサービスのパスワードリセットを悪用してユーザーにMFA承認や有効な資格情報の提供を促した。”] class action_phishing action action_valid_accounts[“<b>アクション</b> – <b>T1078 有効なアカウント</b><br/><b>説明</b>: 侵害された資格情報がMicrosoft Entra IDおよびAzureサブスクリプションへのサインインに使用された。”] class action_valid_accounts action action_account_manipulation[“<b>アクション</b> – <b>T1098 アカウント操作</b><br/><b>説明</b>: 攻撃者はパスワードをリセットし、既存のMFA要素を削除し、不正な認証アプリを登録して永続化を確立した。”] class action_account_manipulation action action_cloud_role_add[“<b>アクション</b> – <b>T1098.003 クラウドロール追加</b><br/><b>説明</b>: 侵害されたアカウントにAzure RBACの特権ロールが追加された。”] class action_cloud_role_add action action_cloud_account_discovery[“<b>アクション</b> – <b>T1087.004 クラウドアカウント探索</b><br/><b>説明</b>: Microsoft Graph APIを使用してユーザー、アプリケーション、サービスプリンシパルを列挙した。”] class action_cloud_account_discovery action action_cloud_group_discovery[“<b>アクション</b> – <b>T1069.003 クラウドグループ探索</b><br/><b>説明</b>: グループとロール割り当てを列挙し、特権メンバーを特定した。”] class action_cloud_group_discovery action action_cloud_service_discovery[“<b>アクション</b> – <b>T1526 クラウドサービス探索</b><br/><b>説明</b>: Azure App Service、Key Vault、Storage、SQLなどのサービスを列挙した。”] class action_cloud_service_discovery action action_storage_object_discovery[“<b>アクション</b> – <b>T1619 クラウドストレージオブジェクト探索</b><br/><b>説明</b>: Azure StorageのBlobコンテナを列挙し、データを特定した。”] class action_storage_object_discovery action action_keyvault_secret_access[“<b>アクション</b> – <b>T1555.006 パスワードストアからの資格情報取得</b><br/><b>説明</b>: Azure Key Vaultからシークレットが抽出された。”] class action_keyvault_secret_access action action_remote_services[“<b>アクション</b> – <b>T1021.007 リモートサービス: クラウドサービス</b><br/><b>説明</b>: 正規の資格情報を使用してAzureリソースへ接続した。”] class action_remote_services action tool_screenconnect[“<b>ツール</b> – <b>名前</b>: ScreenConnect (ConnectWise Control)<br/><b>説明</b>: 侵害された仮想マシンに導入されたリモートアクセスソフトウェア。”] class tool_screenconnect tool action_automated_collection[“<b>アクション</b> – <b>T1119 自動収集</b><br/><b>説明</b>: PythonスクリプトがOneDrive、SharePoint、Azure Storageから大量のファイルを取得した。”] class action_automated_collection action action_scripting_interpreter[“<b>アクション</b> – <b>T1059 コマンドおよびスクリプトインタプリタ</b><br/><b>サブ技術</b>: Python (T1059.006), Windows Command Shell (T1059.003), Unix Shell (T1059.004)<br/><b>説明</b>: Azure VM拡張機能を通じてスクリプトを実行し、コマンド実行・メタデータ取得・データ流出を行った。”] class action_scripting_interpreter action action_indicator_removal[“<b>アクション</b> – <b>T1070 インジケータ削除</b><br/><b>説明</b>: Windowsイベントログおよび一時ファイルが削除された。”] class action_indicator_removal action action_file_deletion[“<b>アクション</b> – <b>T1070.004 ファイル削除</b><br/><b>説明</b>: フォレンジック分析を妨害するためにVM上の痕跡が削除された。”] class action_file_deletion action action_obfuscation[“<b>アクション</b> – <b>T1027.005 難読化されたファイルまたは情報</b><br/><b>説明</b>: セキュリティツールが改変・難読化され検知を回避した。”] class action_obfuscation action action_defeat_defenses[“<b>アクション</b> – <b>T1562.008 防御回避: クラウドログの無効化または改変</b><br/><b>説明</b>: Microsoft Defender AVが無効化され、クラウドログが改ざんされた。”] class action_defeat_defenses action %% Sequential connections (FULLY PRESERVED) action_phishing –>|leads_to| action_valid_accounts action_valid_accounts –>|leads_to| action_account_manipulation action_account_manipulation –>|leads_to| action_cloud_role_add action_cloud_role_add –>|leads_to| action_cloud_account_discovery action_cloud_account_discovery –>|leads_to| action_cloud_group_discovery action_cloud_group_discovery –>|leads_to| action_cloud_service_discovery action_cloud_service_discovery –>|leads_to| action_storage_object_discovery action_storage_object_discovery –>|leads_to| action_keyvault_secret_access action_keyvault_secret_access –>|leads_to| action_remote_services action_remote_services –>|uses| tool_screenconnect tool_screenconnect –>|enables| action_automated_collection action_automated_collection –>|uses| action_scripting_interpreter action_scripting_interpreter –>|enables| action_indicator_removal action_indicator_removal –>|includes| action_file_deletion action_file_deletion –>|includes| action_obfuscation action_obfuscation –>|supports| action_defeat_defenses class action_phishing,action_valid_accounts,action_account_manipulation,action_cloud_role_add,action_cloud_account_discovery,action_cloud_group_discovery,action_cloud_service_discovery,action_storage_object_discovery,action_keyvault_secret_access,action_remote_services,action_automated_collection,action_scripting_interpreter,action_indicator_removal,action_file_deletion,action_obfuscation,action_defeat_defenses action class tool_screenconnect tool

攻撃の流れ

シミュレーションの実行

前提条件: テレメトリおよびベースラインの事前チェックを通過していること。

  • 攻撃の概要とコマンド:

    有効なAzure ADアカウント(またはデフォルトのサービスプリンシパル)を取得した攻撃者は、アプリケーションのソースコードとデータベースのスナップショットを外部に送信したいと考えています。攻撃者は、完全にAzure CLIを介して以下の手順を実行し、正確な 操作名 ルールが監視するイベントを生成します:

    1. Web App XMLの公開 – Web Appの設定(デプロイ資格情報を含む)を抽出します。
    2. 新しいStorage Accountを作成 – 外部データをステージングするためのコンテナを提供。
    3. SQLサーバーにファイアウォールルールを追加 – 攻撃者のIP範囲にサーバーを開放し、直接データコピーを可能にします。

    各ステップは、 操作名 ルールのホワイトリストに一致し、それにより検出がトリガーされます。

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

    #!/usr/bin/env bash
    # 前提条件: az CLIは侵害された/有効なAzure ADプリンシパルでログインしていること。
    set -euo pipefail
    
    # 変数 – テストテナントに必要に応じて変更してください
    RG="test-rg-$(date +%s)"
    WEBAPP="test-webapp-$RANDOM"
    STORAGE="teststorage$RANDOM"
    LOCATION="eastus"
    SQLSERVER="testsql$RANDOM"
    MY_IP=$(curl -s https://api.ipify.org)
    
    echo "=== リソースグループを作成 ==="
    az group create --name "$RG" --location "$LOCATION"
    
    echo "=== ダミーWeb Appのデプロイ ==="
    az appservice plan create --name "${WEBAPP}Plan" --resource-group "$RG" --sku B1 --is-linux
    az webapp create --resource-group "$RG" --plan "${WEBAPP}Plan" --name "$WEBAPP"
    
    echo "=== XML設定の公開(検出をトリガー) ==="
    az webapp config backup create 
        --resource-group "$RG" 
        --webapp-name "$WEBAPP" 
        --backup-name "xmlbackup-$(date +%s)" 
        --output none
    
    echo "=== ストレージアカウントの作成(検出をトリガー) ==="
    az storage account create 
        --name "$STORAGE" 
        --resource-group "$RG" 
        --location "$LOCATION" 
        --sku Standard_LRS 
        --kind StorageV2 
        --output none
    
    echo "=== SQLサーバーの作成(ファイアウォールルールに必要) ==="
    az sql server create 
        --name "$SQLSERVER" 
        --resource-group "$RG" 
        --location "$LOCATION" 
        --admin-user "sqladmin" 
        --admin-password "P@ssw0rd1234!" 
        --output none
    
    echo "=== SQLサーバーにファイアウォールルールを追加(検出をトリガー) ==="
    az sql server firewall-rule create 
        --resource-group "$RG" 
        --server "$SQLSERVER" 
        --name "AllowMyIP" 
        --start-ip-address "$MY_IP" 
        --end-ip-address "$MY_IP" 
        --output none
    
    echo "=== シミュレーション完了。Azure Sentinelでアラートを確認してください。 ==="
  • クリーンアップコマンド:

    #!/usr/bin/env bash
    set -euo pipefail
    
    # 変数はシミュレーションスクリプトで使用したものと一致しなければなりません
    RG="test-rg-..."
    # 既に実行していた場合は、前の実行の名前をそのまま使用するため、プレースホルダーを適切に置き換えてください。
    
    echo "=== リソースグループとそのすべてのリソースを削除 ==="
    az group delete --name "$RG" --yes --no-wait
    echo "クリーンアップが開始されました。"