Resource Based Constrained Delegation

RBCD는 다른 위임 구성과 다르게 리소스 기반에서 이뤄지며 Windows 2012부터 도입되었습니다.

웹 서비스를 이용하는 user-A가 자신이 직접 데이터베이스 서비스에 접근하지 않고도 웹 서비스에서 자동화하여 user-A의 권한으로 이용하는 것이 위임이라는 개념이며, 제약된/제약없는 위임 구성은 위임 주체를 프론트 웹 서비스에서 설정했습니다.

이러한 문제점으로는 정작 자신의 권한을 허용하는 리소스(데이터베이스)는 어떤 객체가 다른 사용자를 대신하여 자신의 리소스에 접근하는지 파악하지 못하기 때문에 위임 구성 권한을 백엔드 서비스에 할당합니다.

공격을 이용하기 위해서는 이미 rbcd 구성이 된 계정을 탈취하거나, 서비스 컴퓨터 계정에 대해서 높은 권한( GenericAll, GenericWrite, AddAllowedToAct, WriteOwner)이 있으면서 장악한 컴퓨터 계정이 있거나 컴퓨터 계정을 생성할 수 있는 권한(MAQ 값이 1 이상인 도메인 사용자 계정 보유)가 있어야 합니다.

rbcd가 이미 구성된 경우
rbcd 구성이 없는 경우

요구 권한

위임이 구성된 계정

서비스 컴퓨터 계정에 대한 높은 권한, 컴퓨터 계정 생성 권한

Abuse

Root Cause

via computer

rbcd 위임 구성은 객체의 Attribute Editor > msDS-AllowedToActOnBehalfOfOtherIdentity 에서 확인할 수 있습니다. 이 속성 값은 이진으로 저장되어 GUI로 편집할 수 없습니다.

rbcd 세팅

상용 도구로 rbcd 구성을 하게 되면 modifyRequest를 통해 대상의 위임 속성을 변경 요청합니다. 변경할 때는 마찬가지로 평문 문자열을 사용하지 않고 이진을 사용합니다.

modifyRequest

위임 구성이 완료되면 Constrained Delegation과 동일한 과정을 거쳐 클라이언트를 가장합니다.

ACS-DC01$ 계정의 서비스에 대해 가장 권한을 가진 rbcd$는 가장하려는 클라이언트(Administrator)의 권한으로 자신의 서비스 티켓을 요청합니다.

TGS-REQ
TGS-REP

rbcd$의 spn에 대해 다른 사용자를 가장하여 서비스 티켓을 요청하는 것은 S4U2Self이며 제약된 위임입니다.

이제 Administrator 권한으로 발급받은 rbcd$ 서비스 티켓을 acs-dc01$의 서비스 티켓으로 교환합니다.

TGS-REQ
TGS-REP

Administrator 권한으로 발급받은 자신의 서비스 티켓을 다른 티켓으로 교환하는 기능은 S4U2Proxy입니다.

전체 흐름을 다이어그램으로 나타내면 아래와 같습니다.

via user

클라이언트가 KDC에 TGT를 발급받을 때 평문 패스워드를 사용하면 SHA1 알고리즘을 사용하는 AES256 방식으로 암호화되는 반면 ntlm을 사용하면 MD5 알고리즘을 사용하는 rc4 방식으로 암호화 됩니다.

AS-REQ via user password
AS-REQ via user ntlm

두가지 방식의 차이로 인해 발생하는 결정적 차이는 TGT 세션 키의 크기입니다.

ntlm을 통해 발급한 TGT 세션키는 16바이트인 반면 평문 패스워드를 통해 발급한 TGT 세션키는 32바이트입니다. 이러한 차이는 암호화 알고리즘의 차이일 뿐이며 로직 상으로는 동일하게 처리됩니다.

AS-REP via user ntlm
AS-REP via user password

하지만 16바이트의 크기를 갖는 TGT 세션 키는 사용자의 ntlm과 동일한 크기라는 것이 중요합니다.

U2U는 커버로스 확장으로 spn이 없는 사용자 간의 인증을 위한 기술입니다. 이 기술에서 user-A는 user-B의 TGT 세션 키로 암호화한 서비스 티켓을 전송함으로써 user-B에게 인증할 수 있습니다.

TGS-REQ via U2U
TGS-REP via U2U

test1은 사용자 계정이기 때문에 spn이 없어 원래같으면 서비스 티켓 요청을 하더라도 오류 코드가 반환되지만, U2U를 사용했기 때문에 test1은 test1의 서비스 티켓을 발급할 수 있습니다.

이 서비스 티켓을 발급하는 과정에서 pA-FOR-USER 필드에 Administrator를 기입하여 클라이언트를 가장합니다. 이 과정에서 발급된 서비스 티켓 역시 암호화 키는 16바이트 크기를 가지는 것이 확인됩니다.

TGS-REP의 keyvalue가 AS-REP에서 획득한 keyvalue와 다른 이유는 KDC는 tgt 세션키로 복호화가 가능한 enc-part 하위 항목에 새로운 서비스 세션키를 생성하기 때문입니다.

사용자 계정을 대상으로 한 rbcd 공격 과정에서 공격 주체의 ntlm 값을 TGT 세션키로 변경하는 이유는 KDC가 위임받은 서비스에 대해 클라이언트를 가장하여 요청하는 TGS-REQ에 대한 additional-tickets를 해석하려 할 때, 서비스 계정(test)의 ntlm으로 복호화하려 하기 때문입니다.

TGS-REQ via rbcd
TGS-REP via rbcd

최종적으로 사용자 계정을 통해 다른 클라이언트를 가장한 서비스 티켓을 획득하는 것이 성공합니다.

References

Last updated