無論是通過鎖定設置,阻止應用程序,禁用Windows服務,确保用戶權限保持在最低限度等等,安全機器始終是持續進行的過程。如果我們不這樣做,那麼用戶最終會安裝非标準的軟件,對系統進行更改,一旦遭到入侵就會造成更多的破壞等等。這篇文章是關于通過使用dll劫持漏洞導緻特權提升的文件夾權限的弱點在Windows服務中。
什麼是DLL劫持?幾年前,有相當多的炒作能夠從當前工作目錄遠程或本地加載惡意DLL。微軟文章[1]清楚地解釋了它
“當應用程序動态加載動态鍊接庫而未指定完全限定的路徑名時,Windows會嘗試通過以特定順序搜索定義明确的目錄集來查找DLL。如果攻擊者獲得了對DLL搜索路徑上某個目錄的控制權,它可以在該目錄中放置DLL的惡意副本。這有時稱為DLL預加載攻擊或二元種植攻擊。如果系統在搜索受損目錄之前未找到合法的DLL副本,則會加載惡意DLL。如果應用程序以管理員權限運行,則攻擊者可能會在本地權限提升中取得成功。“
因此,如果應用程序僅通過名稱加載DLL,則會通過下面的搜索順序(32位操作系統)來查找庫
加載應用程序的目錄
32位系統目錄(C:\ Windows \ System32)
16位系統目錄(C:\ Windows \ System)
Windows目錄(C:\ Windows)
當前工作目錄(CWD)
PATH環境變量中的目錄(系統然後是用戶)
這裡的目标是在機器上獲得本地管理權限。為了達到這個目的,我們需要三件事來完成這項工作
Windows DLL搜索順序
DLL劫持漏洞
弱文件夾權限
在Windows DLL搜索順序中,路徑環境變量的目錄是以系統變量路徑和用戶變量路徑開始的最後一次搜索。除非應用程序沒有為其DLL使用完全限定的路徑名,否則即使使用了某些緩解措施,它也會嘗試通過搜索順序查找DLL。
DLL劫持漏洞找到DLL劫持漏洞的快速方法是啟動Process Monitor,設置相關的過濾并執行一些操作。在這裡,我們将利用Windows服務作為運行在SYSTEM特權上的大量服務,隻需停止并啟動服務并觀察搜索模式即可。請記住,在SYSTEM下運行的服務不會搜索用戶路徑環境。在停止并啟動服務後,發現了一些漏洞。
現在檢查注冊表以查看是否有任何服務dll被服務加載
我們可以将這些文件(svchost.exe和IKEEXT.DLL)複制到另一台機器上進行我們的靜态分析。在IDA中加載後,隻需搜索loadlibrary并跳轉到調用将顯示要加載的庫。如果沒有指定完全合格的路徑,那麼我們可能會很幸運。這裡在IKEEXT.DLL LoadLibraryW将嘗試加載“wlbsctrl.dll”
注意:并不總是像本例那樣直截了當,因為被調用的dll可能使用完全限定的路徑名,但在編譯時與另一個dll鍊接,該dll将嘗試在加載時加載此文件,這可能會因為在另一個文件夾或不可用。
最後,我們在系統上搜索庫wlbsctrl.dll,看看它是否存在,如果有,請注意它的位置。
C:\> dir wlbsctrl.dll / s
在這種情況下,系統中不存在wlbsctrl.dll,因此它将通過整個搜索順序。
弱文件夾權限現在最重要的部分是“弱文件夾權限”。在根中創建新文件夾時,默認情況下它是可寫入所有經過身份驗證的用戶的。在“NT AUTHORITY \ Authenticated用戶:(I)(M)”被添加到其中M代表修改權限的文件夾。因此,任何安裝在根上的應用程序都可能被非管理員用戶篡改。如果二進制文件從此文件夾加載SYSTEM權限,則可能隻是用您自己的二進制替換二進制文件。
當應用程序安裝在根中并将其路徑添加到系統路徑環境時,它會變得很有趣。這現在為大量可能有DLL劫持漏洞的應用程序打開了攻擊面。一種情況是軟件被推到機器上,例如Marimba,Landesk等,它們使用運行系統特權的Windows服務來安裝軟件。由于它運行的系統權限軟件被推送到諸如Perl,Python或Ruby之類的機器上,因此如果已經在軟件包中設置了路徑,并且默認情況下在根上安裝了路徑,它将添加到系統路徑環境中。或者它可能是一個IT支持人員安裝該軟件與他們的管理員權限的用戶。如果用戶使用非管理員權限手動安裝(如果可能),則可能會将其添加到用戶路徑環境中,然後将無法進行利用。我們可以使用icacls.exe來檢查文件夾或文件夾屬性安全選項卡的權限。
打開盒子
從我們以前的部分我們現在知道的是
服務“IKE和AuthIP IPsec鍵控模塊”加載服務DLL IKEEXT.DLL
IKEEXT.DLL将嘗試加載wlbsctrl.dll
OS攜帶其搜索順序來查找wlbsctrl.dll
我們有一個可寫文件夾C:\ Ruby200 \ bin,它位于搜索順序中
我們現在要做的就是将我們的惡意制作的DLL wlbsctrl.dll放到C:\ Ruby200 \ bin中,重啟機器,它将在SYSTEM權限下執行它的操作。請求Ruby,Perl等的用戶可能是開發人員,并且無論如何都擁有權限,但是可能有其他軟件安裝在根目錄中并添加到有限用戶可能利用的系統路徑中,并且這需要我們進行評估和在部署之前進行任何更改。
測試文件夾路徑我編寫了一個簡單的PowerShell腳本,您可以從這裡下載這些腳本,以便快速檢查易受攻擊的路徑文件夾。系統路徑環境變量首先是用戶路徑環境變量。在管理員或非管理員用戶的中等完整shell中運行它會得到相同的結果。
易受攻擊的Windows服務
以下是Windows服務,這些服務被發現存在漏洞,可以在Windows 7(32/64)上被利用,
IKE和AuthIP IPsec鍵控模塊(IKEEXT) - wlbsctrl.dll
Windows媒體中心接收器服務(ehRecvr) - ehETW.dll
Windows媒體中心計劃程序服務(ehSched) - ehETW.dll
Windows媒體中心服務啟動類型設置為手動且狀态未啟動,并且隻會給我們提供網絡服務權限,因此我無法看到它對于使用其特權有限的情況非常有用。但它可以通過某些計劃任務暫時啟動。
schtasks.exe / run / I / TN“\ Microsoft \ Windows \ Media Center \ mcupdate”
schtasks.exe / run / I / TN“\ Microsoft \ Windows \ Media Center \ MediaCenterRecoveryTask”
schtasks.exe / run / I / \ Microsoft \ Windows \ Media Center \ ActivateWindowsSearch“
對Windows XP的快速檢查表明,這些服務非常脆弱
自動更新(wuauserv) - ifsproxy.dll
遠程桌面幫助會話管理器(RDSessMgr) - SalemHook.dll
遠程訪問連接管理器(RasMan) - ipbootp.dll
Windows管理規範(winmgmt) - wbemcore.dll
其他可能安裝的服務也很脆弱
音頻服務(STacSV) - SFFXComm.dll SFCOM.DLL
英特爾(R)快速存儲技術(IAStorDataMgrSvc) - DriverSim.dll
Juniper統一網絡服務(JuniperAccessService) - dsLogService.dll
Encase企業代理 - SDDisk.dll
在Windows 8操作系統(64)的幹淨默認安裝中找不到任何dll劫持漏洞,這是開始遷移到Windows 8的另一個很好的理由。
緩解有許多緩解措施可以用來防止利用某些API,更改注冊表設置,應用更新等來利用此漏洞。它開始讓我們感到困惑,因為我們希望緩解這種情況,所以希望本節能夠使它變得有點清晰。
CWDIllegalInDllSearch此更新[2]當時引入了一個新的注冊表項CWDIllegalInDllSearch,它允許用戶控制DLL搜索路徑算法。在完全打過補丁的Windows 7計算機上進行測試,此更新不再需要,因此它可能稍後會包含在某些安全更新中。一旦該補丁安裝(如果适用),您将需要添加DWORD名稱CWDIllegalInDllSearch與注冊表項位置中的值
[HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Session Manager]
值數據可以是1,2或ffffffff。如果值名稱CWDIllegalInDllSearch不存在或值數據為0,則機器仍然易受CWD攻擊。請注意,值ffffffff可能會破壞某些應用程序。搜索順序是相同的,但是這次如果惡意DLL位于當前工作目錄中,庫未加載。
加載應用程序的目錄
32位系統目錄(C:\ Windows \ System32)
16位系統目錄(C:\ Windows \ System)
Windows目錄(C:\ Windows)
當前工作目錄(CWD)[dlls not loaded]
PATH環境變量中的目錄(系統然後是用戶)
以前我對CWDIllegalInDllSearch值進行了測試,您可以在我早期的博客文章中查看結果。
SetDllDirectory在加載DLL時,此函數[3]從搜索順序中删除當前工作目錄(CWD)。例如,調用SetDllDirectory(“C:\\ program files \\ MyApp \\”)後的DLL搜索順序變為:
加載應用程序的目錄
C:\ program files \ MyApp \ [新增]
32位系統目錄(C:\ Windows \ System32)
16位系統目錄(C:\ Windows \ System)
Windows目錄(C:\ Windows)
當前工作目錄(CWD)[删除]
PATH環境變量中的目錄(系統然後是用戶)
将空字符串傳遞給SetDllDirectory(“”),将從搜索順序中删除當前工作目錄(CWD)
加載應用程序的目錄
32位系統目錄(C:\ Windows \ System32)
16位系統目錄(C:\ Windows \ System)
Windows目錄(C:\ Windows)
當前工作目錄(CWD)[删除]
PATH環境變量中的目錄(系統然後是用戶)
如果此參數為NULL,則該函數将恢複默認搜索順序。
SafeDllSearchMode安全DLL搜索模式[4]默認啟用。要禁用此功能,我們可以創建一個值為0的DWORD名稱SafeDllSearchMode
[HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Session Manager]
如果啟用SafeDllSearchMode,則搜索順序如下所示:
加載應用程序的目錄
32位系統目錄(C:\ Windows \ System32)
16位系統目錄(C:\ Windows \ System)
Windows目錄(C:\ Windows)
當前工作目錄(CWD)
PATH環境變量中的目錄(系統然後是用戶)
如果SafeDllSearchMode被禁用,搜索順序如下:
加載應用程序的目錄
當前工作目錄(CWD)[向上移動列表]
32位系統目錄(C:\ Windows \ System32)
16位系統目錄(C:\ Windows \ System)
Windows目錄(C:\ Windows)
PATH環境變量中的目錄(系統然後是用戶)
調用SetDllDirectory(“”)或SetDllDirectory(“C:\\ program files \\ MyApp \\”)會禁用SafeDllSearchMode,并使用SetDllDirectory描述的搜索順序。
LoadLibraryEx函數[5]采用另一個參數,其中可以設置一個标志來更改搜索順序,但我沒有輪到測試它。
開發人員的緩解措施對于軟件開發人員來說,他們可以采取許多措施
使用SetEnvironmentVariable(TEXT(“PATH”),NULL)從其搜索順序中删除路徑環境變量的API
将默認安裝文件夾更改為C:\ Program Files
加載DLL時使用完全限定路徑,即LoadLibrary(“C:\\ program files \\ MyApp \\ mylibrary.dll”);
使用SetDllDirectory(“”)API從搜索順序中删除當前工作目錄
對于IT支持專業人員,還有一些可采取的措施
通過部署工具(如Marimba,Landesk等)打包和部署軟件或手動安裝軟件時,将安裝文件夾更改為C:\ Program Files
如果軟件需要安裝在根檢查上,則沒有需要SYSTEM權限的二進制文件
如果需要SYSTEM權限,則更改該文件夾的ACL
如果不需要,請從SYSTEM路徑變量中删除路徑條目
這篇文章向我們展示了如何輕松提升特權。最終,解決方案很簡單,隻需确保所有軟件都安裝在C:\ Program Files文件夾中,然後固有文件夾就會更安全。惡意軟件可以充分利用這一弱點,不僅可以獲得系統權限,而且還可以自動加載惡意軟件,從而更難确定其自動啟動入口點。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!