Az - Virtual Desktop
Reading time: 6 minutes
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
Azure Virtual Desktop
Virtual Desktop는 데스크탑 및 앱 가상화 서비스입니다. 이를 통해 Windows 11, Windows 10 또는 Windows Server를 포함한 전체 Windows 데스크탑을 개별 데스크탑 또는 개별 애플리케이션을 통해 원격으로 사용자에게 제공할 수 있습니다. 개인 사용을 위한 단일 세션 설정과 다중 세션 환경을 지원합니다. 사용자는 기본 앱이나 웹 브라우저를 사용하여 거의 모든 장치에서 연결할 수 있습니다.
Host Pools
Azure Virtual Desktop의 호스트 풀은 세션 호스트로 구성된 Azure 가상 머신의 모음으로, 사용자에게 가상 데스크탑과 앱을 제공합니다. 두 가지 주요 유형이 있습니다:
-
개인 호스트 풀: 각 가상 머신이 단일 사용자에게 전용됩니다.
-
관리자가 특정 사용자를 VM에 할당하거나 자동으로 할당하도록 구성할 수 있습니다.
-
각 사용자가 자신의 VM을 가지므로 작업 부하가 많은 사람들에게 이상적입니다. 또한, 파일을 저장하고 OS 디스크에서 설정을 구성할 수 있으며, 이는 각 사용자가 자신의 VM(호스트)을 가지므로 지속됩니다.
-
공유 호스트 풀: 여러 사용자가 사용 가능한 세션 호스트에서 리소스를 공유합니다.
-
호스트당 최대 사용자 수(세션)를 구성할 수 있습니다.
-
등록 키를 사용하여 VM을 수동으로 추가하거나, Azure가 자동으로 호스트 수를 조정하도록 허용할 수 있습니다. 개인 풀에 대해 VM을 자동으로 조정하는 것은 불가능합니다.
-
사용자 세션에서 파일을 지속하려면 FSlogix를 사용해야 합니다.
Session Hosts
이들은 사용자가 연결할 VMs입니다.
- 자동 조정이 선택된 경우, 풀을 위해 생성해야 할 호스트의 특성을 가진 템플릿이 생성됩니다.
- 그렇지 않은 경우, 호스트 풀을 생성할 때 생성할 VM의 특성과 수를 지정할 수 있으며 Azure가 이를 생성하고 추가합니다.
VM을 구성하는 주요 기능은 다음과 같습니다:
- 새 VM의 접두사 이름
- VM 유형: "Azure 가상 머신"(Azure VM 사용) 또는 "Azure 로컬 가상 머신"으로, 호스트를 온프레미스 또는 엣지에 배포할 수 있습니다.
- 위치, 존, VM 보안 옵션, 이미지, CPU, 메모리, 디스크 크기…
- 인터넷에 노출할 VNet, 보안 그룹 및 포트
- 자동으로 AD 도메인에 가입할 자격 증명을 설정하거나 Entra ID 디렉토리를 사용할 수 있습니다.
- Entra ID의 경우, Intune에 새 VM을 자동으로 등록할 수 있습니다.
- Azure가 호스트를 조정하는 경우를 제외하고는 관리자 사용자 이름과 비밀번호를 설정해야 하며, 이 경우 사용자 이름과 비밀번호에 대한 비밀을 구성해야 합니다.
- 사용자 정의 구성을 위해 실행할 스크립트를 구성할 수 있습니다.
Application Groups
애플리케이션 그룹은 사용자에게 호스트 풀 내의 세션 호스트에서 전체 데스크탑 또는 특정 애플리케이션 세트에 대한 액세스를 제어합니다.
애플리케이션 그룹에는 두 가지 유형이 있습니다:
- 데스크탑 애플리케이션 그룹: 사용자가 전체 Windows 데스크탑과 연결된 앱에 액세스할 수 있습니다.
- RemoteApp 그룹: 사용자가 개별 애플리케이션에 액세스할 수 있습니다.
- 이러한 종류의 애플리케이션 그룹을 개인 풀에 할당하는 것은 불가능합니다.
- VM 내에서 실행할 이진 파일의 경로를 지정해야 합니다.
공유 풀은 하나의 데스크탑 애플리케이션 그룹과 여러 RemoteApp 그룹을 가질 수 있으며, 사용자는 서로 다른 호스트 풀에 걸쳐 여러 애플리케이션 그룹에 할당될 수 있습니다.
사용자가 액세스 권한을 부여받으면 애플리케이션 그룹에 대해 Desktop Virtualization User
역할이 부여됩니다.
Workspaces & Connections
작업 공간은 애플리케이션 그룹의 모음입니다.
데스크탑 또는 할당된 앱에 연결하기 위해 https://windows365.microsoft.com/ent#/devices에서 할 수 있습니다. 그리고 https://learn.microsoft.com/en-us/azure/virtual-desktop/users/connect-remote-desktop-client에서 설명된 다른 방법도 있습니다.
사용자가 자신의 계정에 접근하면 그가 접근할 수 있는 모든 것이 작업 공간별로 구분되어 표시됩니다. 따라서 정의된 액세스가 보이도록 각 애플리케이션 그룹을 하나의 작업 공간에 추가해야 합니다.
사용자가 데스크탑이나 앱에 접근할 수 있으려면 Virtual Machine User Login
또는 Virtual Machine Administrator Login
역할이 VM에 대해 필요합니다.
Managed Identities
호스트 풀에 관리된 ID를 할당할 수 없으므로 풀 내에서 생성된 VM은 이를 가지지 않습니다. 그러나 VM에 시스템 및 사용자 관리 ID를 할당하고 메타데이터에서 토큰에 접근할 수 있습니다. 실제로 웹에서 호스트 풀을 시작한 후 생성된 2개의 VM은 시스템 할당 관리 ID가 활성화되어 있습니다(권한은 없습니다).
Enumeration
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"
프라이벡스
포스트 익스플로이테이션 & 지속성
Az - Virtual Desktop Post Exploitation
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.