# Az - Virtual Desktop

{{#include ../../../banners/hacktricks-training.md}}

## Azure Virtual Desktop

Virtual Desktopは**デスクトップおよびアプリの仮想化サービス**です。これにより、ユーザーにフルWindowsデスクトップ（Windows 11、Windows 10、またはWindows Serverを含む）をリモートで提供できます。個別のデスクトップまたは個別のアプリケーションを通じて提供されます。個人使用のためのシングルセッションセットアップとマルチセッション環境をサポートしています。ユーザーは、ネイティブアプリまたはウェブブラウザを使用して、ほぼすべてのデバイスから接続できます。

### Host Pools

Azure Virtual Desktopのホストプールは、セッションホストとして構成されたAzure仮想マシンのコレクションであり、ユーザーに仮想デスクトップとアプリを提供します。主に2種類があります：

- **個人ホストプール**：各仮想マシンが単一のユーザーに専用です。
- **管理者が特定のユーザーをVMに割り当てる**ことができるように構成することができます。または、これを**自動的に**行うこともできます。
- 各ユーザーが自分のVMを持つため、集中的な作業負荷を持つ人々に最適です。さらに、ファイルを保存し、OSディスクに設定を構成でき、これらは**各ユーザーが自分のVM（ホスト）を持つため**持続します。

- **プールホストプール**：複数の**ユーザーがリソースを共有**する利用可能なセッションホスト上です。
- ホストごとに**最大ユーザー数**（セッション）を構成することが可能です。
- 登録キーを使用して**手動でVMを追加**することも、**Azureにホストの数を自動的にスケールさせる**ことも可能です。ただし、個人プールのVMを自動的にスケールさせることはできません。
- ユーザーセッション内でファイルを持続させるには、**FSlogix**を使用する必要があります。

### Session Hosts

これらは**ユーザーが接続するVM**です。

- 自動スケーリングが選択された場合、プールのために作成する必要がある**ホストの特性**を持つテンプレートが作成されます。
- そうでない場合、ホストプールを作成する際に、作成したい**VMの特性と数**を指定でき、Azureがそれを作成して追加します。

VMを**構成するための主な機能**は次のとおりです：

- 新しいVMの**プレフィックス**名
- **VMタイプ**：これは「Azure仮想マシン」（Azure VMを使用するため）または「Azureローカル仮想マシン」で、ホストをオンプレミスまたはエッジに展開できます。
- 場所、ゾーン、VMセキュリティオプション、イメージ、CPU、メモリ、ディスクサイズ…
- インターネットに公開するための**VNet、セキュリティグループおよびポート**
- 自動的に**ADドメインに参加**するための資格情報を設定することが可能、またはEntra IDディレクトリを使用
- Entra IDの場合、新しいVMをIntuneに自動的に**登録**することが可能
- Azureがホストをスケールする場合を除き、**管理者のユーザー名とパスワード**を設定する必要があります。この場合、**ユーザー名とパスワードのそれぞれに秘密を構成する必要があります**
- カスタム構成のために**実行されるスクリプトを構成**することが可能です

### Application Groups

**アプリケーショングループ**は、ユーザーがホストプール内のセッションホストで利用可能なフルデスクトップまたは特定のアプリケーションセットにアクセスするのを制御します。

アプリケーショングループには2種類あります：

- **デスクトップアプリケーショングループ**：ユーザーに完全なWindowsデスクトップと添付アプリへのアクセスを提供します。
- **RemoteAppグループ**：ユーザーが個別のアプリケーションにアクセスできるようにします。
- この種のアプリケーショングループを個人プールに割り当てることはできません。
- VM内で実行するバイナリへのパスを指定する必要があります。

プールプールには**1つのデスクトップアプリケーショングループ**と**複数のRemoteAppグループ**を持つことができ、ユーザーは異なるホストプールにまたがる複数のアプリケーショングループに割り当てることができます。

ユーザーが**アクセスを付与される**と、アプリケーショングループに対して**`Desktop Virtualization User`**の役割が与えられます。

### Workspaces & Connections

**ワークスペース**はアプリケーショングループのコレクションです。

デスクトップまたはアプリに**接続**するためには、[https://windows365.microsoft.com/ent#/devices](https://windows365.microsoft.com/ent#/devices)から行うことができます。
他の方法については、[https://learn.microsoft.com/en-us/azure/virtual-desktop/users/connect-remote-desktop-client](https://learn.microsoft.com/en-us/azure/virtual-desktop/users/connect-remote-desktop-client)に記載されています。

ユーザーが自分のアカウントにアクセスすると、**ワークスペースごとに分けられたすべてのアクセス権が表示されます**。したがって、定義されたアクセス権が表示されるように、**各アプリケーショングループを1つのワークスペースに追加する必要があります**。

ユーザーがデスクトップまたはアプリにアクセスできるようにするには、VMに対して**`Virtual Machine User Login`**または**`Virtual Machine Administrator Login`**の役割も必要です。

### Managed Identities

ホストプールにマネージドアイデンティティを割り当てることはできないため、プール内に作成されたVMにはそれらがありません。
ただし、**システムおよびユーザーマネージドアイデンティティをVMに割り当て**、その後メタデータからトークンにアクセスすることが可能です。実際、ウェブからホストプールを起動した後、生成された2つのVMにはシステム割り当てのマネージドアイデンティティが有効になっています（ただし、権限はありません）。 

### Enumeration
```bash
az extension add --name desktopvirtualization

# List HostPools
az desktopvirtualization hostpool list

# List Workspaces
az desktopvirtualization workspace list

# List Application Groups
az desktopvirtualization applicationgroup list

# List Applications in a Application Group
az rest --method GET --url "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.DesktopVirtualization/applicationGroups/{applicationGroupName}/applications?api-version=2024-04-03"

# Check if Desktops are enabled
az rest --method GET --url "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.DesktopVirtualization/applicationGroups/{applicationGroupName}/desktops?api-version=2024-04-03"

# List Assigned Users to the Application Group
az rest \
--method GET \
--url "https://management.azure.com/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP_NAME>/providers/Microsoft.DesktopVirtualization/applicationGroups/<APP_GROUP_NAME>/providers/Microsoft.Authorization/roleAssignments?api-version=2022-04-01" \
| jq '.value[] | select((.properties.scope | ascii_downcase) == "/subscriptions/<subscription_id_in_lowercase>/resourcegroups/<resource_group_name_in_lowercase>/providers/microsoft.desktopvirtualization/applicationgroups/<app_group_name_in_lowercase>")'

# List hosts
az rest --method GET --url "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.DesktopVirtualization/hostPools/{hostPoolName}/sessionHosts?api-version=2024-04-03"

# List App Attach packages
az rest --method GET --url "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.DesktopVirtualization/appAttachPackages?api-version=2024-04-03"

# List user sessions
az rest --method GET --url "https://management.azure.com/ssubscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.DesktopVirtualization/hostpools/{hostPoolName}/sessionhosts/{hostPoolHostName}/userSessions?api-version=2024-04-03"


# List Desktops
az rest --method GET --url "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.DesktopVirtualization/applicationGroups/{applicationGroupName}/desktops?api-version=2024-04-03"

# List MSIX Packages
az rest --method GET --url "https://management.azure.com/subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/Microsoft.DesktopVirtualization/hostPools/{hostPoolName}/msixPackages?api-version=2024-04-03"

# List private endpoint connections associated with hostpool.
az rest --method GET --url "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.DesktopVirtualization/hostPools/{hostPoolName}/privateEndpointConnections?api-version=2024-04-03"

# List private endpoint connections associated By Workspace.
az rest --method GET --url "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.DesktopVirtualization/workspaces/{workspaceName}/privateEndpointConnections?api-version=2024-04-03"

# List the private link resources available for a hostpool.
az rest --method GET --url "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.DesktopVirtualization/hostPools/{hostPoolName}/privateLinkResources?api-version=2024-04-03"

# List the private link resources available for this workspace.
az rest --method GET --url "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.DesktopVirtualization/workspaces/{workspaceName}/privateLinkResources?api-version=2024-04-03"
```
## プライベートアクセス

{{#ref}}
../az-privilege-escalation/az-virtual-desktop-privesc.md
{{#endref}}

## ポストエクスプロイテーションと持続性

{{#ref}}
../az-post-exploitation/az-virtual-desktop-post-exploitation.md
{{#endref}}


{{#include ../../../banners/hacktricks-training.md}}
