> 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/data-theft/active-directory/disabled-kerberoasting.md).

# Disabled Kerberoasting

마이크로소프트 설계에 의하면 서비스 계정이 SPN을 삭제하지 않고 비활성화 되더라도 TGS-REQ의 sname 필드를 검증하여 비활성화 된 계정은 거부되도록 되어 있습니다.

하지만 커버로스 설계의 검증 로직 미흡으로 인해 AS-REQ 단계에서 sname 필드에 비활성화 된 계정을 요청한다면 검증을 통과하여 티켓을 발급받을 수 있습니다.

## Abuse

<pre class="language-bash"><code class="lang-bash"><strong># 비활성화 계정의 spn 열거 및 획득
</strong>python3 disabledKerberoast.py -u 'mick3y' -p 'Password123!' -d contoso.com -dc-ip 192.168.1.11
python3 disabledKerberoast.py -u 'mick3y' -p 'Password123!' -d contoso.com -dc-ip 192.168.1.11 --request-user Administrator
</code></pre>

## Root Cause

<figure><img src="https://1400861083-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiA9eS35C4waXdT3c51bW%2Fuploads%2Fu0mgSnrhaD3yizxRNaru%2F4.png?alt=media&amp;token=79f81016-92ad-4481-8416-de34baa9afcf" alt=""><figcaption><p>as-req</p></figcaption></figure>

[AS Requested Service Tickets](/data-theft/active-directory/as-requested-service-tickets.md)에서 언급한 것과 같이 sname-string 필드는 cname과 동일한 구조체를 공유하기 때문에 spn을 소유한 계정이라면 spn을 모르더라도 계정 이름 자체로 서비스 티켓 발급이 가능합니다.

따라서 클라이언트가 커버로스 사전 인증 단계에서 요청하는 krbtgt/domain 형식은 spn을 소유한 krbtgt에 대한 서비스 티켓 요청입니다.

<figure><img src="https://1400861083-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiA9eS35C4waXdT3c51bW%2Fuploads%2FoMzqyHC0clCF7rDrqojf%2F9.png?alt=media&amp;token=87d1036d-2506-46a6-a1d7-5c43ddfb551d" alt=""><figcaption><p>krbtgt spn</p></figcaption></figure>

krbtgt는 서비스 티켓을 보유하고 있는 비활성 계정임에도 불구하고 클라이언트가 krbtgt에 대한 서비스 티켓을 요청할 수 있습니다.

<div><figure><img src="https://1400861083-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiA9eS35C4waXdT3c51bW%2Fuploads%2F6322z8Kc0ugMMXcxP6tT%2F5.png?alt=media&amp;token=0f3fe361-4965-4bd2-b2ad-e3a67cd54e40" alt=""><figcaption><p>kadmin/changepw TGS-REQ</p></figcaption></figure> <figure><img src="https://1400861083-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiA9eS35C4waXdT3c51bW%2Fuploads%2FekHqb0p4wEEMTeTlpMXj%2F6.png?alt=media&amp;token=2b6b9072-1ea6-425f-8d00-4e4e4c2d2ecf" alt=""><figcaption><p>kadmin/changepw TGS-REP</p></figcaption></figure></div>

이론상 krbtgt 계정이 다른 서비스 계정과 동일하다면, spn을 삭제하지 않고 비활성화된 계정의 서비스 티켓을 발급하여 패스워드 크랙하는 것이 가능합니다.&#x20;

가설을 검증하기 위해 disabled/spn을 서비스 계정에 할당한 채로 비활성화 한 뒤, tgs-req를 전송합니다.

<div><figure><img src="https://1400861083-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiA9eS35C4waXdT3c51bW%2Fuploads%2Fnu2dnjc0zQvypduujSuF%2F7.png?alt=media&amp;token=3c9f33ed-665f-4430-a08d-bb8b3accad54" alt=""><figcaption><p>disabled/spn TGS-REQ</p></figcaption></figure> <figure><img src="https://1400861083-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiA9eS35C4waXdT3c51bW%2Fuploads%2FBGpGhTQzQSywrq7QShL3%2F8.png?alt=media&amp;token=c1f82d46-f56b-4790-ad18-09e04b1c7aef" alt=""><figcaption><p>disabled/spn TGS-REP</p></figcaption></figure></div>

