> 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/kerberoasting.md).

# Kerberoasting

커버로스팅은 AD Kerberos 동작 과정에서 서비스 티켓이 서비스 주체의 패스워드 해시로 암호화되는 설계를 악용하여, 서비스 티켓을 발급받은 뒤, 오프라인 해시 크랙으로 평문 패스워드를 알아내는 공격입니다.

## Abuse

{% tabs %}
{% tab title="Windows" %}

<pre class="language-powershell"><code class="lang-powershell"><strong># spn을 가진 객체 열거
</strong>Get-ADUser -Filter {ServicePrincipalName -like "*"} -Properties ServicePrincipalName | Select-Object SamAccountName, ServicePrincipalName

<strong># 선택적 커버로스팅
</strong>.\Rubeus.exe kerberoast /user:user-B /nowrap
</code></pre>

{% endtab %}

{% tab title="UNIX" %}

<pre class="language-bash"><code class="lang-bash"><strong># spn을 가진 객체 열거
</strong>ldapsearch -x -H ldap://192.168.1.11 -D 'user-A@contoso.com' -w 'Password123!' -b 'dc=contoso,dc=com' "(&#x26;(objectCategory=user)(servicePrincipalName=*))" servicePrincipalName sAMAccountName

<strong># 선택적 커버로스팅
</strong>impacket-GetUserSPNs contoso.com/user-A:'Password123!' -dc-ip 192.168.1.11 -request-user user-B
</code></pre>

{% endtab %}
{% endtabs %}

## Root Cause

SPN은 도메인에서 등록한 서비스를 나타내는 속성이며, 도메인에 등록된 SPN에는 모든 도메인 사용자가 별도의 권한 검증 없이 접근할 수 있습니다. 따라서 특정 서비스를 누구에게는 보여주고 누구에게는 안 보여주는 행위는 불가능합니다.&#x20;

<figure><img src="/files/Zx6lngak5ySIszmBOOYR" alt=""><figcaption><p><a href="https://www.tarlogic.com/blog/how-kerberos-works/">https://www.tarlogic.com/blog/how-kerberos-works</a></p></figcaption></figure>

서비스 티켓 요청을 요청했을 때 KDC(Key Distribution Center)는 서비스 티켓 자체를 서비스 주체의 패스워드 해시로 암호화 하여 전달합니다. 이러한 매커니즘 덕분에 누구나 높은 권한의 사용자가 등록한 SPN에 접근하여 해당 계정의 패스워드 해시를 가져올 수 있습니다.

GetUserSPNs.py를 사용하면 LDAP 바인딩을 위한 NTLM 인증 후 아래와 같은 LDAP 쿼리를 전송합니다.

<div><figure><img src="/files/71dLKYc8c3nXLEQ3YWzH" alt=""><figcaption><p>searchRequest</p></figcaption></figure> <figure><img src="/files/TxiFnqKpwlpe78GTe1W0" alt=""><figcaption><p>searchResponse</p></figcaption></figure></div>

searchRequest에서는 활성 상태인 사용자 계정 user-A와 일치하는 것 중에 SPN이 존재하는지를 질의하며, searchResponse에서는 존재할 경우 해당 객체에 대한 정보를 제공합니다.

응답에서 객체 정보가 포함된다면 해당 계정에는 커버로스팅이 가능하기 때문에 AS-REQ/AS-REP를 통해 사전 인증을 하고 서비스 티켓을 요청합니다.

<div><figure><img src="/files/zGhInNIn28lB08eFeFdb" alt=""><figcaption><p>TGS-REQ</p></figcaption></figure> <figure><img src="/files/aWjzxDhqg4i3eArTegbu" alt=""><figcaption><p>TGS-REP</p></figcaption></figure></div>

커버로스팅은 도메인에 등록된 서비스를 인증받은 사용자 계정을 통해 요청하는 정상적인 행위이며 취약점으로 분류되지 않습니다. 또한 이러한 행위를 한다고 해서 서버의 가용성에 지장이 가지는 않습니다.

하지만 모든 커버로스 TGS-REQ는 4769 보안 이벤트 로그를 생성하기 때문에 무분별한 티켓 요청은 관제팀에 의해 탐지될 수 있습니다.

<figure><img src="/files/nJcJ9hOrW8XwAbMYR6F8" alt=""><figcaption><p>4769 이벤트</p></figcaption></figure>
