DLL劫持漏洞自動化識別工具Rattler檢測

seven878發表於2020-12-01

最近,來自SensePost的Chris Le Roy開源了一款工具:Rattler,可用來自動識別DLL是否存在預載入漏洞(也可以理解為DLL劫持漏洞,文中該名詞均採用DLL劫持漏洞)。雖然DLL劫持漏洞已不再是新技術,可追溯到2010年,但是我對自動化很是感興趣,於是對此做了進一步研究。

本文將理清DLL劫持漏洞原理,例項分析,測試自動化工具Rattler,分享心得,並測試一個存在該漏洞的軟體——Explorer Suite安裝包

IIS7網站監控可以及時防控網站風險,快速準確監控網站是否遭到各種劫持攻擊,網站在全國是否能正常開啟(檢視域名是否被牆),精準的DNS汙染檢測,具備網站開啟速度檢測功能,第一時間知道網站是否被黑、被入侵、被改標題、被掛黑鏈。精益求精的產品,缺陷為零資料提供!
它可以做到以下功能:1、檢測網站是否被黑2、檢測網站是否被劫持3、檢測域名是否被牆4、檢測DNS是否被汙染5、網站真實的完全開啟時間(獨家)6、擁有獨立監控後臺,24小時定時監控域名官方地址:官方圖:

 

注:

Explorer Suite安裝包內包含CFF Explorer,免費,常用來編輯PE檔案格式,最後更新於2012年11月18日,是比較小眾的一款工具。對於分析PE檔案格式,建議使用作者另一款更專業的工具:Cerbero Profiler

Chris Le Roy介紹Rattler的部落格地址:

https://sensepost.com/blog/2016/rattleridentifying-and-exploiting-dll-preloading-vulnerabilities/

Chris Le Roy在BSides Cape Town上也介紹了Rattler,簡介如下:

0x01 簡介DLL劫持漏洞根源

程式在呼叫DLL時未指明DLL的完整路徑

SafeDllSearchMode

WindowsXPSP2開始,SafeDllSearchMode預設開啟,SafeDllSearchMode的存在是為了阻止在XP時代存在的DLL劫持漏洞

注:

強制關閉SafeDllSearchMode的方法:建立登錄檔項HKEY_LOCAL_MACHINESystemCurrentControlSetControlSession ManagerSafeDllSearchMode值設為0

程式在呼叫DLL時,如果未指明DLL的完整路徑,那麼系統會按照一套固定的搜尋順序尋找DLL

如果SafeDllSearchMode開啟,程式會依次從以下位置查詢DLL檔案:

The directory from which the application loaded

The system directory

The 16-bit system directory

The Windows directory

The current directory

The directories that are listed in the PATH environment variable

如果關閉,則從以下位置查詢DLL檔案:

The directory from which the application loaded

The current directory

The system directory

The 16-bit system directory

The Windows directory

The directories that are listed in the PATH environment variable

詳細內容見:

(VS.85).aspx

KnownDLLs

登錄檔位置:

HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerKnownDLLs

KnownDLLs登錄檔項下包含一系列常見的系統dll,如usp10.dll、lpk.dll、shell32.dll、user32.dll

注:

如果建立登錄檔項HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerExcludeFromKnownDlls並指定具體dll名稱,可以使KnownDLLs列表中同名的dll保護失效修改後需要重啟才能生效

SafeDllSearchMode+KnownDLLs

二者結合可用來防範對系統dll的劫持

注:

系統dll是指排除ExcludeFromKnownDlls項後,KnownDLLs登錄檔項下包含的dll列表

如果呼叫的dll“不常見”,也就是並未出現在KnownDLLs的列表中,那麼無論SafeDllSearchMode是否開啟,dll搜尋的第一順序均為程式的當前目錄,這裡就存在一個DLL劫持漏洞:

在程式同級目錄下預先放置一個同名的dll,在程式啟動的過程中會優先載入,實現劫持

注:

