這幾篇的內容除了複習 James Forshaw 在 2017 的 workshop Introduction to Logical Privilege Escalation on Windows
,還會加入一些我知道的有趣手法。
今天這篇想講的是 Windows 在 File System 的 Path Canonicalization (or Path Nornalization),也就是 Windows 如何解析這些路徑,在解析的過程中又有哪些是會被濫用的設計。(其實會有種在繞 WAF 的感覺 XD)
根據 James Forshaw 的投影片,告訴了我們以下內容:
之前我曾經介紹過 Windows 中有各式各樣的 Objects,而這些 Objects 實際上是有 namespace 的管理機制,讓系統和使用者能夠以不同的形式存取相同的 object。
以下是一些常見的重要 Object Directories:
\Device
\GLOBAL
\BaseNamedObjects
\Sessions\X
\Session\0\DosDevices
DosDevices
目錄\??
DosDevices
目錄Windows 也會有以下路徑表示的方式:
some\path
C:\some\path
\\.\C:\some\path
\\?\C:\some\path
\\server\share\path
在檔案路徑解析的過程中,路徑會被不斷地轉換:
投影片中也提到了,一些路徑轉換的結果:
c:\path\../badgers
→ c:\badgers
c:\..\d:/badgers
→ c:\d:\badgers
\\.\c:\path\../badgers
→ c:\badgers
\\.\c:\..\d:/badgers
→ d:\badgers
\\?\c:\..\d:/badgers
→ c:\path\../badgers
另外,我也發現了這些轉換:
C:\progra~1\
→ C:\Program Files\
C:\progra~2\
→ C:\Program Files (x86)\
C:\Windows \
→ C:\Windows\
C:/Windows\
→ C:\Windows\
知道這些等價的路徑轉換可以讓我們在不同的架構中嘗試如何繞過一些限制或防護。
在 Windows NTFS 中還有一個有趣的機制 Symbolic Link。
然而我們很常將 Symbolic Link, Hard Link, Junctions 混為一談,根據這篇文章,分別比較他們的不同:
可以使用 mklink.exe 來建立這三種 Link
在 folder1 新增一個 aaa.txt 內容是 aaa,並新增3種 Link,印出內容
將 folder1\aaa.txt 移動到 folder2\aaa.txt 後,只有 hardlink 還可以印出檔案
然而將3個 Link 刪除後並不會刪除 folder1\aaa.txt
LoadLibrary
會負責將 DLL 載入當前 Process 的 memory,並且會傳載入後的 imagebase。
然而 LoadLibrary 本身的設計會有一些問題:
.dll
的話會補上 .dll
LoadLibrary("kernel32")
和 LoadLibrary("kernel32.dll")
得到的效果是一樣的然而在實際應用上,根據不同的情境會有不同的效果,很多的路徑轉換只侷限在該 Windows API 中,像是 PrinterSpoofer 的 NamedPipe impersonate 或是 Mini-Filter 對 NTFS reparsing point 的處理都會有不同的濫用方法。
下一篇,我將會介紹在 Windows 中的 TOCTOU 攻擊方式!