一、前言
AppLocker(應用程序控制策略)已經成為限制Windows主機的事實上的標準。AppLocker是Windows 7及Windows Server 2008 R2開始引入的一項新功能,是軟件限制策略(Software Restriction Policies,SRP)的后繼者。管理員可以使用AppLocker允許特定用戶或用戶組運行特定程序,同時也可以拒絕訪問其他程序。
在本文中,我們將向讀者介紹一種通過修改注冊表鍵值以繞過AppLocker的簡單方法。
我們的目標是在默認安裝的Windows主機上,利用AppLocker默認規則中信任的任何程序運行任意代碼。同時我們不會使用某些常用的可疑程序來實現這一目標,如regsvr32、 rundll32、InstallUtil、regsvsc、regasm、powershell、powershell_ise以及cmd。
二、環境配置
Windows 10實驗主機上的AppLocker規則如下所示:

細心的讀者可能會注意到,我們可以使用幾種方法繞過上述規則。比如,某人可以在“ftp.exe”程序中,在任意命令前加上“!”符號,就可以執行任意命令,也可以將任何受限程序拷貝到“C:\Windows”目錄中的任何一個可寫目錄(如“C:\Windows\Task”,“授權用戶(Authenticated Users)”組的成員默認情況下都可以寫這些目錄)完成執行目的。這些AppLocker規則并不意味著系統對攻擊者來說是堅不可摧的,其目的在于確保攻擊者不能使用規則所禁止應用程序來繞過AppLocker。
此外,雖然上述策略是基于路徑條件的規則,但本文描述的方法也能繞過基于程序發布者(Publisher)以及文件哈希(File Hash)的AppLocker限制策略。
三、技術細節
這項技術最開始的出發點是基于CPL的繞過思路。CPL本質上就是.dll文件,這些文件的導出函數為CPIApplet回調函數。控制面板通過CPL將所有選項在同一個位置呈現給用戶。
我創建了一個dll文件,將其擴展名改為.cpl,雙擊該文件。這種方式與在命令行中運行“control.exe
”的效果一致,最終會執行MainDLL函數中的代碼。不幸的是,在我們的實驗環境中,這樣做會導致rundll32彈出AppLocker錯誤窗口:

然而,使用rundll32運行控制面板自帶的CPL卻是可行的。這樣我們就會有兩個疑問:
1、控制面板如何加載默認的CPL?
2、控制面板從何處獲取CPL列表?
第一個問題跟我們最終的目標關系不大,因為我們知道,在此時此刻,控制面板并沒有使用rundll32或者其他黑名單程序來加載默認的CPL。如果你想進一步了解這個問題,你可以在shell32.dll中找到COpenControlPanel COM對象(06622D85-6856-4460-8DE1-A81921B41C4B)的函數:

有趣的是,觀察control.exe程序的字符串,我們發現某些CPL(比如joy.cpl)仍然是通過rundll32啟動的。為了證實這一點,我們可以在控制面板中,點擊“設置USB游戲控制器(Set up USB game controllers)”,此時會再次彈出rundll32的AppLocker錯誤窗口。
接著看下一個問題,控制面板從何處獲取CPL列表?通過Procmon我們可以快速找到問題的答案:

注冊表中的“HKLM\Software\Microsoft\Windows\CurrentVersion\Control Panel\CPLs”包含一個CPL列表,這些CPL會在控制面板啟動時加載:

我們發現系統也會檢查HKCU中相同的路徑!默認情況下,每個用戶對他們自己的hive文件都具有寫權限。MSDN有一篇非常有趣的文章,其中介紹了如何注冊dll控制面板選項。我們只關心如何加載我們自己的CPL,因此文章介紹的第一個步驟就能滿足我們需求。
我們可以使用多種方法,來修改我們自己的注冊表:
1、使用“reg”命令:

2、使用“regedit”或者“regedt32”程序:

3、使用VBScript腳本:

4、使用Jscript腳本:

“reg“和”regedit“都是微軟簽名的程序,都位于可信的目錄中,因此默認情況下不會被AppLocker攔截:
如果這兩個程序被組策略所阻止,那么JScript以及VBScript應該也能奏效。
此外我們還可以通過各種方法啟動控制面板:
1、運行C:\windows\system32\control.exe
2、使用%APPDATA%\Microsoft\Windows\Start Menu\Programs\System Tools\Control Panel.lnk快捷方式
3、直接使用CLSID:
shell:::{5399E694-6CE5-4D6C-8FCE-1D8870FDCBA0}
shell:::{26EE0668-A00A-44D7-9371-BEB064C98683}
shell:::{ED7BA470-8E54-465E-825C-99712043E01C}
4、使用映射文件夾(Junction Folder):
My Control Panel.{ED7BA470-8E54-465E-825C-99712043E01C}
因此,繞過AppLocker并不難。首先,我們可以創建一個啟動命令提示符的DLL文件,當然使用其他載荷也可以,為了演示方便,我們還是使用這種簡單示例。將DLL拷貝到某個可寫的目錄中,比如桌面或者臨時文件夾中,根據需要將其重命名為CPL文件,然后使用前文描述的方法將這個CPL的路徑寫入HKCU注冊表中,使用前面提到的任何一種方法啟動控制面板。這樣控制面板就會加載這個DLL文件,最終彈出一個命令提示符:

四、總結
本文介紹的方法可能不是繞過AppLocker的最簡單或者最直接的方法,然而它的確提出了另一種可行的攻擊方法,攻擊者可以利用該方法在受限的計算機上運行任意代碼。
如果不考慮性能影響,我們可以在AppLocker屬性窗口的“Advanced“選項卡中,啟用”DLL Rule Collection“選項避免這種攻擊方式:

|