# Az - Virtual Desktop

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

## Azure Virtual Desktop

Virtual Desktop è un **servizio di virtualizzazione desktop e app**. Consente di fornire desktop Windows completi, inclusi Windows 11, Windows 10 o Windows Server, agli utenti in remoto, sia come desktop individuali che tramite singole applicazioni. Supporta configurazioni a sessione singola per uso personale e ambienti a sessione multipla. Gli utenti possono connettersi da praticamente qualsiasi dispositivo utilizzando app native o un browser web.

### Host Pools

Gli host pool in Azure Virtual Desktop sono collezioni di macchine virtuali Azure configurate come host di sessione, fornendo desktop virtuali e app agli utenti. Ci sono due tipi principali:

- **Host pool personali**, dove ogni macchina virtuale è dedicata a un singolo utente.
- Può essere configurato in modo che l'**amministratore possa assegnare** utenti specifici alle VM o che questo avvenga **automaticamente**.
- Questo è ideale per persone con carichi di lavoro intensivi poiché ogni persona avrà la propria VM. Inoltre, potranno memorizzare file e configurare impostazioni nel disco del sistema operativo e queste persisteranno poiché **ogni utente ha la propria VM (host)**.

- **Host pool condivisi**, dove più **utenti condividono risorse** sugli host di sessione disponibili.
- È possibile configurare un **numero massimo di utenti** (sessioni) per host.
- È possibile **aggiungere VM manualmente** utilizzando chiavi di registrazione, o **consentire ad Azure di scalare automaticamente** il numero di host senza avere l'opzione di aggiungere VM utilizzando la chiave di registrazione. Non è possibile scalare automaticamente le VM per pool personali.
- Per persistere i file nelle sessioni degli utenti, è necessario utilizzare **FSlogix**.

### Session Hosts

Queste sono le **VM a cui gli utenti si connetteranno.**

- Se è stata selezionata la scalabilità automatica, verrà creato un modello con le **caratteristiche degli host** che devono essere creati per il pool.
- In caso contrario, durante la creazione dell'Host pool è possibile indicare le **caratteristiche e il numero di VM** che si desidera creare e Azure le creerà e le aggiungerà per te.

Le principali caratteristiche per **configurare le VM** sono:

- Il **prefisso** del nome delle nuove VM
- Il **tipo di VM**: Questo può essere “macchina virtuale Azure” (per utilizzare le VM Azure) o “macchina virtuale locale Azure” che consente di distribuire gli host in loco o al confine.
- La posizione, le zone, le opzioni di sicurezza della VM, l'immagine, la CPU, la memoria, la dimensione del disco…
- Il **VNet, il gruppo di sicurezza e le porte** da esporre a Internet
- È possibile impostare credenziali per **unirsi automaticamente a un dominio AD**, o utilizzare la directory Entra ID
- Se Entra ID, è possibile **iscrivere automaticamente la nuova VM in Intune**
- È necessario impostare un **nome utente e una password dell'amministratore** a meno che Azure non scaldi gli host, in tal caso deve essere **configurato un segreto con il nome utente e un altro con la password**
- È possibile **configurare uno script da eseguire** per la configurazione personalizzata

### Application Groups

**I gruppi di applicazioni** controllano l'accesso degli utenti a un desktop completo o a set specifici di applicazioni disponibili sugli host di sessione all'interno di un host pool.

Ci sono due tipi di gruppi di applicazioni:

- **Gruppi di applicazioni desktop**, che danno agli utenti accesso a desktop Windows completi e app collegate.
- **Gruppi RemoteApp**, che consentono agli utenti di accedere a singole applicazioni.
- Non è possibile assegnare questo tipo di gruppo di applicazioni a un Pool Personale.
- È necessario indicare il percorso del binario da eseguire all'interno della VM.

Un Pool Condiviso può avere **un gruppo di applicazioni Desktop** e **più gruppi RemoteApp** e gli utenti possono essere assegnati a più gruppi di applicazioni in diversi host pool.

Quando a un utente viene **concesso accesso**, gli viene assegnato il ruolo **`Desktop Virtualization User`** sul gruppo di applicazioni.

### Workspaces & Connections

Un **workspace** è una collezione di gruppi di applicazioni.

Per **connettersi** al Desktop o alle app assegnate è possibile farlo da [https://windows365.microsoft.com/ent#/devices](https://windows365.microsoft.com/ent#/devices)
E ci sono altri metodi descritti su [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)

Quando un utente accede al proprio account, gli verrà **presentato separato per workspace tutto ciò a cui ha accesso**. Pertanto, è necessario aggiungere **ogni gruppo di applicazioni a un workspace** affinché gli accessi definiti siano visibili.

Affinché un utente possa accedere a un Desktop o a un'app, ha anche bisogno del ruolo **`Virtual Machine User Login`** o **`Virtual Machine Administrator Login`** sulla VM.

### Managed Identities

Non è possibile assegnare identità gestite agli host pool, quindi le VM create all'interno di un pool le avranno.
Tuttavia, è possibile **assegnare identità gestite di sistema e utente alle VM** e poi accedere ai token dai metadati. In effetti, dopo aver lanciato gli host pool dal web, le 2 VM generate hanno l'identità gestita di sistema abilitata (anche se non ha alcuna autorizzazione).


### 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}}
