> For the complete documentation index, see [llms.txt](https://www.pentestwiki.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://www.pentestwiki.com/post-exploit/undefined/rid-cycling.md).

# RID Cycling

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

## Abuse

<pre class="language-bash"><code class="lang-bash"><strong># impacket
</strong>impacket-lookupsid anonymous@&#x3C;target-ip> -no-pass 10000

<strong># nxc
</strong>nxc smb &#x3C;target-ip> -u '' -p '' --rid-brute 10000
</code></pre>

## Root Couse

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

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

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

{% code title="lsa\_QueryInfoPolicy Function" %}

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

{% endcode %}

{% code title="POLICY\_ACCOUNT\_DOMAIN\_INFO Structure" %}

```cpp
typedef struct _POLICY_ACCOUNT_DOMAIN_INFO {
  LSA_UNICODE_STRING DomainName;
  PSID               DomainSid;
} POLICY_ACCOUNT_DOMAIN_INFO, *PPOLICY_ACCOUNT_DOMAIN_INFO;
```

{% endcode %}

통신에 사용되는 lsa\_QueryInfoPolicy 함수에서는 인자로 InformationClass를 받는데, 이곳에 들어갈 수 있는 인자 중에는 POLICY\_ACCOUNT\_DOMAIN\_INFO 구조체가 있습니다.&#x20;

{% hint style="info" %}
공식 문서에서 규정하는 구조체 목록은 [이곳](https://learn.microsoft.com/ko-kr/windows/win32/api/ntsecapi/nf-ntsecapi-lsaqueryinformationpolicy)을 참고하세요.
{% endhint %}

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

<div><figure><img src="/files/GYdJffh43JEplUw36TCx" alt=""><figcaption><p>lsa_QueryInfoPolicy2 Request</p></figcaption></figure> <figure><img src="/files/z27P422DP2bIy2k2C1PO" alt=""><figcaption><p>lsa_QueryInfoPolicy2 Response</p></figcaption></figure></div>

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

<div><figure><img src="/files/fybZlbfEecpUU0C3xWYz" alt=""><figcaption><p>lsa_LookupSids Request</p></figcaption></figure> <figure><img src="/files/enAaM9oTvNTzO8iLkMHL" alt=""><figcaption><p>lsa_LookupSids Response</p></figcaption></figure></div>

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

## References

{% embed url="<https://learn.microsoft.com/ko-kr/windows-server/identity/ad-ds/manage/understand-security-identifiers>" %}

{% embed url="<https://learn.microsoft.com/en-us/windows/win32/api/lsalookup/ns-lsalookup-policy_account_domain_info?utm_source=chatgpt.com>" %}
