【Windows Internal】Mount Point
Mount Point 是 tag 為 IO_REPARSE_TAG_MOUNT_POINT(0xA0000003)的 Reparse Point,
可以把整個目錄搬到指令位置,例如 C:\dummy 設成指向 C:\Windows\System32後,
C:\dummy\osk.exe 就會指向 C:\Windows\System32\osk.exe。
.
最重要的是 只需要對自己的目錄有寫入權(GENERIC_WRITE) 就好,不用管理員權限。
組成&應用
mount point 與 symbolic link 最大的差異,是 PoC 能從一般使用者權限啟動。
目標必須是本機磁碟上的目錄,
且解析在核心層完成(junction 與 volume mount point 都用這個 tag)。
.
與 symbolic link 的差異:
| Mount point / Junction | Symbolic link(目錄) | |
|---|---|---|
| Reparse tag | IO_REPARSE_TAG_MOUNT_POINT(0xA0000003) | IO_REPARSE_TAG_SYMLINK(0xA000000C) |
| 目標 | 只能是本機目錄/磁碟區 | 檔案或目錄、本機或 UNC 網路路徑皆可 |
| 建立時目標須存在 | 是(核心立即解析) | 否(允許 dangling,解析時才失敗) |
| 建立所需權限 | 對目錄本身有寫入權即可,不需管理員 | SeCreateSymbolicLinkPrivilege(預設僅管理員;或開啟開發人員模式) |
| 建立工具 | mklink /j | mklink /d |
dir 顯示 | <JUNCTION> | <SYMLINKD> |
也可以特別注意一點:
Mount Point 有可覆寫性,同一個目錄上可以直接寫新的上去,
一次 FSCTL_SET_REPARSE_POINT 就完成了,不用先刪除。
實作例子
以下全程一般使用者權限即可完成(mklink 是 cmd 內建命令):
mklink /j C:\test-mp C:\Windows\System32
Junction created for C:\test-mp <<===>> C:\Windows\System32
驗證「兩個名字、同一個檔案」——從 junction 路徑存取 System32 的 osk.exe:
dir C:\test-mp\osk.exe
Directory of C:\test-mp
2025/09/10 14:00 1,138,688 osk.exe
1 File(s) 1,138,688 bytes
確認它的真實身分是 mount point(tag 0xA0000003):
fsutil reparsepoint query C:\test-mp
Reparse Tag Value : 0xa0000003
Tag value: Microsoft
Tag value: Name Surrogate
Tag value: Mount Point
Substitute Name: \??\C:\Windows\System32
Print Name: C:\Windows\System32
用完記得清掉:
rd C:\test-mp
rd(不帶 /s)只移除 junction 本身,不動目標目錄。
切勿用會遞迴刪除的工具處理 junction,部分工具(像是 rmdir /s 或某些檔案管理操作)會順著 junction 刪到目標目錄的內容,
刪了 C:\Windows\System32 你電腦大概也沒了 GG。