從hash傳遞攻擊談相關Windows安全機制
前言
path-the-hash,中文直譯過來就是hash傳遞,在域中是一種比較常用的攻擊方式。在網上所找到的資料,大多數是介紹如何實現此類攻擊,但對于它背后所隱藏的關于Windows安全機制的一些知識,卻鮮有探討。本文的目的就是從pass-the-hash這一古老的話題切入,由攻擊過程中Windows的行為引出它背后的安全機制,讓大家對Windows有更深入的了解。
攻擊方式
通常來說,pass-the-hash的攻擊模式是這樣的:
獲取一臺域主機高權限
利用mimikatz等工具導出密碼hash
用導出的hash嘗試登陸其他域主機
下面簡單演示一下一般的攻擊方法:
mimikatz抓取密碼
傳遞hash
可以看到,已經能夠訪問到遠程的機器了。
一個試驗引出的問題
雖然pth是一個比較老的套路了,但實際上關于這個話題能談到的還有很多。其中值得注意的包括微軟發布的補丁kb2871997。據說這個補丁能夠阻止pth,并且還能阻止mimikatz抓取明文密碼。
有意思的是,事情并不是那么簡單,我們做一個實驗:
攻擊機:192.168.1.109
windows server 2008 r2
靶機:192.168.1.103
windows server 2008 r2
這里有兩點需要注意,一是pth所使用的賬戶User并不是RID為500的賬戶,但它是本地管理員組的成員,二是這并非在域環境中進行實驗,所有的賬戶都不是域賬戶
首先在靶機上查看一下補丁情況
可以看到,沒有安裝kb2871997
然后在攻擊機上傳遞hash
提示拒絕訪問
接下來我們再嘗試以RID為500的Administrator用戶pth,
這下成功了。那如果我們在域環境下,使用域賬戶情況又如何呢?
這次使用域賬戶User,User是一個RID非500的域管理員組成員
從上面的實驗中我們可以得出一個結論:即便沒有打KB2871997,windows server 2008 r2依然阻止了RID非500,也即非內置管理員賬戶的遠程登陸,但這條規則對于域賬戶并不適用。下面我們來深入探究原因。
UAC與令牌完整性
微軟在文章Description of User Account Control and remote restrictions in Windows Vista中提到:
When a user who is a member of the local administrators group on the target remote computer establishes a remote administrative connection…they will not connect as a full administrator. The user has no elevation potential on the remote computer, and the user cannot perform administrative tasks. If the user wants to administer the workstation with a Security Account Manager (SAM) account, the user must interactively log on to the computer that is to be administered with Remote Assistance or Remote Desktop.
根據微軟的描述,當一個本地管理員組的用戶遠程登陸時,它不是以一個“完全”的管理員身份登陸。什么是“完全”呢?
在Pass-the-Hash Is Dead(強烈推薦!)中,有這么一段話:
for any non-RID 500 local admin account remotely connecting to a Windows Vista+ machine, whether through WMI, PSEXEC, or other methods, the token returned is “filtered” (i.e. medium integrity) even though the user is a local administrator. Since there isn’t a method to remotely escalate to a high-integrity context, except through RDP (which needs a plaintext password unless ‘Restricted Admin’ mode is enabled) the token remains medium integrity. So when the user attempts to access a privileged resource remotely, e.g. ADMIN$, they receive an “Access is Denied” message despite technically having administrative access. I’ll get to the RID 500 exception in a bit
以作者的觀點來看,返回的令牌被過濾了,它僅有一個“中等完整性”。也就是說,這個令牌不是“完全”的。這里的完全,就是指令牌的完整性級別。
完整性級別
“……完整性級別能夠修改自主訪問行為,以便區分以同一用戶身份運行,并被同一用戶擁有的不同進程和對象,從而提供在同一用戶賬戶內隔離代碼和數據的能力。強制完整性級別(MIC,mandatory integrity control)機制通過把調用者關聯到一個完整性級別,讓SRM能夠得到調用者自身屬性的更詳細信息。它給要訪問的對象定義了一個完整性級別,從而指出了要訪問該對象的調用者必須擁有的信任信息。” ——《深入解析windows操作系統 第六版(上冊)》.P.487
以我的理解來講,當一個用戶登陸到windows操作系統中時,所屬他的進程在訪問不同的對象時,操作系統必須確認它有訪問此對象的權限。通過賦予完整性級別這一屬性,各對象能夠被區分開,并能控制訪問的行為。完整性級別是通過一個SID來指定的,系統使用了五個主要級別:
既然以SID的方式定義了完整性級別,那么它就應該存在于用戶的令牌中。一個訪問令牌的基本結構如下:
實際上,代表完整性級別的SID包含在組SID中。一個進程或線程擁有一個令牌,當它請求訪問一個對象時,Windows內核中的SeAccessCheck函數會進行完整性檢查。如果它的完整性級別等于或高于請求的對象,它就可以對此對象進行寫入操作。但當一個進程或線程想要打開另一個進程或線程時,它不僅要滿足完整性檢查,還要擁有DACL的授權。
進程與對象的訪問權
UAC
UAC大家應該都很熟悉。簡單來說,UAC的目的就是讓用戶以標準的權限,而非管理員權限來執行操作。它能夠在一定程度上阻止惡意軟件的運行。在我們的印象中,UAC似乎只是對本地使用計算機進行了限制,但事實上,微軟也考慮了UAC對遠程登陸的安全限制。在微軟的知識庫文章中,它認為應該保護本地管理員免受來自網絡的攻擊,因此對網絡施加了UAC限制。同時,微軟也提到了:
A user who has a domain user account logs on remotely to a Windows Vista computer. And, the domain user is a member of the Administrators group. In this case, the domain user will run with a full administrator access token on the remote computer, and UAC will not be in effect.
在我們的實驗中,由于UAC的限制,我們無法以一個高完整性的令牌來登陸遠程主機,因而pth攻擊并不會成功;而在域環境中,我們以管理員組身份遠程登陸時,將會得到一個高完整性的令牌,UAC對我們的行為并不加以限制。文章中也提到了解決問題的方法,通過設置LocalAccountTokenFilterPolicy的值為1來取消UAC的限制。這個鍵默認并不存在,需要在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System下手動創建。順便一提,UAC的設置就保存在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System中。通常我們要更改UAC設置并不需要直接修改注冊表,而是通過控制面板中的更改用戶賬戶控制設置來更改。下圖即為更改用戶賬戶控制設置:
可以看到有四個等級:最高一檔(始終通知)、第二檔、第三檔、最低一檔(從不通知)。不同的等級將會影響到注冊表中鍵的值:
回到正題。我們來驗證一下微軟的方案:
在注冊表中HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System下新建一個DWORDLocalAccountTokenFilterPolicy并將值設置為0
pass-the-hash
將LocalAccountTokenFilterPolicy值設置為1,重復攻擊過程
沒有問題,說明的確是由于令牌被UAC過濾掉導致無法遠程登陸。這里我想再介紹兩個概念:受限制的令牌和已過濾的管理員令牌。
受限制的令牌
受限制的令牌是通過windows的模仿機制創建的來源令牌的一份拷貝。至于什么是模仿這里暫且不表,感興趣的同學可以自行google。受限令牌的特征就是能夠作為復制品修改源令牌而不對源令牌造成影響。它的修改可以是如下:
從該令牌的特權數組中刪除一些特權
可以標記某些SID 為僅僅拒絕(deny-only)
可以將SID標記為受限制的(restricted)
第二點和第三點實際上是對特權做出了限制,但這樣的限制并不是直接將特權刪除,因為刪除特權可能會導致特權覆蓋,簡單來說就是此令牌不具有某些特權,但如果它的組SID被授予某些權限,那它也將具備這些權限。
已過濾的管理員令牌
UAC會使用受限制的令牌來創建已過濾的管理員令牌。一個已過濾的管理員令牌具有以下特性:
其完整性級別為“中”
管理員SID和管理員類的SID被標記為“僅僅拒絕”
除Change Notify、Shutdown、Undock、Increase Working Set和Time Zone外的特權都被移除
前面我們提到返回的令牌僅有一個“中等完整性”,是由于它是一個已過濾的管理員令牌。根據微軟在Vista以后的默認策略,持有此令牌的用戶將不得進行遠程管理。
總結
經過以上的分析,我們可以大概明白為什么pass-the-hash在不同環境下有著迥異的行為。說的淺一點,就是UAC在作祟;深入探討的話,則能通過pass-the-hash管窺Windows的龐大安全機制。
受限于篇幅及主題的限制,我無法將文章中某些出現的概念進行深入地介紹,希望本文能夠拋磚引玉,讓大家對Windows操作系統進行深入地研究與思考,看待某些安全問題時能夠有更新奇的理解。