標籤:

CVE-2017-8715分析:利用PS模塊清單文件繞過微軟安全補丁

最近,Matt Graeber(@mattifestation)和我一直在Device Guard環境中挖掘繞過用戶模式代碼完整性(UMCI)的方法。我們挖到的許多CVE都已經公布,微軟通過繼續改進用於Device Guard和AppLocker的主要PowerShell策略實施機制——約束語言模式(CLM),在減輕PowerShell對UMCI的攻擊面方面做了很不錯的工作。以下緩解措施大大減少了攻擊面,也就是CVE-2017-0218的修復結果。

絕大多數此類注入漏洞都會濫用微軟的已簽名的PowerShell腳本或包含運行未簽名代碼功能的模塊。這個範圍包括調用一個參數的Invoke-Expression到PowerShell的Add-Type cmdlet的自定義實現。微軟簽名的PowerShell代碼是有針對性的,因為允許微軟代碼執行的AppLocker或Device Guard策略將以完整語言模式執行 – 即對可執行的代碼沒有限制。

為了充分理解修補程序,讓我們來看看修補程序之前的行為。這個漏洞的關鍵點是攻擊者可以使用微軟簽名過的PowerShell腳本中的函數來繞過UMCI。為了演示這一點,我們來看一下腳本「utils_SetupEnv.ps1」,它是C:Windowsdiagnostics目錄中包含的Windows疑難解答包的一個組件。這個特殊的腳本有一個叫做「import-cs」的函數。這個函數只需要C#代碼並調用Add-Type就可以了(注意:Add-Type在約束語言模式下是阻止調用的)。由於該腳本是微軟簽名的,因此將以完整語言模式執行,允許攻擊者執行任意C#代碼。

正如你在上圖中看到的,我們導入了「utils_SetupEnv.ps1」,它暴露了「import-cs」函數給我們。使用這個函數,我們可以將我們自己的C#傳遞給系統進行執行,並繞過受限語言模式。上面的漏洞公布在了CVE-2017-0218並且已經修復。

為了應對上述漏洞,微軟在PowerShell的受限語言模式下運行時加了一些額外的限制。第一個是你不能再通過Import-Module或其他方式導入PowerShell腳本(.PS1s)。如果你嘗試在CLM中導入腳本,則會看到如下圖所示的內容:

一種可能的解決方法是將PowerShell腳本(.PS1)重命名為模塊文件(.PSM1)並以此方式導入。那麼,這是第二個需要修復的地方。

微軟對通過PowerShell模塊(.PSM1)導入和使用的內容做出了限制。這是通過「 Export-ModuleMember 」完成的。如果你對Export-ModuleMember不熟悉,則會定義在導入模塊後,哪些功能可以使用。在約束語言模式下,模塊的功能必須通過Export-ModuleMember導出才能使用。這大大減少了在微軟簽名過的PowerShell模塊中濫用函數調用的攻擊面。一般來說,明確定義要向用戶公開哪些模塊的功能也是一個很好的做法。

如果我們將「utils_SetupEnv.ps1」重命名為「utils_SetupEnv.psm1」,並嘗試導入它,它會顯示導入成功。你會注意到我們之前使用的「import-cs」函數不被識別。這是因為「import-cs」不是通過Export-ModuleMember公開的。

我們來看一個有效的PowerShell模塊文件,Export-ModuleMember定義將如下圖所示:

這實質上意味著當導入模塊時只能使用「Export-ODataEndpointP

roxy」。這嚴重限制了微軟簽名過的PowerShell腳本被濫用的可能性,這些腳本包含了可能被濫用然後運行未簽名代碼的功能,因為大部分功能都不會公開。同樣,PowerShell團隊正在緩慢而穩妥地緩解我們用來規避約束語言模式的許多旁繞過方式。

在review了這個修復之後,我發現並報告了Export-ModuleMember的一個方法,該方法被分配到了CVE-2017-8715,並在十月份的星期二補丁中發布。此繞過濫用了PowerShell模塊清單(.PSD1)。在研究這些文件的影響時,我意識到你可以通過這些文件來配置模塊行為,而且它們不受與許多其他PowerShell文件相同的簽名要求的限制(可能因為PSD1文件不包含可執行文件碼)。儘管如此,PSD1仍然可以簽名。

如果我們回頭看「utils_SetupEnv.ps1」腳本,「import-cs」函數將不再可用,因為該腳本中的任何函數都不會通過Export-ModuleMember公開。為了解決這個問題,我們可以將「utils_SetupEnv.ps1」重命名為「utils_SetupEnv.psm1」,這樣我們就可以導入它。這樣做後,我們可以刪除「utils_SetupEnv.psm1」的一個相應的模塊清單,然後我們導出精心構造的「import-cs」函數。這個模塊清單看起來像這樣:

正如你所看到的,我們已經將「import-cs」設置為一個函數,通過「FunctionsToExport」導出。這將像Export-ModuleMember那樣導出函數。由於PowerShell模塊清單文件不像其他PowerShell文件那樣受限於相同的代碼簽名要求,因此我們可以簡單地為我們想要濫用的微軟簽名過的腳本創建自己的文件。在刪除了「utils_SetupEnv」PowerShell模塊的上述清單後,儘管新引入了.PS1導入和導出模塊成員的修復補丁,但是我們現在依舊可以使用「import-cs」函數執行任意C#代碼。

如上所述,此繞過方式已發布在CVE-2017-8715。該修復方案涉及到PowerShell模塊清單文件(.PSD1s)要與模塊中的所有其他文件具有相同的代碼簽名的要求,即使某個模塊已經加了簽名並通過了Device Guard或AppLocker的策略,也要根據白名單規則判斷簽名,最終決定是否可以通過驗證。這樣做可以防止攻擊者修改現有的清單或使用他們自己的清單文件。

本文翻譯自:enigma0x3.net/2017/11/0 ,如若轉載,請註明原文地址: 4hou.com/vulnerable/872 更多內容請關注「嘶吼專業版」——Pro4hou

推薦閱讀:

安全認證代理的透明接入
黑產拿下萬台IoT設備許可權,用來群發垃圾郵件
使用超聲波「無聲」劫持語音助理系統:以Siri、Google Now為例
Github 安全軍火庫(二)

TAG:信息安全 |