Trust Domain

  • 두 개의 서로 다른 도메인 또는 포리스트 간에 인증을 공유하여, 한 도메인의 사용자가 다른 도메인의 자원에 접근할 수 있게 하는 보안 설정이다.
  • 서로가 서로를 신뢰하는 양방향 (Two-way) 신뢰가 있고, 일방향적인 신뢰 관계 (One-way) 신뢰가 있다.

SpoofSIDHistory (Extra SID 조작)

개념

  • 공격자가 골든 티켓을 위조하는데, 티켓의 Extra SID 필드에 임의의 SID(주로 Enterprise Admin SID인 519를 사용한다) 를 넣어 티켓을 위조하고, 신뢰 관계에 있는 다른 도메인에 인증하는데 사용한다.
  • 인증을 받는 서버는 Extra SID에 적힌 SID권한을 반영해준다.
  • 원래 KDC가 사용자의 SIDHistory 속성을 읽어 티켓의 Extra SIDs 필드에 넣어주며 동작하지만, SpoofSIDHistory는 공격자가 직접 티켓의 Extra SIDs에 고권한 SID값을 넣어 위조한다.
  • 이를 이해하기 위해선 먼저 SIDHistory를 이해해야 한다.

SID History란?

구 도메인 : old.domain.local, 신 도메인 : new.domain.local 이 있다고 가정하자.

John의 구 SID : S-1-5-21-OLD-1050, John의 신 SID : S-1-5-21-NEW-1050 이 되었다. John은 기존에 FS01에 있는 문서를 읽을 수 있었다. 문서의 ACL에 S-1-5-21-OLD-1050이 등록되어 있었기 때문.

하지만 John은 신규 SID를 발급받았고, 기존에 사용하던 FS01의 문서를 읽으려고 하지만, FS01S-1-5-21-NEW-1050은 모르는 SID이므로 접근을 거부함.

따라서 John의 계정에 SIDHistory = S-1-5-21-OLD-1050을 넣음으로써, John이 FS01에 접근할 수 있게 되었다.

성립 조건

  1. 공격자는 도메인을 완전히 장악하여, krbtgt의 hash 혹은 aesKey를 확보해야 한다.
  2. 서로 신뢰관계에 있는 다른 도메인이 존재해야 한다.
  3. 이동하려는 옆 도메인에서 SID Filtering이 비활성화 되어 있어야 한다. 같은 포리스트 내에 있는 다른 도메인은 기본적으로 비활성화 되어있다. SID Filtering이 활성화 되어있다면, 인증을 받는 DC는 Extra SID 필드값을 제거하고 티켓을 검증한다.

공격 시나리오 (예시)

하나의 포리스트 내 양방향 신뢰관계인 두 개의 도메인이 존재한다고 가정하자. domain.local > sub.domain.local은 서로 신뢰관계이다. 각 도메인의 DC는 아래와 같다고 가정한다. DC01.domain.local, DC02.sub.domain.local

공격자는 sub.domain.local을 완전히 장악했고, DCSync까지 진행하여 sub 도메인 krbtgt의 해시까지 획득했다.

공격자는 krbtgt 해시를 이용해 Extra SIDdomain.localEnterprise Admins SID가 삽입된 골든티켓을 위조한다. (impacket-ticketer)

PassTheTicket + psexec을 진행한다. 공격자는 우선 위조된 골든티켓을 DC02에 제출하고, DC02는 trust key로 서명된 referral ticket을 발급한다. 공격자는 해당 referral ticket으로 DC01.domain.local에 인증을 시도하며, DC01은 Extra SID를 신뢰하여 Enterprise Admins 권한으로 반영해준다.