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

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

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

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

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

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

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

3、使用VBScript腳本:

4、使用Jscript腳本:

“reg“和”regedit“都是微軟簽名的程序,都位于可信的目錄中,因此默認(rèn)情況下不會被AppLocker攔截:
如果這兩個程序被組策略所阻止,那么JScript以及VBScript應(yīng)該也能奏效。
此外我們還可以通過各種方法啟動控制面板:
1、運(yùn)行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并不難。首先,我們可以創(chuàng)建一個啟動命令提示符的DLL文件,當(dāng)然使用其他載荷也可以,為了演示方便,我們還是使用這種簡單示例。將DLL拷貝到某個可寫的目錄中,比如桌面或者臨時文件夾中,根據(jù)需要將其重命名為CPL文件,然后使用前文描述的方法將這個CPL的路徑寫入HKCU注冊表中,使用前面提到的任何一種方法啟動控制面板。這樣控制面板就會加載這個DLL文件,最終彈出一個命令提示符:

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

|