當前位置:
首頁 > 新聞 > 對濫用Windows特權文件操作的研究(上)

對濫用Windows特權文件操作的研究(上)

本文介紹了如何濫用Windows上的特權進程執行文件,來實現本地許可權升級(從用戶升級到管理員/系統許可權)。除此之外,我還介紹了利用這類漏洞的可用技術、工具和具體過程。

特權文件操作漏洞

以高許可權運行的進程會對所有進程中執行的文件執行操作,這意味著,當高許可權進程在沒有足夠預防措施的情況下,可以訪問用戶控制的所有文件或目錄。因此,從理論上說,這就是一個安全漏洞,因為惡意攻擊者有可能會濫用該特權進程執行的操作,使特權文件做一些不應該做的事情。對於許多特權訪問用戶控制的資源的情況都是如此,文件只是一個簡單的目標。

在滲透測試中,大家熟知的示例包括用戶可寫的服務可執行文件和DLL劫持漏洞,如果你對特權服務將執行的文件具有寫入許可權,或者對它將在其中查找DLL的目錄具有寫入許可權,那麼你可以在這個特權進程中執行有效載荷。不過,以上舉例的這個漏洞已經眾所周知了,除了偶爾的配置漏洞發生之外,一般的防護軟體都可以對它進行預防了。

然而,其他文件系統操作的潛在濫用似乎不那麼為人所知了,但同樣和以上所說的漏洞一樣危險。如果你可以讓一個特權進程為你創建、複製、移動或刪除任意文件,那麼使用system函數來調用shell腳本的漏洞就離你不遠了。

此外,由於這些都是邏輯漏洞,它們通常非常穩定(不涉及內存損壞),通常能夠在代碼重構中存活(只要文件操作邏輯不變),並且無論處理器體系結構如何,它們都以完全相同的方式被濫用。對攻擊者來說,這些功能非常有價值。

漏洞的尋找過程

用戶可寫的位置

雖然大多數特權程序不會直接操作一些非特權用戶的文件(有些例外,如AV),但許多程序會對可能位於用戶可以操作的某個位置的文件執行操作。非特權用戶在以下一些位置,是具有某種形式的寫入許可權的:

1.用戶自己的文件和目錄,包括其AppData和Temp文件夾,如果你足夠幸運或運行AV,某些特權進程可能會使用;

2.公眾用戶的文件和目錄:idem;

3.在C:\中創建的目錄具有默認ACL(訪問控制列表):默認情況下,在分區根目錄中創建的目錄具有允許用戶寫入的許可ACL;

4.具有默認ACL的C:\ ProgramData子目錄:默認情況下,用戶可以創建文件和目錄,但不能修改現有文件和目錄,這通常是第一個看的位置;

5. C:\ Windows \ Temp的子目錄:默認情況下,用戶可以創建文件和目錄,但不能修改現有文件和目錄,也不能讀取其他用戶創建的文件/訪問目錄。有意查看安裝程序和準時運行的其他特權軟體和腳本,而不檢查預先存在的文件和目錄;

你可以使用特定的工具和命令(例如SysInternals的AccessChk,icacls或PowerShell的Get-Acl)檢查文件許可權,也就可以使用瀏覽器的「安全」選項卡來檢查文件許可權,「高級」表單具有「有效訪問」選項卡,允許列出特定帳戶或組對其的訪問許可權該文件/目錄(如AccessChk在命令行上執行)。下面的屏幕截圖顯示了在C:\ProgramData目錄上授予用戶組的(默認)訪問許可權:

尋找特權文件操作

要查找特權進程執行的文件操作的示例,我們可以簡單地使用SysInternals的ProcMon,Procmon是微軟出品用於監視Windows系統里程序的運行情況,監視內容包括該程序對註冊表的寫入、對文件的寫入、網路的連接、進程和線程的調用情況,procmon是一款超強的系統監視軟體。Procmon為感興趣的進程過濾文件事件,當我們看到它訪問用戶可控制的文件和目錄時,就可以檢查該進程是否使用模擬客戶端來實現這一點。

一旦我們發現在用戶/用戶可控制的文件和目錄上,可以執行對一些文件的操作,我們就需要一種方法來劫持這些操作,進而實施攻擊。

值得慶幸的是,James Forshaw (@tiraniddo )通過他在NTFS文件系統和Windows內部的開創性工作完成了所有繁重工作,他在眾多文章中發表了其中的技術細節。他提出了幾種濫用Windows文件系統和路徑解析功能的技術(以下我會詳細介紹),並在開源的symboliclink-test -tools toolkit和NtApiDotNet庫中實現了這些技術。他的技術和工具包為許多測試人員(包括我自己)打開了一扇尋找這種類型的漏洞的門,讓這些漏洞的利用成為可能。

NTFS 交叉

交叉是一個NTFS功能,它允許將目錄設置為文件系統的安裝點(mount point),就像Unix中的安裝點一樣,但是也可以設置為解析到另一個目錄(在同一個或另一個文件系統上)。在本文在,我們可以把它們看作是一種只包含目錄的符號交叉。

有趣的是,在大多數情況下,路徑解析將遵循 交叉規則(除非明確設置參數以防止這種情況),因此在上面的設置中,嘗試打開C:\ Dir \ file.txt的程序實際上將打開C:\ Other \ file.txt。

連接可以由非特權用戶創建,由於它們可以跨卷工作,因此你也可以將C:\Dir「重定向」到D:\OtherDir。如果你具有對現有目錄的寫入權,則可以將其轉換為 交叉,但必須為空。

