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에서는 활성 상태인 사용자 계정 user-A와 일치하는 것 중에 SPN이 존재하는지를 질의하며, searchResponse에서는 존재할 경우 해당 객체에 대한 정보를 제공합니다.
응답에서 객체 정보가 포함된다면 해당 계정에는 커버로스팅이 가능하기 때문에 AS-REQ/AS-REP를 통해 사전 인증을 하고 서비스 티켓을 요청합니다.


커버로스팅은 도메인에 등록된 서비스를 인증받은 사용자 계정을 통해 요청하는 정상적인 행위이며 취약점으로 분류되지 않습니다. 또한 이러한 행위를 한다고 해서 서버의 가용성에 지장이 가지는 않습니다.
하지만 모든 커버로스 TGS-REQ는 4769 보안 이벤트 로그를 생성하기 때문에 무분별한 티켓 요청은 관제팀에 의해 탐지될 수 있습니다.

Last updated
Was this helpful?