RID Cycling
Windows 환경에서 보안 식별자의 단위인 SID는 하이픈(-)을 기준으로 가장 마지막 숫자를 RID라고 칭하며 이는 하위 권한 값입니다. RID 필드를 제외한 나머지 SID는 같은 컴퓨터와 도메인을 기준으로 모두 동일한 값을 가지고 있습니다.
일반적인 개인 PC 환경에서는 해당 PC에 존재하는 모든 계정은 같은 SID 값을 공유하며, AD 환경에서 도메인 객체는 모두 같은 SID를 공유하되, 도메인에 속한 컴퓨터 계정은 로컬 SID를 따로 공유합니다.
SID 값은 랜덤한 값으로 생성되기 때문에 브루투포스 등의 공격으로 맞추는 건 불가능에 가깝지만, SID 값을 획득할 수 있다면 RID 값은 랜덤하지 않고 순차적으로 올라간다는 규칙을 악용하여 사용자 계정 이름을 가져오는 것이 가능합니다.
Abuse
# impacket
impacket-lookupsid anonymous@<target-ip> -no-pass 10000
# nxc
nxc smb <target-ip> -u '' -p '' --rid-brute 10000
Root Couse
Windows에는 Local Security Authority(LSA) 정보를 원격으로 조회하기 위해 LsaQueryInformationPolicy 함수를 지원합니다. 언급했듯 SID는 원래 보안 식별자이므로 LSA 쿼리를 통해 원격으로 질의할 수 있습니다.
NTSTATUS LsaQueryInformationPolicy(
[in] LSA_HANDLE PolicyHandle,
[in] POLICY_INFORMATION_CLASS InformationClass,
[out] PVOID *Buffer
);
typedef struct _POLICY_ACCOUNT_DOMAIN_INFO {
LSA_UNICODE_STRING DomainName;
PSID DomainSid;
} POLICY_ACCOUNT_DOMAIN_INFO, *PPOLICY_ACCOUNT_DOMAIN_INFO;
통신에 사용되는 lsa_QueryInfoPolicy 함수에서는 인자로 InformationClass를 받는데, 이곳에 들어갈 수 있는 인자 중에는 POLICY_ACCOUNT_DOMAIN_INFO 구조체가 있습니다.
lsa_QueryInfoPolicy2 패킷을 확인하면 InformationClass 인자로 도메인 정보를 요청하는 것을 확인할 수 있습니다.


응답을 보면 앞서 확인한 POLICY_ACCOUNT_DOMAIN_INFO 구조체와 동일한 포맷으로 값을 반환하는 것이 확인됩니다. 상용 도구에서 RID Cycling 공격 시 이렇게 획득한 도메인 SID의 뒤에 RID 값을 순차적으로 올려가며 무차별 대입 공격을 하는 것입니다.


서버에서는 클라이언트가 질의한 SID의 결과에 대해 매핑되는 객체 이름을 반환해줍니다.
References
Last updated
Was this helpful?