如何繞過AppLocker自定義規則
一、前言
在大型組織的安全領域中,AppLocker正在扮演越來越重要的角色。應用AppLocker規則可以顯著降低企業的安全風險。不幸的是,對於藍隊來說除了預設規則以外,AppLocker還涉及到許多自定義配置,而這些配置很有可能成為目標安全的突破口。現在已經有許多文章介紹瞭如何繞過AppLocker的預設規則,而本文將介紹繞過自定義規則的具體步驟,包括如何定位、解析自定義規則,以及如何利用這些資訊繞過自定義規則。
二、AppLocker自定義規則
AppLocker規則可以應用於目標應用,這些規則也是構成AppLocker策略的基本元件。接下來我們需要了解一下規則集合(Rule Collection)。
規則集合
AppLocker控制檯以規則集合作為組織單元,這些集合包括可執行檔案、指令碼、Windows安裝檔案、封裝的應用和應用安裝包以及DLL檔案。這些規則可以讓我們輕鬆區分開不同型別的應用。
規則條件
規則條件(Rule Condition)可以幫助AppLocker識別哪些應用對應哪些規則。三個主要的規則條件分別為應用釋出者(Publisher)、路徑(Path)以及檔案雜湊(File hash)。
型別
檔案路徑條件:以應用在系統中的路徑作為識別依據;檔案釋出者條件:以應用的屬性或者數字簽名作為識別依據;檔案雜湊條件:以應用的雜湊值作為識別依據。
AppLocker支援建立的不同條件如下圖所示:
三、具體操作
首先也是最關鍵的一個步驟就是知道當前系統部署了哪些AppLocker規則。大多數情況下,系統會強制部署預設規則,但這裡也可能存在一些自定義規則。AppLocker規則通常由GPO強制執行,我們可以查詢活動目錄(Active Directory)來獲取這些資訊。
幸運的是,Shell/">PowerShell中有個AppLocker模組,可以查詢當前系統已部署的AppLocker規則。如下一個PowerShell指令碼可以按照較清晰的格式輸出具體規則,我們可以根據這些資訊制定繞過策略。
Import-Module AppLocker [xml]$data = Get-AppLockerPolicy -effective -xml # Extracts All Rules and print them. Write-Output "[+] Printing Applocker Rules [+]`n" ($data.AppLockerPolicy.RuleCollection | ? { $_.EnforcementMode -match "Enabled" }) | ForEach-Object -Process { Write-Output ($_.FilePathRule | Where-Object {$_.Name -NotLike "(Default Rule)*"}) | ForEach-Object -Process {Write-Output "=== File Path Rule ===`n`n Rule Name : $($_.Name) `n Condition : $($_.Conditions.FilePathCondition.Path)`n Description: $($_.Description) `n Group/SID : $($_.UserOrGroupSid)`n`n"} Write-Output ($_.FileHashRule) | ForEach-Object -Process { Write-Output "=== File Hash Rule ===`n`n Rule Name : $($_.Name) `n File Name :$($_.Conditions.FileHashCondition.FileHash.SourceFileName) `n Hash type : $($_.Conditions.FileHashCondition.FileHash.Type) `n Hash :$($_.Conditions.FileHashCondition.FileHash.Data) `n Description: $($_.Description) `n Group/SID : $($_.UserOrGroupSid)`n`n"} Write-Output ($_.FilePublisherRule | Where-Object {$_.Name -NotLike "(Default Rule)*"}) | ForEach-Object -Process {Write-Output "=== File Publisher Rule ===`n`n Rule Name : $($_.Name) `n PublisherName : $($_.Conditions.FilePublisherCondition.PublisherName) `n ProductName : $($_.Conditions.FilePublisherCondition.ProductName) `n BinaryName : $($_.Conditions.FilePublisherCondition.BinaryName) `n BinaryVersion Min. : $($_.Conditions.FilePublisherCondition.BinaryVersionRange.LowSection) `n BinaryVersion Max. : $($_.Conditions.FilePublisherCondition.BinaryVersionRange.HighSection) `n Description: $($_.Description) `n Group/SID : $($_.UserOrGroupSid)`n`n"} }
該指令碼會嘗試查詢規則名稱不是 Default Rule
的所有AppLocker規則,然後輸出 FilePath
、 FilePublisher
以及 FileHash
規則。
比如,一個典型的輸出如下圖所示:
現在我們已經知道哪些是自定義規則,接下來可以嘗試如何繞過這些規則。
繞過檔案雜湊規則
這是一種我們可以輕鬆繞過並廣泛使用的規則。為了繞過檔案雜湊規則,我們需要能夠攻擊SHA256演算法的一種攻擊方式,因為這是AppLocker預設使用的雜湊演算法。濫用這種規則的唯一條件是找到已被允許的特定可執行檔案,這些可執行檔案可以用來載入任意程式碼(這種情況不是很常見)或者存在DLL劫持漏洞(這種情況比較常見)。
比如,Process Explorer中存在一個DLL劫持漏洞,我們可以濫用該漏洞來載入我們的惡意程式碼。
觀察 ProcExp.exe
的執行過程,我們可以看到程式嘗試載入名為 MPR.dll
的一個DLL檔案,如下圖所示:
系統中已有一個規則,允許Process Explorer執行,如下圖所示:
我自己構建了一個DLL檔案,其中匯出了Process Explorer所需的函式,程式中還包含一個函式可以執行 calc.exe
。
在實際攻擊場景中,作為攻擊載荷,這個DLL需要將自身注入到記憶體中,避免攻擊過程中有任何程式落盤。
只有DLL規則沒有部署時這種方法才能奏效,大多數情況下這個條件都可以滿足,因為啟用這些規則會降低系統的效能。
繞過檔案路徑規則
檔案路徑規則是我們最常見到的規則之一,也是繞過AppLocker的絕佳突破口。這種條件規則會根據應用在檔案系統或者網路中的路徑來識別應用,通常情況下,規則中會指定一個路徑或者檔案位置。比如,在測試環境中我建立了一個示例規則,允許執行 C:\Python27\
目錄中的所有可執行檔案,如下圖所示:
如果該規則指定的目錄可寫,我們就可以將自己的程式放在該目錄中,這樣就能繞過AppLocker。
繞過檔案釋出者規則
這個條件會根據應用的數字簽名以及擴充套件屬性(如果存在擴充套件屬性的話)來識別應用。數字簽名中包含創造該應用的公司(釋出者)資訊。可執行檔案、DLL、Windows安裝程式、封裝的應用以及應用安裝包同樣包含擴充套件屬性,可以從二進位制資源區中獲取這些屬性。對於可執行檔案、DLL以及Windows安裝包而言,這些屬性中包含檔案所對應的產品名稱、釋出者提供的原始檔名以及檔案版本號;對於封裝的應用及應用安裝包而言,這些擴充套件屬性包含應用包的名稱及版本。
這種規則條件是最為安全的條件,繞過手段非常有限。AppLocker會檢查簽名是否有效,因此我們無法使用不可信的證書來簽名攻擊程式。SpecterOps的Matt曾研究過如何在Windows系統上生成有效的簽名,不過這種方法需要管理員許可權,並且要求AppLocker在預設情況下允許管理員執行任何應用。
繞過這種規則的一種方法與前面介紹的雜湊規則繞過方法相同,那就是利用DLL劫持漏洞或者可以載入任意程式碼到記憶體中的已簽名的某個應用。比如,如果規則允許執行經過微軟簽名的所有程式,那麼我們就可以使用Process Explorer實施攻擊。Process Explorer是一個經過簽名的應用,並且存在DLL劫持漏洞,我們可以利用這一點來繞過AppLocker,具體方法請參考前文介紹的繞過檔案雜湊規則的過程。
四、總結
這是我在實際環境中使用過的一些實用技術,在這裡與整個社群一起分享。可能還有其他方法能夠繞過自定義規則,我希望本文能拋磚引玉,讓更多人能夠研究這方面技術。