RID Cycling

RID Cycling은 도메인/컴퓨터 단위로 생성되는 랜덤한 RID 값과, 순차적으로 올라가는 SID의 조합을 보안 식별자로 사용하는 Windows 속성을 이용하여 RID를 획득하였을 때 객체 열거 권한이 없음에도 무차별 대입 공격으로 정보를 획득할 수 있는 열거 공격입니다.

Abuse

# impacket
impacket-lookupsid anonymous@<target-ip> -no-pass 10000

# nxc
nxc smb <target-ip> -u '' -p '' --rid-brute 10000

Root Couse

Windows 환경에서 보안 식별자의 단위인 SID는 하이픈(-)을 기준으로 가장 마지막 숫자를 RID라고 칭하며 이는 하위 권한 값입니다. RID 필드를 제외한 나머지 SID는 같은 컴퓨터와 도메인을 기준으로 모두 동일한 값을 가지고 있습니다.

SID 값은 랜덤한 값으로 생성되기 때문에 우연히 맞추는 건 불가능에 가깝지만, SID 값을 획득할 수 있다면 RID 값은 랜덤하지 않고 순차적으로 올라간다는 규칙을 악용하여 사용자 계정 이름을 가져오는 것이 가능합니다.

Windows에는 Local Security Authority(LSA) 정보를 원격으로 조회하기 위해 LsaQueryInformationPolicy 함수를 지원합니다. 언급했듯 SID는 원래 보안 식별자이므로 LSA 쿼리를 통해 원격으로 질의할 수 있습니다.

lsa_QueryInfoPolicy Function
NTSTATUS LsaQueryInformationPolicy(
  [in]  LSA_HANDLE               PolicyHandle,
  [in]  POLICY_INFORMATION_CLASS InformationClass,
  [out] PVOID                    *Buffer
);

통신에 사용되는 lsa_QueryInfoPolicy 함수에서는 인자로 InformationClass를 받는데, 이곳에 들어갈 수 있는 인자 중에는 POLICY_ACCOUNT_DOMAIN_INFO 구조체가 있습니다.

공식 문서에서 규정하는 구조체 목록은 이곳을 참고하세요.

lsa_QueryInfoPolicy2 패킷을 확인하면 InformationClass 인자로 도메인 정보를 요청하는 것을 확인할 수 있습니다.

lsa_QueryInfoPolicy2 Request
lsa_QueryInfoPolicy2 Response

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

lsa_LookupSids Request
lsa_LookupSids Response

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

References

Last updated