這裡提到的DLL劫持漏洞微軟尚未給出直接的修復方法,個人認為原因有以下幾點:1. 這是開發者的失誤,換用絕對路徑就能避免這個問題2. 利用的前提是攻擊者已經能夠在同級目錄放置檔案,這代表系統已經被攻破3. 如果直接修復,或許會影響老版本程式,相容性不好

注:

該文章對理清上述順序起到很大幫助:

0x02 利用例項

接下來編寫一個存在DLL劫持漏洞的例項,演示如何利用

測試dll:

使用dll模板,具體程式碼略,載入成功後彈出計算器

測試程式的c++程式碼如下:

#include "stdafx.h"#include <windows.h> int main(){HMODULE hDllLib = LoadLibrary(_T("Kernel32.dll"));if (hDllLib){FARPROC fpFun = GetProcAddress(hDllLib, "GetVersion");DWORD dwVersion = (*fpFun)();DWORD dwWindowsMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion)));DWORD dwWindowsMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion)));printf("version:%d,%d n", dwWindowsMajorVersion, dwWindowsMinorVersion);FreeLibrary(hDllLib);}HMODULE hDllLib2 = LoadLibrary(_T("CRYPTSP.dll"));FreeLibrary(hDllLib2);return 0;}

程式透過LoadLibrary分別呼叫Kernel32.dll和CRYPTSP.dll

實際測試:

將測試dll重新命名為Kernel32.dll,並放於程式同級目錄下,

由於Kernel32.dll出現在KnownDLLs的列表中,所以在程式同級目錄下的Kernel32.dll並不會被載入

然後將測試dll重新命名為CRYPTSP.dll,並放於程式同級目錄下,

由於CRYPTSP.dll並未在KnownDLLs的列表中,所以在程式同級目錄下的CRYPTSP.dll被載入,成功彈出計算器

0x03 實際利用

本節透過例項介紹如何使用Process Monitor查詢程式中存在的DLL劫持漏洞,測試例項為Chris Le Roy在介紹Rattler的部落格中提到過的NDP461-KB3102438-Web.exe

部落格地址如下:

https://sensepost.com/blog/2016/rattleridentifying-and-exploiting-dll-preloading-vulnerabilities/

NDP461-KB3102438-Web.exe的下載地址:

使用Process Monitor做如下設定:

Include the following filters:Operation is CreateFileOperation is LoadImagePath contains .cplPath contains .dllPath contains .drvPath contains .exePath contains .ocxPath contains .scrPath contains .sysExclude the following filters:Process Name is procmon.exeProcess Name is Procmon64.exeProcess Name is SystemOperation begins with IRP_MJ_Operation begins with FASTIO_Result is SUCCESSPath ends with pagefile.sys

參考地址:

注:

設定Exclude Result is SUCCESS後會只顯示NAME NOT FOUND項,也就是隻檢視未成功載入的dll項,即KnownDLLs的列表中不包含的dll名稱,可用於查詢存在漏洞的dll路徑

 

啟動NDP461-KB3102438-Web.exe後,檢視Process Monitor,

可以看到NDP461-KB3102438-Web.exe在啟動的過程中會載入CRYPTSP.dll,同時顯示NAME NOT FOUND,表示無法找到該檔案,載入失敗

現在將測試dll重新命名為CRYPTSP.dll,並放於NDP461-KB3102438-Web.exe的同級目錄下

開啟Process Monitor,設定Filter,去掉Exclude Result is SUCCESS項,再次啟動NDP461-KB3102438-Web.exe並記錄

顯示C:testCRYPTSP.dll已被成功載入,Result為Success,DLL劫持成功

 

程式在執行過程中成功彈出計算器

 

0x04 程式自動化實現

透過Process Monitor檢視DLL劫持漏洞是比較直接的方法,但是對於較大的程式,載入的DLL數目很多,手動查詢很不現實,費事費力,所以如果能夠透過程式實現上述過程,自動查詢並利用,就可以大大提高效率,這就是Rattler所解決的問題

專案地址:

思路:

· 

列舉程式呼叫的dll列表,解析出dll的名稱

