Kerberoasting

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

Abuse

# spn을 가진 객체 열거
Get-ADUser -Filter {ServicePrincipalName -like "*"} -Properties ServicePrincipalName | Select-Object SamAccountName, ServicePrincipalName

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

Root Cause

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

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

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

searchRequest
searchResponse

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

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

TGS-REQ
TGS-REP

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

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

4769 이벤트

Last updated

Was this helpful?