NTFS交叉是用重解析點(reparse points)實現的,雖然內置工具不允許這樣做,但是可以通過設置自定義重解析點的實現將它們解析為任意路徑。CreateMountPoint工具允許你完成重解析點實現,對於常規 交叉,你還可以將mklink和PowerShell的New-Item與-Type Junction參數一起使用。

NTFS重解析點(Reparse Points)

隨Windows 2000發布的NTFS版本5里最有趣的一個屬性是引入了一些特殊的文件系統功能,並應用於特定的文件或目錄上。這些特殊功能使NTFS文件系統更加強大和有擴展性。這個特性的實現基礎叫做重解析點(reparse points)。

重解析點的使用源於一些應用程序想把一些特殊數據存儲到特殊的地方——重解析點,然後由應用程序做上特殊的標記,只允許它使用。為此文件系統引入了一個應用程序相關的特殊過濾器(application-specific filter),並與重解析點的標記關聯起來。多個應用程序可以把不同的數據存儲到同一個重解析點文件里,只要使用不同的標記。微軟保留了幾個標記為自己使用。

現在我們假設用戶打算訪問一個有標記的重解析點文件。當文件系統打開文件時,發現有重解析點關聯到這個文件,於是「重解析」這個打開文件請求,發現與應用程序相關聯的可用過濾器,並與這個重解析點進行匹配,通過後就可以把重解析點的數據傳送給這個過濾器了。過濾器於是可以把這些數據用於任何途徑,依賴於應用程序最初的定義。這是一個非常靈活的系統:應用程序不需關心重解析點是如何工作的,重解析點的實現細節對於用戶是完全透明的。你只需簡單的放入和拿出數據,其餘的事情都是自動完成,這使文件系統的功能大大增強了。

微軟使用重解析點在Windows 2000里實現了如下的功能:

1. 符號鏈接(Symbolic Links):符號鏈接允許你創建一個指向其他地方某個文件的指針。NTFS並沒有像UNIX文件系統那樣實現「真正」的文件符號鏈接,但是從功能上重解析點完全可以模擬得一模一樣。本質上,NTFS的符號鏈接就是一個重解析點,把對一個文件的訪問轉移到另一個文件身上。

2. 交叉點(Junction Points):交叉點和符號鏈接類似,只不過對象是目錄而不是文件。

3.卷裝載點(Volume Mount Points):卷裝載點和前2者類似,只是更進一層:它能創建對整個卷的鏈接。比如,你可以為可移動硬碟或其他存儲介質創建卷裝載點,或者讓本地的不同分區(C:,D:,E:等等)看起來就像在一個卷里一樣。這對於那些大型的CD-ROM伺服器非常有用,如果沒有卷裝載點,它們就只能為每張磁碟人工維護一個分區字母。

4.遠程存儲伺服器(RSS:Remote Storage Server):Windows 2000的這個特性能利用一些規則來移除NTFS卷上不常用的文件,放到存檔介質里(比如CD-RW或磁帶)。當它把文件移出到「下線」或「半下線」的存儲介質上時,RSS自動創建指向這個存檔文件的重解析點,以備日後使用。

硬鏈接 (hard link)

我們都知道文件都有文件名與數據,這在 Linux 上被分成兩個部分:用戶數據 (user data) 與元數據 (metadata)。用戶數據,即文件數據塊 (data block),數據塊是記錄文件真實內容的地方;而元數據則是文件的附加屬性,如文件大小、創建時間、所有者等信息。在 Linux 中,元數據中的 inode 號(inode 是文件元數據的一部分但其並不包含文件名,inode 號即索引節點號)才是文件的唯一標識而非文件名。文件名僅是為了方便人們的記憶和使用,系統或程序通過 inode 號尋找正確的文件數據塊。

為解決文件的共享使用,Linux 系統引入了兩種鏈接:硬鏈接 (hard link) 與軟鏈接(又稱符號鏈接,即 soft link 或 symbolic link)。鏈接為 Linux 系統解決了文件的共享使用,還帶來了隱藏文件路徑、增加許可權安全及節省存儲等好處。若一個 inode 號對應多個文件名,則稱這些文件為硬鏈接。換言之,硬鏈接就是同一個文件使用了多個別名(見 圖 2.hard link 就是 file 的一個別名,他們有共同的 inode)。硬鏈接可由命令 link 或 ln 創建。如下是對文件 oldfile 創建硬鏈接。

由於硬鏈接是有著相同 inode 號僅文件名不同的文件,因此硬鏈接存在以下幾點特性:

·文件有相同的 inode 及 data block;

·只能對已存在的文件進行創建;

·不能交叉文件系統進行硬鏈接的創建;

·不能對目錄進行創建,只可對文件創建;

刪除一個硬鏈接文件並不影響其他有相同 inode 號的文件。

所以,非特權用戶還可以創建硬鏈接,與Unix對應的硬鏈接一樣,將作為現有文件的附加路徑。它不能在目錄上工作,也不能跨卷工作(對於硬鏈接來說沒有意義)。

此外,內置工具不允許你創建到沒有寫入許可權的文件的硬鏈接,但是實際的系統調用允許你使用打開供讀取的文件來創建硬鏈接。使用symboliclink-test -tools中的CreateHardLink工具(或Ruben Boonen編寫的這個PowerShell腳本)創建指向你沒有寫入許可權的文件的硬鏈接。

注意,如果沒有對文件的寫入許可權,就不能刪除創建的鏈接。另外,這項技術在即將發布的Windows 10中得到了緩解。

本文我們對特權文件操作的原理和可能發生漏洞的地方,進行了理論上的分析。下文我們接著將對象管理器(ObjectManager)符號鏈接以及漏洞利用的示例和思路。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 嘶吼RoarTalk 的精彩文章:

後邊界時代驟增的移動安全風險探析

TAG:嘶吼RoarTalk |