· 

· 

將測試dll分別重新命名為列表中的dll名稱

· 

· 

再次啟動程式,檢測是否成功建立程式calc.exe,如果成功,代表存在漏洞,否則不存在

· 

實際測試:

使用Visual Studio編譯Rattler

payload.dll放於同級目錄下

payload.dll下載地址:

/releases/download/v1.0/payload.dll

管理員許可權的cmd下執行命令:

Rattler.exe NDP461-KB3102438-Web.exe 1

注:

因為NDP461-KB3102438-Web.exe需要管理員許可權執行,所以cmd也需要管理員許可權

自動找到存在預載入漏洞的dll列表

 

注:

在反覆啟動程式的過程中,calc.exe沒有正常被關閉,所以得出的結果要多於實際結果

補充:

下載的NDP461-KB3102438-Web.exe通常位於Downloads資料夾下,所以只要在該目錄預先放置CRYPTSP.dll,那麼在使用者下載執行NDP461-KB3102438-Web.exe的過程中,就能夠實現載入CRYPTSP.dll

同時,安裝NDP461-KB3102438-Web.exe需要管理員許可權,那麼此時CRYPTSP.dll也獲得了管理員許可權

0x05 驗證測試

掌握該方法後,測試其他程式,例如CFF Explorer的安裝包Explorer Suite

下載地址:

同樣藉助Process Monitor檢視CFF Explorer的安裝包ExplorerSuite.exe在啟動過程中的操作

找到ExplorerSuite.exe在啟動過程中載入的dll列表

 

經實際測試,將payload.dll重新命名為apphelp.dll或者dwmapi.dll均能夠觸發payload,彈出計算器

自動化程式測試:

得出存在劫持漏洞的dll列表

 

注:

在反覆啟動程式的過程中,calc.exe正常被關閉,所以得出的結果準確

0x06 防禦1、開發者需要注意的問題:

· 

呼叫第三方DLL時,使用LoadLibrary API載入DLL時使用絕對路徑,類似的情況還包括其他API如LoadLibraryEx, CreateProcess, ShellExecute等,將所有需要使用到的DLL放在應用程式所在的目錄,不放到系統目錄或者其他目錄

· 

· 

呼叫系統DLL時,使用絕對路徑

· 

· 

程式啟動時呼叫API SetDllDirectory(L”“)將當前目錄從DLL載入順序中移除

· 

補充:

Windows 7的KB2533623補丁開始,微軟更新了三個解決DLL劫持問題的新API:SetDefaultDllDirectories,AddDllDirectory,RemoveDllDirectory這幾個API配合使用,可以有效的規避DLL劫持問題

但是這些API只能在打了KB2533623補丁的Windows7和Server2008上使用

詳情見:

2、使用者需要注意的問題:

· 

留意瀏覽器下載目錄下是否有可疑dll,防止其劫持下載的安裝程式

· 

· 

對於“不可信”的程式,建議使用Process Monitor或者Rattler檢查是否存在DLL劫持漏洞

· 

0x07 小結

我在對DLL劫持漏洞原理的研究過程中,走了一小段彎路,某些資料提到

如果程式嘗試載入的DLL並不存在,那麼程式仍然會嘗試去當前目錄載入這個DLL,這是SafeDllSearchMode所無法防範的。

這讓我產生了如下疑問:

1. 

這裡提到的“並不存在的DLL”究竟是指哪些dll?系統不存在的dll?但CRYPTSP.dll卻是系統預設的包含的dll

2. 

3. 

“SafeDllSearchMode所無法防範的”DLL劫持到底是指什麼?難道DLL劫持還有多種?有幾種?

4. 

好在最終解決了這些問題,希望本文也能幫助有同樣疑惑的人

利用DLL劫持漏洞自動化識別工具Rattler對常用工具進行測試,能很快找出存在的漏洞位置,高效,方便,值得測試使用

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69989477/viewspace-2738609/,如需轉載,請註明出處,否則將追究法律責任。

相關文章