# Az - Virtual Desktop

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

## Azure Virtual Desktop

Virtual Desktop je **usluga virtualizacije desktopa i aplikacija**. Omogućava isporuku punih Windows desktopa, uključujući Windows 11, Windows 10 ili Windows Server korisnicima na daljinu, bilo kao pojedinačne desktopa ili kroz pojedinačne aplikacije. Podržava postavke sa jednom sesijom za ličnu upotrebu i višeslojne okruženja. Korisnici se mogu povezati sa praktično bilo kog uređaja koristeći nativne aplikacije ili web pretraživač.

### Host Pools

Host pool-ovi u Azure Virtual Desktop su kolekcije Azure virtuelnih mašina konfigurisanih kao domaćini sesija, pružajući virtuelne desktopove i aplikacije korisnicima. Postoje dve glavne vrste:

- **Lični host pool-ovi**, gde je svaka virtuelna mašina posvećena jednom korisniku.
- Može se konfigurisati tako da **administrator može dodeliti** specifične korisnike VM-ovima ili da se to uradi **automatski**.
- Ovo je idealno za ljude sa intenzivnim radnim opterećenjima jer će svaka osoba imati svoju VM. Štaviše, moći će da čuvaju datoteke i konfigurišu postavke na OS disku i one će trajati jer **svaki korisnik ima svoju VM (domaćin)**.

- **Pooled host pool-ovi**, gde više **korisnika deli resurse** na dostupnim domaćinima sesija.
- Moguće je konfigurisati **maksimalan broj korisnika** (sesija) po domaćinu.
- Moguće je **dodati VM-ove ručno** koristeći registracione ključeve, ili **dozvoliti Azure-u da automatski skalira** broj domaćina bez mogućnosti dodavanja VM-ova koristeći registracione ključeve. Nije moguće automatski skalirati VM-ove za lične pool-ove.
- Da bi se sačuvale datoteke u sesijama korisnika, potrebno je koristiti **FSlogix**.

### Session Hosts

Ovo su **VM-ovi na koje će se korisnici povezati.**

- Ako je odabran automatski skaliranje, biće kreiran šablon sa **karakteristikama domaćina** koje treba kreirati za pool.
- Ako ne, prilikom kreiranja Host pool-a moguće je naznačiti **karakteristike i broj VM-ova** koje želite da kreirate i Azure će ih kreirati i dodati za vas.

Glavne karakteristike za **konfiguraciju VM-ova** su:

- **prefiks** ime novih VM-ova
- **tip VM-a**: Ovo može biti “Azure virtuelna mašina” (za korišćenje Azure VM-ova) ili “Azure lokalna virtuelna mašina” koja omogućava domaćinima da budu implementirani na lokaciji ili na ivici.
- Lokacija, zone, opcije bezbednosti VM-a, slika, CPU, memorija, veličina diska…
- **VNet, bezbednosna grupa i portovi** koje treba izložiti internetu
- Moguće je postaviti akreditive za automatsko **pridruživanje AD domeni**, ili koristiti Entra ID direktorijum
- Ako je Entra ID, moguće je automatski **upisati novu VM u Intune**
- Potrebno je postaviti **korisničko ime i lozinku administratora** osim ako Azure ne skalira domaćine, u tom slučaju mora biti konfigurisan **tajni ključ sa korisničkim imenom i još jedan sa lozinkom**
- Moguće je **konfigurisati skriptu koja će se izvršiti** za prilagođenu konfiguraciju

### Application Groups

**Application groups** kontrolišu pristup korisnika ili punom desktopu ili specifičnim setovima aplikacija dostupnim na domaćinima sesija unutar host pool-a.

Postoje dve vrste aplikacionih grupa:

- **Desktop aplikacione grupe**, koje daju korisnicima pristup kompletnim Windows desktopima i povezanim aplikacijama.
- **RemoteApp grupe**, koje omogućavaju korisnicima pristup pojedinačnim aplikacijama.
- Nije moguće dodeliti ovu vrstu aplikacione grupe ličnom pool-u.
- Potrebno je naznačiti putanju do binarnog fajla koji treba izvršiti unutar VM-a.

Pooled Pool može imati **jednu Desktop aplikacionu** grupu i **više RemoteApp grupa** i korisnici mogu biti dodeljeni više aplikacionim grupama širom različitih host pool-ova.

Kada korisniku bude **odobren pristup**, dodeljuje mu se uloga **`Desktop Virtualization User`** preko aplikacione grupe.

### Workspaces & Connections

**workspace** je kolekcija aplikacionih grupa.

Da bi se **povezao** na Desktop ili aplikacije dodeljene, moguće je to učiniti sa [https://windows365.microsoft.com/ent#/devices](https://windows365.microsoft.com/ent#/devices)
I postoje druge metode opisane na [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)

Kada korisnik pristupi svom nalogu, biće mu **prikazano odvojeno po radnim prostorima sve na šta ima pristup**. Stoga, potrebno je dodati **svaku aplikacionu grupu u jedan workspace** kako bi definisani pristupi bili vidljivi.

Da bi korisnik mogao da pristupi Desktopu ili aplikaciji, takođe mu je potrebna uloga **`Virtual Machine User Login`** ili **`Virtual Machine Administrator Login`** preko VM-a.

### Managed Identities

Nije moguće dodeliti upravljane identitete host pool-ovima, tako da kreirane VM-ove unutar pool-a neće imati.
Međutim, moguće je **dodeliti sistemske i korisničke upravljane identitete VM-ovima** i zatim pristupiti tokenima iz metapodataka. U stvari, nakon pokretanja host pool-ova sa web-a, 2 generisane VM imaju omogućenu sistemsku dodeljenu upravljanu identitet (iako nemaju nikakve dozvole).


### 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"
```
## Privesc

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

## Post Exploitation & Persistence

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


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