SID History
Last updated
Was this helpful?
Last updated
Was this helpful?
SID는 Security Identifier로 Windows와 Active Directory 환경에서 사용자, 그룹, 컴퓨터 계정 등에 부여되는 고유 식별자입니다. 사용자가 로그인 하면 SID가 엑세스 토큰에 포함되며, 이후 이 토큰의 SID를 참조하여 리소스에 대한 접근 권한을 결정합니다.
서로 다른 도메인 간에 신뢰 관계가 있는 상황을 가정하겠습니다. 사용자 계정과 같은 도메인 객체가 다른 도메인으로 마이그레이션되는 상황이 발생하면 도메인마다 객체를 식별하는 고유한 값인 SID가 변경됩니다. 기존의 사용자 SID는 마이그레이션이 되기 이전의 도메인 A에 대한 SID 권한 정보이기 때문에, 만약 SID가 도메인 B에서 할당해주는 고유한 SID로 변경되지 않을 경우 사용자는 도메인 B에 대한 리소스 접근 권한이 아예 없기 때문입니다.
이렇게 서로 다른 도메인 간의 마이그레이션 상황을 위해서 사용자가 다시 도메인 A의 리소스로 엑세스 했을 때 이전 SID 정보를 통해 접근을 허가하기 위해 SID History 개념이 생겼습니다.
언급한 문제를 해결하기 위한 해결책으로 SID History가 도입되었는데, 이를 통해서 어떻게 외부 도메인으로 마이그레이션 된 사용자가 기존의 도메인 리소스에 접근이 가능한지 순차적으로 보겠습니다.
도메인 A의 사용자는 도메인 B로 마이그레이션되며 새로운 SID를 할당받음
사용자에 대한 도메인 B의 새로운 SID가 덮어써지기 전에, SID History에 기존의 SID를 저장함
사용자는 신뢰 관계에 있는 환경에서 SID History를 이용하여 이전 엑세스 권한을 보존함
부모-자식 신뢰 관계 모델에서는 SID History에 대한 필터링 기능이 비활성화이기 때문에 공격자들은 자식 도메인을 장악하여 SID에 대한 정보를 조작할 수 있는 관리자 권한을 획득한 뒤, 부모 도메인에서의 관리자 권한을 탈취할 수 있습니다.
기존의 매커니즘이라면 부모 도메인 객체가 자식 도메인으로 마이그레이션이 되었을 때, 다시 부모 도메인의 리소스에 대한 접근 권한을 위해 기존 부모 도메인에서 발급되었던 SID를 유지하는 기능입니다. 하지만 부모 도메인의 관리자 그룹 SID와PAC을 변경할 권한인 자식 도메인 관리자 권한을 확보한 공격자는 자식 도메인 객체의 PAC 정보를 수정하여 SID History 내역에 부모 도메인 관리자 그룹 SID를 추가할 수 있습니다. 따라서 공격자가 악용할 자식 도메인의 객체는 원래 부모 도메인에서 자식 도메인으로 마이그레이션이 된 적 없는 객체일지라도, 부모 도메인 컨트롤러 입장에서는 그런 과정을 거쳤던 객체로 인식하여 접근을 허용합니다.
위와 같은 SID History를 이용한 공격은 자식 도메인에서의 관리자 권한이 요구되지만, 만약 이러한 권한이 없더라도 부모 도메인 리소스의 접근 권한을 이용해 ASRep-Roasting 혹은 Kerberoasting 공격을 수행할 수도 있습니다. 또한 부모 도메인의 객체가 자식 도메인의 Unconstrained Delegation이 위임된 계정에 접근한 경우 해당 머신의 메모리엔 부모 도메인의 TGT 사본이 캐시되어 있기 때문에 이를 통한 측면 이동도 가능합니다.
앞서 설명한 것과 같이 이러한 마이그레이션 이전 SID를 통한 접근 권한 악용은 부모-자식 관계의 포레스트 환경에서만 악용할 수 있습니다. 기본적으로 Active Directory에서 이러한 신뢰 관계 외에 새롭게 구축된 관계에서는 SID Filtering 기능이 활성화 상태이기 때문에, 이전의 SID History를 갖고 있더라도 현재 도메인에서 적용되는 SID 양식이 아니면 무시하기 때문입니다. 물론 보안 담당자의 실수 혹은 고의로 다른 포레스트 관계에서도 이러한 보안 기능이 비활성화 되어있을 수도 있다는 가능성은 염두해두어야 합니다.