Active Directory Trusts
대규모 조직에서는 Active Directory를 관리하고 운영하는데 있어서 한개의 도메인만 사용하기에는 부족할 수 있습니다. 두 개 이상의 도메인을 관리할 때, 서로 다른 도메인 객체가 리소스에 대해 접근을 요구하거나, 접근을 허용해야 하는 경우가 발생할 수 있습니다. 이럴 때 도메인 신뢰 관계를 통해 서로의 엑세스에 대해 접근을 허용할 수 있습니다.
Forest
위 그림과 같이 DC1과 DC2는 서로를 신뢰하는 포레스트일 때, DC1 사용자인 클라이언트가 DC2에서 실행되는 서버에 접근하고자 하는 상황을 가정하겠습니다. 이때 클라이언트에서 DC2의 서비스에 접근하기까지 아래의 과정이 순차적으로 진행됩니다.
클라이언트는 인증을 통해 DC1으로 TGT 발급 요청(AS-REQ)
DC1은 인증 정보를 확인 후, krbtgt의 비밀키로 암호화된 TGT를 클라이언트에게 전송
클라이언트는 TGT를 이용하여 DC2의 서비스에 대한 티켓을 DC1에 요청(TGS-REQ)
DC1은 TGS-REQ의 SPN이 DC2의 서비스인 것을 인지 후, 레퍼럴 티켓 발급
클라이언트는 레퍼럴 티켓을 이용하여 DC2의 서비스에 대한 티켓을 DC2에 요청(TGS-REQ)
DC2는 레퍼럴 티켓을 복호화하여 클라이언트 정보를 검증 후 서비스 티켓 발급
클라이언트는 서비스 티켓을 사용하여 DC2의 서비스 서버에 접근 후 서비스 이용
트러스트 관계는 한 도메인의 사용자가 다른 도메인의 리소스에 인증하고 접근할 수 있도록 허용해줍니다. 사용자가 외부 도메인의 리소스에 접근을 요청하면, 해당 사용자의 도메인 컨트롤러는 대상 도메인 컨트롤러를 가리키는 레퍼럴 티켓을 반환합니다. 이때 사용자의 TGT는 로컬 krbtgt의 비밀키로 암호화 되지 않고, 상호 영역 트러스트 키(Inter-realm trust key)를 사용하여 암호화가 되며, 이를 상호 영역 TGT라고 부릅니다. 외부 도메인은 상호 영역 TGT를 복구한 다음, PAC 정보를 통해 권한을 확인하여 해당 리소스에 접근을 허용할지 결정합니다.
Trust
트러스트는 단방향일 수도 있고 양방향일 수도 있으며, 전이적일 수도, 비전이적일 수도 있습니다. 먼저 단방향 트러스트는 신뢰하는 도메인과 신뢰받는 도메인이라는 개념으로 시작합니다.

단방향 신뢰 관계는 서로가 서로의 리소스에 대해 접근하도록 허용하는 것이 아닌, 일방적으로 한 쪽만이 신뢰하고 접근할 수 있는 관계입니다. 위 그림에서는 왼쪽의 도메인이 오른쪽을 신뢰하고, 오른쪽의 도메인이 왼쪽 도메인의 리소스에 대해 접근할 수 있습니다. 본인 도메인에 접근하도록 허용하는 도메인(왼쪽 도메인)을 신뢰하는 도메인(Trusting Domain)이라 부르고, 신뢰를 받기 때문에 외부 도메인의 리소스에 접근할 수 있는 도메인(오른쪽 도메인)을 신뢰받는 도메인(Trusted Domain)이라고 부릅니다.
반대로 서로가 서로를 신뢰하는 경우, 이는 양방향 신뢰 관계라 부르며 서로가 서로의 리소스에 대해서 접근할 수 있습니다. 양방향 신뢰 관계인 도메인을 포레스트 단위로 칭합니다.
Finding External Domain Group members
양방향이든 단반향이든 신뢰받는 도메인은 신뢰하는 도메인의 리소스에 대해서 자신의 도메인과 동일한 행위들을 할 수 있습니다. 예를 들면 도메인 객체 정보를 LDAP을 통해 조회할 수 있습니다. 파워쉘에는 외부 사용자가 포함된 도메인 그룹을 열거하고 해당 멤버를 반환하기 위해 아래 명령어를 지원합니다.
이제 외부 도메인 사용자를 그룹에 포함하는 그룹명과, 해당 그룹에 속한 그룹원들을 파악했으니 사용자 가장을 통한 외부 도메인 활동을 할 수 있습니다.
Abuse Trusted Domain Object
A 도메인이 B 도메인을 신뢰하는 상태에서 B 도메인은 A 도메인의 리소스에 대해서 접근할 수 있지만, 반대의 경우는 제한됩니다. 하지만 B 도메인 객체가 레퍼럴 티켓을 통해 A 도메인 리소스를 사용하려는 상황에서, 결국 도메인을 초월하여 TGT를 복호화 하기 위해서는 A와 B 간의 공용 비밀번호가 필요합니다. 레퍼럴 티켓을 생성할 때 사용하는 이러한 비밀키는 Trust Password라고도 부르며 신뢰 관계에 있는 모든 도메인들은 이러한 공유 비밀번호를 갖고 있습니다. 공유 비밀번호는 각 도메인 컨트롤러의 로컬에 생성되며 도메인 관리자 권한을 획득했을 때 추출할 수 있습니다.
트러스트 관계가 형성되면 신뢰받는 도메인에는 신뢰하는 도메인의 이름을 가진 트러스트 계정이 생성됩니다. 만약 pentest.wiki 도메인이 redteam.pentest 도메인으로부터 신뢰를 받는다면, pentest.wiki에는 reateam$
라는 트러스트 계정이 생성됩니다. 이를 통해 신뢰하는 도메인에서 신뢰받는 도메인에 어떤 계정이 있을 지 유추할 수 있으며, 그 중에는 신뢰하는 도메인의 이름을 가진 트러스트 계정이 있을거라고 추측할 수 있습니다. 트러스트 계정의 TGT를 통해 로그인 세션을 구축한 이후에는 어느정도 객체 정보를 조회할 수 있는데, 그 중 Kerberoasting, ASRep-Roasting, RBCD 등에 취약한 객체들을 찾은 뒤, 측면 이동을 수행할 수 있습니다.
Parent & Child
도메인 하위에 자식 도메인이 생기게 되면 기본적으로 부모와 자식 도메인 간의 관계는 양방향 신뢰 관계가 맺어집니다. 또한 자식 도메인에서 도메인 관리자 권한을 가진 경우, SID History라는 특수 속성이 포함된 TGT를 통해 부모 도메인에서도 도메인 관리자 권한을 획득할 수 있습니다. SID History는 사용자 계정을 다른 도메인으로 이전할 때, 사용자의 기존 도메인에서의 권한을 이전한 도메인에서도 유지시키도록 고안된 개념입니다. 골든 티켓 / 다이아몬드 티켓 공격을 통해 위조된 TGT를 생성할 때, 부모 도메인에서 권한이 있는 그룹(Enterprise Admins, Domain Admins 등)의 SID를 추가하면 부모 도메인의 모든 리소스에 접근할 수 있게 됩니다.
References
Last updated
Was this helpful?