TGS-REP에서 확인할 수 있듯이 krbtgt는 일반 계정과 다른 특수한 계정이기 때문에 일반 비활성 서비스 계정에 대한 TGS-REQ는 거절당합니다. 원인은 kdcsvc.dll을 분석하여 확인 가능합니다.

<figure><img src="https://1400861083-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiA9eS35C4waXdT3c51bW%2Fuploads%2Fa1wc5IJZhN7S8gg9sNmO%2F3.png?alt=media&amp;token=f6bc9e54-7c54-4c82-b9b4-db834c91532f" alt=""><figcaption><p>kdcsvc.dll</p></figcaption></figure>

FillExtendedError 함수는 커버로스 오류를 반환하는 함수입니다. 해당 함수는 4가지 조건이 모두 만족될 때 실행됩니다.  두 번째 조건에서 502 값인지를 검증하는데, 이 값은 krbtgt의 RID 값입니다.

<figure><img src="https://1400861083-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiA9eS35C4waXdT3c51bW%2Fuploads%2Fb11s6moCdlksK9C6KUCr%2Fimage.png?alt=media&amp;token=a3857dec-f432-400d-847b-37afe11b9bc2" alt=""><figcaption><p>krbtgt RID</p></figcaption></figure>

이러한 조건문 때문에 krbtgt는 비활성 상태더라도 서비스 티켓이 정상적으로 발급되며, 일반 비활성 서비스 계정에 대한 티켓 요청은 거절되는 것입니다.

하지만 커버로스 오류를 반환하는 함수 FillExtendedError을 참조하는 함수를 보면 as-req에 관련된 것은 확인되지 않습니다.

<figure><img src="https://1400861083-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiA9eS35C4waXdT3c51bW%2Fuploads%2FRWZPKWBMOef4VZPd4trO%2F10.png?alt=media&amp;token=70e278ab-7908-4e73-a1a4-e2cd638c32a6" alt=""><figcaption><p>xrefs to FillExtendedError by IDA</p></figcaption></figure>

권한이 있는 계정으로부터 다음번 로그인 시 패스워드를 변경하도록 설정된 경우와, TGT 발급을 위해서 AS-REQ 과정에서도 서비스 티켓을 요청할 수 있다는 것은 이미 확인된 정보이기 때문에 AS-REQ를 통해 비활성화 된 서비스 티켓을 요청하면 커버로스 검증 로직을 우회하여 티켓 발급이 가능합니다.

실습을 위한 환경에서 disabledUser는 disabled/spn 서비스를 보유하고 있는 비활성 계정입니다.

<figure><img src="https://1400861083-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiA9eS35C4waXdT3c51bW%2Fuploads%2FuDp5XwrUf3urIyUqc1PR%2F11.png?alt=media&amp;token=389a6e77-0ccc-41aa-a3fe-6b1df011622d" alt=""><figcaption><p>disabledUser 정보</p></figcaption></figure>

<div><figure><img src="https://1400861083-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiA9eS35C4waXdT3c51bW%2Fuploads%2FYNtcBWToUSIIvSATp19r%2F12.png?alt=media&amp;token=8e641f84-d36d-48d8-b970-fb9cc75760ff" alt=""><figcaption><p>as-req</p></figcaption></figure> <figure><img src="https://1400861083-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FiA9eS35C4waXdT3c51bW%2Fuploads%2F7UXAKNXtlm0gNvpri2m6%2F13.png?alt=media&amp;token=a75a7aeb-c213-4499-aa21-a394eefe2064" alt=""><figcaption><p>as-rep</p></figcaption></figure></div>

발급된 티켓은 커버로스팅을 통해 얻는 서비스 티켓과 동일한 포맷을 갖기 때문에 해시캣 13100 모듈로 크랙이 가능합니다.
